/ Hex Artifact Content
Login

Artifact 91f30204f91fc5ca5a1b7ecc78cf93a2ba15f915598da534bfab31be6f6c5c69:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 74  esult row with t
2400: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 68 65 6c  he result.** hel
2410: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 65  d in register re
2420: 67 52 65 73 75 6c 74 2e 20 20 44 65 63 72 65 6d  gResult.  Decrem
2430: 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74 20 63  ent the result c
2440: 6f 75 6e 74 20 61 6e 64 20 68 61 6c 74 20 69 66  ount and halt if
2450: 0a 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  .** the maximum 
2460: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
2470: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
2480: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
2490: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
24a0: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24b0: 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 52 65  be *v, int regRe
24c0: 73 75 6c 74 29 7b 0a 20 20 69 6e 74 20 61 64 64  sult){.  int add
24d0: 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  r;.  sqlite3Vdbe
24e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
24f0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
2500: 74 2c 20 31 29 3b 0a 20 20 61 64 64 72 20 3d 20  t, 1);.  addr = 
2510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2520: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  3(v, OP_IfPos, 1
2530: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
2540: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 31  rentAddr(v)+2, 1
2550: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
2560: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
2570: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2580: 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 72  Halt, 0, 0);.  r
2590: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
25a0: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70  *.** Process a p
25b0: 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  ragma statement.
25c0: 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73    .**.** Pragmas
25d0: 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72   are of this for
25e0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52  m:.**.**      PR
25f0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 64  AGMA [schema.]id
2600: 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a   [= value].**.**
2610: 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   The identifier 
2620: 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
2630: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c  string.  The val
2640: 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  ue is a string, 
2650: 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  and.** identifie
2660: 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20  r, or a number. 
2670: 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73   If minusFlag is
2680: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
2690: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75  value is.** a nu
26a0: 6d 62 65 72 20 74 68 61 74 20 77 61 73 20 70 72  mber that was pr
26b0: 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75  eceded by a minu
26c0: 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  s sign..**.** If
26d0: 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 20 69   the left side i
26e0: 73 20 22 64 61 74 61 62 61 73 65 2e 69 64 22 20  s "database.id" 
26f0: 74 68 65 6e 20 70 49 64 31 20 69 73 20 74 68 65  then pId1 is the
2700: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
2710: 2a 20 61 6e 64 20 70 49 64 32 20 69 73 20 74 68  * and pId2 is th
2720: 65 20 69 64 2e 20 20 49 66 20 74 68 65 20 6c 65  e id.  If the le
2730: 66 74 20 73 69 64 65 20 69 73 20 6a 75 73 74 20  ft side is just 
2740: 22 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69  "id" then pId1 i
2750: 73 20 74 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20  s the.** id and 
2760: 70 49 64 32 20 69 73 20 61 6e 79 20 65 6d 70 74  pId2 is any empt
2770: 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  y string..*/.voi
2780: 64 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28  d sqlite3Pragma(
2790: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27a0: 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31  , .  Token *pId1
27b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ,        /* Firs
27c0: 74 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  t part of [schem
27d0: 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20  a.]id field */. 
27e0: 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c 20 20 20   Token *pId2,   
27f0: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
2800: 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d  art of [schema.]
2810: 69 64 20 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c  id field, or NUL
2820: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56  L */.  Token *pV
2830: 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f  alue,      /* To
2840: 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c  ken for <value>,
2850: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
2860: 74 20 6d 69 6e 75 73 46 6c 61 67 20 20 20 20 20  t minusFlag     
2870: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 27    /* True if a '
2880: 2d 27 20 73 69 67 6e 20 70 72 65 63 65 64 65 64  -' sign preceded
2890: 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20   <value> */.){. 
28a0: 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30   char *zLeft = 0
28b0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  ;       /* Nul-t
28c0: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
28d0: 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20  string <id> */. 
28e0: 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20   char *zRight = 
28f0: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  0;      /* Nul-t
2900: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
2910: 73 74 72 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20  string <value>, 
2920: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
2930: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
2940: 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
2950: 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f  ase name */.  To
2960: 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20 20 20 20  ken *pId;       
2970: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2980: 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f  to <id> token */
2990: 0a 20 20 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b  .  char *aFcntl[
29a0: 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 67  4];       /* Arg
29b0: 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f  ument to SQLITE_
29c0: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a  FCNTL_PRAGMA */.
29d0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
29e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
29f0: 62 61 73 65 20 69 6e 64 65 78 20 66 6f 72 20 3c  base index for <
2a00: 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a 20 20 69  database> */.  i
2a10: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
2a30: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 6d  eturn value form
2a40: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
2a50: 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c 69 74 65  AGMA */.  sqlite
2a60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2a70: 64 62 3b 20 20 20 20 2f 2a 20 54 68 65 20 64 61  db;    /* The da
2a80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a90: 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20  n */.  Db *pDb; 
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
2ac0: 66 69 63 20 64 61 74 61 62 61 73 65 20 62 65 69  fic database bei
2ad0: 6e 67 20 70 72 61 67 6d 61 65 64 20 2a 2f 0a 20  ng pragmaed */. 
2ae0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
2af0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2b00: 29 3b 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20  );  /* Prepared 
2b10: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
2b20: 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
2b30: 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f 2a 20 54  *pPragma;   /* T
2b40: 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 0a 20 20  he pragma */..  
2b50: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
2b60: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
2b70: 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76 29 3b 0a  RunOnlyOnce(v);.
2b80: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
2b90: 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 70   2;..  /* Interp
2ba0: 72 65 74 20 74 68 65 20 5b 73 63 68 65 6d 61 2e  ret the [schema.
2bb0: 5d 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72  ] part of the pr
2bc0: 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20  agma statement. 
2bd0: 69 44 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20  iDb is the.  ** 
2be0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
2bf0: 61 62 61 73 65 20 74 68 69 73 20 70 72 61 67 6d  abase this pragm
2c00: 61 20 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69  a is being appli
2c10: 65 64 20 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b  ed to in db.aDb[
2c20: 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  ]. */.  iDb = sq
2c30: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
2c40: 28 70 50 61 72 73 65 2c 20 70 49 64 31 2c 20 70  (pParse, pId1, p
2c50: 49 64 32 2c 20 26 70 49 64 29 3b 0a 20 20 69 66  Id2, &pId);.  if
2c60: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
2c70: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
2c80: 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 49  Db[iDb];..  /* I
2c90: 66 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  f the temp datab
2ca0: 61 73 65 20 68 61 73 20 62 65 65 6e 20 65 78 70  ase has been exp
2cb0: 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64 20 61 73  licitly named as
2cc0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 0a 20 20   part of the .  
2cd0: 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61 6b 65 20  ** pragma, make 
2ce0: 73 75 72 65 20 69 74 20 69 73 20 6f 70 65 6e 2e  sure it is open.
2cf0: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62   .  */.  if( iDb
2d00: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 4f 70  ==1 && sqlite3Op
2d10: 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
2d20: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
2d30: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 4c 65  turn;.  }..  zLe
2d40: 66 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ft = sqlite3Name
2d50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 49  FromToken(db, pI
2d60: 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c 65 66 74  d);.  if( !zLeft
2d70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2d80: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
2d90: 20 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74    zRight = sqlit
2da0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d  e3MPrintf(db, "-
2db0: 25 54 22 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  %T", pValue);.  
2dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68  }else{.    zRigh
2dd0: 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  t = sqlite3NameF
2de0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 56 61  romToken(db, pVa
2df0: 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  lue);.  }..  ass
2e00: 65 72 74 28 20 70 49 64 32 20 29 3b 0a 20 20 7a  ert( pId2 );.  z
2e10: 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e 30 20 3f  Db = pId2->n>0 ?
2e20: 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a   pDb->zDbSName :
2e30: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
2e40: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
2e50: 65 2c 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e, SQLITE_PRAGMA
2e60: 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 2c  , zLeft, zRight,
2e70: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 67 6f 74   zDb) ){.    got
2e80: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
2e90: 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20 61 6e 20  }..  /* Send an 
2ea0: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
2eb0: 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GMA file-control
2ec0: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
2ed0: 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e  ng VFS.  ** conn
2ee0: 65 63 74 69 6f 6e 2e 20 20 49 66 20 69 74 20 72  ection.  If it r
2ef0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2f00: 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68  , then assume th
2f10: 61 74 20 74 68 65 20 56 46 53 0a 20 20 2a 2a 20  at the VFS.  ** 
2f20: 68 61 6e 64 6c 65 64 20 74 68 65 20 70 72 61 67  handled the prag
2f30: 6d 61 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ma and generate 
2f40: 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61 72 65 64  a no-op prepared
2f50: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a   statement..  **
2f60: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
2f70: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32 32 33 38  TION-OF: R-12238
2f80: 2d 35 35 31 32 30 20 57 68 65 6e 65 76 65 72 20  -55120 Whenever 
2f90: 61 20 50 52 41 47 4d 41 20 73 74 61 74 65 6d 65  a PRAGMA stateme
2fa0: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 0a 20 20  nt is parsed,.  
2fb0: 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e  ** an SQLITE_FCN
2fc0: 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c 65 20 63  TL_PRAGMA file c
2fd0: 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e 74 20 74  ontrol is sent t
2fe0: 6f 20 74 68 65 20 6f 70 65 6e 20 73 71 6c 69 74  o the open sqlit
2ff0: 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a  e3_file.  ** obj
3000: 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
3010: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
3020: 65 20 66 69 6c 65 20 74 6f 20 77 68 69 63 68 20  e file to which 
3030: 74 68 65 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20  the pragma.  ** 
3040: 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 73  statement refers
3050: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
3060: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
3070: 2d 32 39 38 37 35 2d 33 31 36 37 38 20 54 68 65  -29875-31678 The
3080: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3090: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
30a0: 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c 65 20 63  AGMA.  ** file c
30b0: 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20 61 72 72  ontrol is an arr
30c0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
30d0: 6f 20 73 74 72 69 6e 67 73 20 28 63 68 61 72 2a  o strings (char*
30e0: 2a 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a  *) in which the.
30f0: 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d    ** second elem
3100: 65 6e 74 20 6f 66 20 74 68 65 20 61 72 72 61 79  ent of the array
3110: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
3120: 74 68 65 20 70 72 61 67 6d 61 20 61 6e 64 20 74  the pragma and t
3130: 68 65 20 74 68 69 72 64 0a 20 20 2a 2a 20 65 6c  he third.  ** el
3140: 65 6d 65 6e 74 20 69 73 20 74 68 65 20 61 72 67  ement is the arg
3150: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 61  ument to the pra
3160: 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  gma or NULL if t
3170: 68 65 20 70 72 61 67 6d 61 20 68 61 73 20 6e 6f  he pragma has no
3180: 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  .  ** argument..
3190: 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d    */.  aFcntl[0]
31a0: 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31   = 0;.  aFcntl[1
31b0: 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63  ] = zLeft;.  aFc
31c0: 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b  ntl[2] = zRight;
31d0: 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30  .  aFcntl[3] = 0
31e0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
31f0: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
3200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
3210: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
3220: 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
3230: 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29  _PRAGMA, (void*)
3240: 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72  aFcntl);.  if( r
3250: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3270: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b  etNumCols(v, 1);
3280: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3290: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c  SetColName(v, 0,
32a0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61   COLNAME_NAME, a
32b0: 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c 49 54 45  Fcntl[0], SQLITE
32c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
32d0: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
32e0: 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b  t(v, aFcntl[0]);
32f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
3300: 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20  e(aFcntl[0]);.  
3310: 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75    goto pragma_ou
3320: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  t;.  }.  if( rc!
3330: 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
3340: 20 29 7b 0a 20 20 20 20 69 66 28 20 61 46 63 6e   ){.    if( aFcn
3350: 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  tl[0] ){.      s
3360: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3370: 50 61 72 73 65 2c 20 22 25 73 22 2c 20 61 46 63  Parse, "%s", aFc
3380: 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73  ntl[0]);.      s
3390: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e  qlite3_free(aFcn
33a0: 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  tl[0]);.    }.  
33b0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
33c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
33d0: 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20   = rc;.    goto 
33e0: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a  pragma_out;.  }.
33f0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
3400: 20 70 72 61 67 6d 61 20 69 6e 20 74 68 65 20 6c   pragma in the l
3410: 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a 2f 0a 20  ookup table */. 
3420: 20 70 50 72 61 67 6d 61 20 3d 20 70 72 61 67 6d   pPragma = pragm
3430: 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74 29 3b 0a  aLocate(zLeft);.
3440: 20 20 69 66 28 20 70 50 72 61 67 6d 61 3d 3d 30    if( pPragma==0
3450: 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f   ) goto pragma_o
3460: 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ut;..  /* Make s
3470: 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
3480: 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65   schema is loade
3490: 64 20 69 66 20 74 68 65 20 70 72 61 67 6d 61 20  d if the pragma 
34a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 2a 2f  requires that */
34b0: 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d  .  if( (pPragma-
34c0: 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
34d0: 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d 61 29 21  Flg_NeedSchema)!
34e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
34f0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
3500: 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70  pParse) ) goto p
3510: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  ragma_out;.  }..
3520: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
3530: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
3540: 6e 61 6d 65 73 20 66 6f 72 20 70 72 61 67 6d 61  names for pragma
3550: 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 72 65  s that return re
3560: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66 28 20 28  sults */.  if( (
3570: 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
3580: 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f  g & PragFlg_NoCo
3590: 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20 20 26 26  lumns)==0 .   &&
35a0: 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61   ((pPragma->mPra
35b0: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
35c0: 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c  oColumns1)==0 ||
35d0: 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20 20 29 7b   zRight==0).  ){
35e0: 0a 20 20 20 20 73 65 74 50 72 61 67 6d 61 52 65  .    setPragmaRe
35f0: 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  sultColumnNames(
3600: 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d  v, pPragma);.  }
3610: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
3620: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
3630: 72 61 67 6d 61 20 68 61 6e 64 6c 65 72 20 2a 2f  ragma handler */
3640: 0a 20 20 73 77 69 74 63 68 28 20 70 50 72 61 67  .  switch( pPrag
3650: 6d 61 2d 3e 65 50 72 61 67 54 79 70 20 29 7b 0a  ma->ePragTyp ){.
3660: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
3670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
3680: 52 5f 50 52 41 47 4d 41 53 29 20 26 26 20 21 64  R_PRAGMAS) && !d
3690: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
36a0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20  IT_DEPRECATED). 
36b0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
36c0: 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c   [schema.]defaul
36d0: 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a  t_cache_size.  *
36e0: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
36f0: 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65  a.]default_cache
3700: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
3710: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
3720: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
3730: 72 65 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20  rent persistent 
3740: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
3750: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
3760: 73 69 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65  size.  The value
3770: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
3780: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
3790: 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e  of.  ** pages in
37a0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
37b0: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
37c0: 6d 20 73 65 74 73 20 62 6f 74 68 20 74 68 65 20  m sets both the 
37d0: 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67  current.  ** pag
37e0: 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
37f0: 75 65 20 61 6e 64 20 74 68 65 20 70 65 72 73 69  ue and the persi
3800: 73 74 65 6e 74 20 70 61 67 65 20 63 61 63 68 65  stent page cache
3810: 20 73 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a   size value.  **
3820: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
3830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
3840: 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65  **.  ** Older ve
3850: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
3860: 20 77 6f 75 6c 64 20 73 65 74 20 74 68 65 20 64   would set the d
3870: 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a  efault cache siz
3880: 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61  e to a.  ** nega
3890: 74 69 76 65 20 6e 75 6d 62 65 72 20 74 6f 20 69  tive number to i
38a0: 6e 64 69 63 61 74 65 20 73 79 6e 63 68 72 6f 6e  ndicate synchron
38b0: 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65 73 65 20  ous=OFF.  These 
38c0: 64 61 79 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75  days, synchronou
38d0: 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  s.  ** is always
38e0: 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 72   on by default r
38f0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
3900: 20 73 69 67 6e 20 6f 66 20 74 68 65 20 64 65 66   sign of the def
3910: 61 75 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20  ault cache.  ** 
3920: 73 69 7a 65 2e 20 20 42 75 74 20 63 6f 6e 74 69  size.  But conti
3930: 6e 75 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  nue to take the 
3940: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
3950: 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61  f the default ca
3960: 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  che.  ** size of
3970: 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
3980: 61 74 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a  atibility..  */.
3990: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44    case PragTyp_D
39a0: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
39b0: 45 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  E: {.    static 
39c0: 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20  const int iLn = 
39d0: 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45  VDBE_OFFSET_LINE
39e0: 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69  NO(2);.    stati
39f0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
3a00: 73 74 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  st getCacheSize[
3a10: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
3a20: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c  _Transaction, 0,
3a30: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20         /* 0 */. 
3a60: 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f       { OP_ReadCo
3a70: 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20 20 20 20  okie,  0, 1,    
3a80: 20 20 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c      BTREE_DEFAUL
3a90: 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20  T_CACHE_SIZE},  
3aa0: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
3ab0: 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20  OP_IfPos,       
3ac0: 31 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 8,        0},
3ad0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
3ae0: 67 65 72 2c 20 20 20 20 20 30 2c 20 32 2c 20 20  ger,     0, 2,  
3af0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3b00: 7b 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 20  { OP_Subtract,  
3b10: 20 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20 31    1, 2,        1
3b20: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66  },.      { OP_If
3b30: 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c  Pos,       1, 8,
3b40: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
3b50: 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
3b60: 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20      0, 1,       
3b70: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20   0},            
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b90: 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  6 */.      { OP_
3ba0: 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 30 2c 20  Noop,        0, 
3bb0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
3bc0: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
3bd0: 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  ow,   1, 1,     
3be0: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
3bf0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
3c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
3c10: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
3c20: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
3c30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
3c40: 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20  ->nMem += 2;.   
3c50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
3c60: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
3c70: 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a  ired(v, ArraySiz
3c80: 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 29  e(getCacheSize))
3c90: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
3ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
3cb0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
3cc0: 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67  getCacheSize), g
3cd0: 65 74 43 61 63 68 65 53 69 7a 65 2c 20 69 4c 6e  etCacheSize, iLn
3ce0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c  );.      if( ONL
3cf0: 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  Y_IF_REALLOC_STR
3d00: 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72  ESS(aOp==0) ) br
3d10: 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30  eak;.      aOp[0
3d20: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
3d30: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
3d40: 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 36 5d 2e  b;.      aOp[6].
3d50: 70 31 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  p1 = SQLITE_DEFA
3d60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a  ULT_CACHE_SIZE;.
3d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3d80: 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69   int size = sqli
3d90: 74 65 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69  te3AbsInt32(sqli
3da0: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29  te3Atoi(zRight))
3db0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3dc0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
3dd0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
3de0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
3df0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3e00: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
3e10: 2c 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f  , BTREE_DEFAULT_
3e20: 43 41 43 48 45 5f 53 49 5a 45 2c 20 73 69 7a 65  CACHE_SIZE, size
3e30: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3e40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3e50: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3e60: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 44 62   0) );.      pDb
3e70: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
3e80: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
3e90: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
3ea0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62  SetCacheSize(pDb
3eb0: 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68  ->pBt, pDb->pSch
3ec0: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29  ema->cache_size)
3ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
3ee0: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
3ef0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41   !SQLITE_OMIT_PA
3f00: 47 45 52 5f 50 52 41 47 4d 41 53 20 26 26 20 21  GER_PRAGMAS && !
3f10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
3f20: 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69 66 20 21  ECATED */..#if !
3f30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3f40: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
3f50: 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  S).  /*.  **  PR
3f60: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f70: 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  ge_size.  **  PR
3f80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f90: 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  ge_size=N.  **. 
3fa0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
3fb0: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
3fc0: 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66  urrent setting f
3fd0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  or the.  ** data
3fe0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 69  base page size i
3ff0: 6e 20 62 79 74 65 73 2e 20 20 54 68 65 20 73 65  n bytes.  The se
4000: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
4010: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
4020: 20 70 61 67 65 20 73 69 7a 65 20 76 61 6c 75 65   page size value
4030: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 63 61 6e  .  The value can
4040: 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 0a   only be set if.
4050: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
4060: 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
4070: 65 6e 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  en created..  */
4080: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4090: 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  PAGE_SIZE: {.   
40a0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
40b0: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  b->pBt;.    asse
40c0: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
40d0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
40e0: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
40f0: 3d 20 41 4c 57 41 59 53 28 70 42 74 29 20 3f 20  = ALWAYS(pBt) ? 
4100: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
4110: 61 67 65 53 69 7a 65 28 70 42 74 29 20 3a 20 30  ageSize(pBt) : 0
4120: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
4130: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69 7a 65 29  ngleInt(v, size)
4140: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4150: 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79     /* Malloc may
4160: 20 66 61 69 6c 20 77 68 65 6e 20 73 65 74 74 69   fail when setti
4170: 6e 67 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  ng the page-size
4180: 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 61 6e  , as there is an
4190: 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20   internal.      
41a0: 2a 2a 20 62 75 66 66 65 72 20 74 68 61 74 20 74  ** buffer that t
41b0: 68 65 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20  he pager module 
41c0: 72 65 73 69 7a 65 73 20 75 73 69 6e 67 20 73 71  resizes using sq
41d0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e  lite3_realloc().
41e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
41f0: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4200: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
4210: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66  Right);.      if
4220: 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
4230: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
4240: 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
4250: 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 2d 31  >nextPagesize,-1
4260: 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ,0) ){.        s
4270: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
4280: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
4290: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
42a0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
42b0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63  GMA [schema.]sec
42c0: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
42d0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
42e0: 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f  ]secure_delete=O
42f0: 4e 2f 4f 46 46 2f 46 41 53 54 0a 20 20 2a 2a 0a  N/OFF/FAST.  **.
4300: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
4310: 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20  orm reports the 
4320: 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
4330: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 65 63  for the.  ** sec
4340: 75 72 65 5f 64 65 6c 65 74 65 20 66 6c 61 67 2e  ure_delete flag.
4350: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
4360: 6d 20 63 68 61 6e 67 65 73 20 74 68 65 20 73 65  m changes the se
4370: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a  cure_delete.  **
4380: 20 66 6c 61 67 20 73 65 74 74 69 6e 67 20 61 6e   flag setting an
4390: 64 20 72 65 70 6f 72 74 73 20 74 68 65 20 6e 65  d reports the ne
43a0: 77 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  w value..  */.  
43b0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 45 43  case PragTyp_SEC
43c0: 55 52 45 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20  URE_DELETE: {.  
43d0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
43e0: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 69 6e 74  Db->pBt;.    int
43f0: 20 62 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73   b = -1;.    ass
4400: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
4410: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
4420: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
4430: 65 33 5f 73 74 72 69 63 6d 70 28 7a 52 69 67 68  e3_stricmp(zRigh
4440: 74 2c 20 22 66 61 73 74 22 29 3d 3d 30 20 29 7b  t, "fast")==0 ){
4450: 0a 20 20 20 20 20 20 20 20 62 20 3d 20 32 3b 0a  .        b = 2;.
4460: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4470: 20 20 20 20 20 62 20 3d 20 73 71 6c 69 74 65 33       b = sqlite3
4480: 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  GetBoolean(zRigh
4490: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
44a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
44b0: 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e 3d 30 20  2->n==0 && b>=0 
44c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
44d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
44e0: 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b   ii<db->nDb; ii+
44f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
4500: 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
4510: 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b 69 69 5d  lete(db->aDb[ii]
4520: 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20 20 20 20  .pBt, b);.      
4530: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 20 3d 20  }.    }.    b = 
4540: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
4550: 72 65 44 65 6c 65 74 65 28 70 42 74 2c 20 62 29  reDelete(pBt, b)
4560: 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  ;.    returnSing
4570: 6c 65 49 6e 74 28 76 2c 20 62 29 3b 0a 20 20 20  leInt(v, b);.   
4580: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
4590: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
45a0: 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61 67 65  schema.]max_page
45b0: 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 50 52 41  _count.  **  PRA
45c0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78  GMA [schema.]max
45d0: 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e 0a 20 20  _page_count=N.  
45e0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
45f0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
4600: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
4610: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
4620: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
4630: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
4640: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
4650: 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20  he .  ** second 
4660: 66 6f 72 6d 20 61 74 74 65 6d 70 74 73 20 74 6f  form attempts to
4670: 20 63 68 61 6e 67 65 20 74 68 69 73 20 73 65 74   change this set
4680: 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20 20 2a 2a  ting.  Both.  **
4690: 20 66 6f 72 6d 73 20 72 65 74 75 72 6e 20 74 68   forms return th
46a0: 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
46b0: 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  g..  **.  ** The
46c0: 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20   absolute value 
46d0: 6f 66 20 4e 20 69 73 20 75 73 65 64 2e 20 20 54  of N is used.  T
46e0: 68 69 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e  his is undocumen
46f0: 74 65 64 20 61 6e 64 20 6d 69 67 68 74 0a 20 20  ted and might.  
4700: 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20  ** change.  The 
4710: 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73 20  only purpose is 
4720: 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 61  to provide an ea
4730: 73 79 20 77 61 79 20 74 6f 20 74 65 73 74 0a 20  sy way to test. 
4740: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 41   ** the sqlite3A
4750: 62 73 49 6e 74 33 32 28 29 20 66 75 6e 63 74 69  bsInt32() functi
4760: 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 50  on..  **.  **  P
4770: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70  RAGMA [schema.]p
4780: 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20  age_count.  **. 
4790: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
47a0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
47b0: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
47c0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
47d0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 41   case PragTyp_PA
47e0: 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20 20 20  GE_COUNT: {.    
47f0: 69 6e 74 20 69 52 65 67 3b 0a 20 20 20 20 73 71  int iReg;.    sq
4800: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
4810: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
4820: 62 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 2b  b);.    iReg = +
4830: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
4840: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 6f     if( sqlite3To
4850: 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d  lower(zLeft[0])=
4860: 3d 27 70 27 20 29 7b 0a 20 20 20 20 20 20 73 71  ='p' ){.      sq
4870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4880: 76 2c 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74 2c  v, OP_Pagecount,
4890: 20 69 44 62 2c 20 69 52 65 67 29 3b 0a 20 20 20   iDb, iReg);.   
48a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
48b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
48c0: 76 2c 20 4f 50 5f 4d 61 78 50 67 63 6e 74 2c 20  v, OP_MaxPgcnt, 
48d0: 69 44 62 2c 20 69 52 65 67 2c 20 0a 20 20 20 20  iDb, iReg, .    
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48f0: 20 20 20 20 73 71 6c 69 74 65 33 41 62 73 49 6e      sqlite3AbsIn
4900: 74 33 32 28 73 71 6c 69 74 65 33 41 74 6f 69 28  t32(sqlite3Atoi(
4910: 7a 52 69 67 68 74 29 29 29 3b 0a 20 20 20 20 7d  zRight)));.    }
4920: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4930: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
4940: 75 6c 74 52 6f 77 2c 20 69 52 65 67 2c 20 31 29  ultRow, iReg, 1)
4950: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
4960: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
4970: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63  GMA [schema.]loc
4980: 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20  king_mode.  **  
4990: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
49a0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 28  locking_mode = (
49b0: 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73 69 76 65  normal|exclusive
49c0: 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ).  */.  case Pr
49d0: 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  agTyp_LOCKING_MO
49e0: 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  DE: {.    const 
49f0: 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 22 6e 6f  char *zRet = "no
4a00: 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e 74 20 65  rmal";.    int e
4a10: 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63 6b 69 6e  Mode = getLockin
4a20: 67 4d 6f 64 65 28 7a 52 69 67 68 74 29 3b 0a 0a  gMode(zRight);..
4a30: 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d      if( pId2->n=
4a40: 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d 50 41 47  =0 && eMode==PAG
4a50: 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
4a60: 55 45 52 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a  UERY ){.      /*
4a70: 20 53 69 6d 70 6c 65 20 22 50 52 41 47 4d 41 20   Simple "PRAGMA 
4a80: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b 22 20 73  locking_mode;" s
4a90: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
4aa0: 73 20 61 20 71 75 65 72 79 20 66 6f 72 0a 20 20  s a query for.  
4ab0: 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
4ac0: 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  nt default locki
4ad0: 6e 67 20 6d 6f 64 65 20 28 77 68 69 63 68 20 6d  ng mode (which m
4ae0: 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
4af0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
4b00: 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6f 66 20  locking-mode of 
4b10: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
4b20: 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e)..      */.   
4b30: 20 20 20 65 4d 6f 64 65 20 3d 20 64 62 2d 3e 64     eMode = db->d
4b40: 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a 20 20 20  fltLockMode;.   
4b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 61   }else{.      Pa
4b60: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
4b70: 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d     if( pId2->n==
4b80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
4b90: 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 74  This indicates t
4ba0: 68 61 74 20 6e 6f 20 64 61 74 61 62 61 73 65 20  hat no database 
4bb0: 6e 61 6d 65 20 77 61 73 20 73 70 65 63 69 66 69  name was specifi
4bc0: 65 64 20 61 73 20 70 61 72 74 0a 20 20 20 20 20  ed as part.     
4bd0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 52 41     ** of the PRA
4be0: 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20  GMA command. In 
4bf0: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6c 6f  this case the lo
4c00: 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75 73 74 20  cking-mode must 
4c10: 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  be.        ** se
4c20: 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  t on all attache
4c30: 64 20 64 61 74 61 62 61 73 65 73 2c 20 61 73 20  d databases, as 
4c40: 77 65 6c 6c 20 61 73 20 74 68 65 20 6d 61 69 6e  well as the main
4c50: 20 64 62 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   db file..      
4c60: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
4c70: 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c 69 74 65  Also, the sqlite
4c80: 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 76  3.dfltLockMode v
4c90: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 73  ariable is set s
4ca0: 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  o that.        *
4cb0: 2a 20 61 6e 79 20 73 75 62 73 65 71 75 65 6e 74  * any subsequent
4cc0: 6c 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ly attached data
4cd0: 62 61 73 65 73 20 61 6c 73 6f 20 75 73 65 20 74  bases also use t
4ce0: 68 65 20 73 70 65 63 69 66 69 65 64 0a 20 20 20  he specified.   
4cf0: 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20       ** locking 
4d00: 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  mode..        */
4d10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
4d20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
4d30: 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62 5b 30 5d  pDb==&db->aDb[0]
4d40: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
4d50: 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=2; ii<db->nDb;
4d60: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
4d70: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
4d80: 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d  e3BtreePager(db-
4d90: 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29 3b 0a 20  >aDb[ii].pBt);. 
4da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4db0: 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
4dc0: 28 70 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b  (pPager, eMode);
4dd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4de0: 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d     db->dfltLockM
4df0: 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b  ode = (u8)eMode;
4e00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
4e10: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
4e20: 74 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70  treePager(pDb->p
4e30: 42 74 29 3b 0a 20 20 20 20 20 20 65 4d 6f 64 65  Bt);.      eMode
4e40: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
4e50: 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61 67 65  ockingMode(pPage
4e60: 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  r, eMode);.    }
4e70: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4d  ..    assert( eM
4e80: 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
4e90: 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20  NGMODE_NORMAL.  
4ea0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
4eb0: 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
4ec0: 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
4ed0: 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  );.    if( eMode
4ee0: 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
4ef0: 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  ODE_EXCLUSIVE ){
4f00: 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20 22 65  .      zRet = "e
4f10: 78 63 6c 75 73 69 76 65 22 3b 0a 20 20 20 20 7d  xclusive";.    }
4f20: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
4f30: 65 54 65 78 74 28 76 2c 20 7a 52 65 74 29 3b 0a  eText(v, zRet);.
4f40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4f50: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
4f60: 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e  A [schema.]journ
4f70: 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20 50 52  al_mode.  **  PR
4f80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f  AGMA [schema.]jo
4f90: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a 20 20 2a  urnal_mode =.  *
4fa0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
4fb0: 20 20 20 20 20 20 20 28 64 65 6c 65 74 65 7c 70         (delete|p
4fc0: 65 72 73 69 73 74 7c 6f 66 66 7c 74 72 75 6e 63  ersist|off|trunc
4fd0: 61 74 65 7c 6d 65 6d 6f 72 79 7c 77 61 6c 7c 6f  ate|memory|wal|o
4fe0: 66 66 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ff).  */.  case 
4ff0: 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f  PragTyp_JOURNAL_
5000: 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20  MODE: {.    int 
5010: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a  eMode;        /*
5020: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
5030: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58  R_JOURNALMODE_XX
5040: 58 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 20  X symbols */.   
5050: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
5060: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
5070: 65 72 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a  er */..    if( z
5080: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
5090: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
50a0: 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70 61 72 74   no "=MODE" part
50b0: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 2c 20   of the pragma, 
50c0: 64 6f 20 61 20 71 75 65 72 79 20 66 6f 72 20 74  do a query for t
50d0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  he.      ** curr
50e0: 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ent mode */.    
50f0: 20 20 65 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f    eMode = PAGER_
5100: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
5110: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
5120: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5130: 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20 69 6e 74  zMode;.      int
5140: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
5150: 65 6e 33 30 28 7a 52 69 67 68 74 29 3b 0a 20 20  en30(zRight);.  
5160: 20 20 20 20 66 6f 72 28 65 4d 6f 64 65 3d 30 3b      for(eMode=0;
5170: 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65   (zMode = sqlite
5180: 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65  3JournalModename
5190: 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20 65 4d 6f  (eMode))!=0; eMo
51a0: 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  de++){.        i
51b0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
51c0: 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d 6f 64 65  mp(zRight, zMode
51d0: 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  , n)==0 ) break;
51e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
51f0: 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a 20 20 20  f( !zMode ){.   
5200: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 22       /* If the "
5210: 3d 4d 4f 44 45 22 20 70 61 72 74 20 64 6f 65 73  =MODE" part does
5220: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 6b   not match any k
5230: 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  nown journal mod
5240: 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  e,.        ** th
5250: 65 6e 20 64 6f 20 61 20 71 75 65 72 79 20 2a 2f  en do a query */
5260: 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
5270: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
5280: 44 45 5f 51 55 45 52 59 3b 0a 20 20 20 20 20 20  DE_QUERY;.      
5290: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
52a0: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
52b0: 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 26  RNALMODE_QUERY &
52c0: 26 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a  & pId2->n==0 ){.
52d0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
52e0: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
52f0: 5f 6d 6f 64 65 22 20 69 6e 74 6f 20 22 50 52 41  _mode" into "PRA
5300: 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c  GMA main.journal
5310: 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20 20 20 20 20  _mode" */.      
5320: 69 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  iDb = 0;.      p
5330: 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20 20 20 20  Id2->n = 1;.    
5340: 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d  }.    for(ii=db-
5350: 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69  >nDb-1; ii>=0; i
5360: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i--){.      if( 
5370: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20  db->aDb[ii].pBt 
5380: 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70  && (ii==iDb || p
5390: 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20  Id2->n==0) ){.  
53a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
53b0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 69  eUsesBtree(v, ii
53c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
53d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
53e0: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 2c 20  OP_JournalMode, 
53f0: 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29 3b 0a 20  ii, 1, eMode);. 
5400: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5410: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5420: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
5430: 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 62  ow, 1, 1);.    b
5440: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
5450: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
5460: 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69  hema.]journal_si
5470: 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 50  ze_limit.  **  P
5480: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
5490: 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69  ournal_size_limi
54a0: 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47 65  t=N.  **.  ** Ge
54b0: 74 20 6f 72 20 73 65 74 20 74 68 65 20 73 69 7a  t or set the siz
54c0: 65 20 6c 69 6d 69 74 20 6f 6e 20 72 6f 6c 6c 62  e limit on rollb
54d0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
54e0: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  s..  */.  case P
54f0: 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f 53  ragTyp_JOURNAL_S
5500: 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20  IZE_LIMIT: {.   
5510: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
5520: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
5530: 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  er(pDb->pBt);.  
5540: 20 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 2d    i64 iLimit = -
5550: 32 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  2;.    if( zRigh
5560: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
5570: 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
5580: 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29  zRight, &iLimit)
5590: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d  ;.      if( iLim
55a0: 69 74 3c 2d 31 20 29 20 69 4c 69 6d 69 74 20 3d  it<-1 ) iLimit =
55b0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   -1;.    }.    i
55c0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
55d0: 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c  agerJournalSizeL
55e0: 69 6d 69 74 28 70 50 61 67 65 72 2c 20 69 4c 69  imit(pPager, iLi
55f0: 6d 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  mit);.    return
5600: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 69 4c 69  SingleInt(v, iLi
5610: 6d 69 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  mit);.    break;
5620: 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  .  }..#endif /* 
5630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
5640: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 20 20  R_PRAGMAS */..  
5650: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
5660: 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61  [schema.]auto_va
5670: 63 75 75 6d 0a 20 20 2a 2a 20 20 50 52 41 47 4d  cuum.  **  PRAGM
5680: 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f 5f  A [schema.]auto_
5690: 76 61 63 75 75 6d 3d 4e 0a 20 20 2a 2a 0a 20 20  vacuum=N.  **.  
56a0: 2a 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68  ** Get or set th
56b0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
56c0: 61 74 61 62 61 73 65 20 27 61 75 74 6f 2d 76 61  atabase 'auto-va
56d0: 63 75 75 6d 27 20 70 61 72 61 6d 65 74 65 72 2e  cuum' parameter.
56e0: 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
56f0: 69 73 20 6f 6e 65 20 6f 66 3a 20 20 30 20 4e 4f  is one of:  0 NO
5700: 4e 45 20 31 20 46 55 4c 4c 20 32 20 49 4e 43 52  NE 1 FULL 2 INCR
5710: 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f 0a 23 69 66  EMENTAL.  */.#if
5720: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5730: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 63 61  _AUTOVACUUM.  ca
5740: 73 65 20 50 72 61 67 54 79 70 5f 41 55 54 4f 5f  se PragTyp_AUTO_
5750: 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 42 74  VACUUM: {.    Bt
5760: 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e  ree *pBt = pDb->
5770: 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
5780: 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69   pBt!=0 );.    i
5790: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
57a0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
57b0: 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 42 74  Int(v, sqlite3Bt
57c0: 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
57d0: 28 70 42 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  (pBt));.    }els
57e0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 41 75  e{.      int eAu
57f0: 74 6f 20 3d 20 67 65 74 41 75 74 6f 56 61 63 75  to = getAutoVacu
5800: 75 6d 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  um(zRight);.    
5810: 20 20 61 73 73 65 72 74 28 20 65 41 75 74 6f 3e    assert( eAuto>
5820: 3d 30 20 26 26 20 65 41 75 74 6f 3c 3d 32 20 29  =0 && eAuto<=2 )
5830: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74  ;.      db->next
5840: 41 75 74 6f 76 61 63 20 3d 20 28 75 38 29 65 41  Autovac = (u8)eA
5850: 75 74 6f 3b 0a 20 20 20 20 20 20 2f 2a 20 43 61  uto;.      /* Ca
5860: 6c 6c 20 53 65 74 41 75 74 6f 56 61 63 75 75 6d  ll SetAutoVacuum
5870: 28 29 20 74 6f 20 73 65 74 20 69 6e 69 74 69 61  () to set initia
5880: 6c 69 7a 65 20 74 68 65 20 69 6e 74 65 72 6e 61  lize the interna
5890: 6c 20 61 75 74 6f 20 61 6e 64 0a 20 20 20 20 20  l auto and.     
58a0: 20 2a 2a 20 69 6e 63 72 2d 76 61 63 75 75 6d 20   ** incr-vacuum 
58b0: 66 6c 61 67 73 2e 20 54 68 69 73 20 69 73 20 72  flags. This is r
58c0: 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20  equired in case 
58d0: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  this connection.
58e0: 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 73        ** creates
58f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5900: 6c 65 2e 20 49 74 20 69 73 20 69 6d 70 6f 72 74  le. It is import
5910: 61 6e 74 20 74 68 61 74 20 69 74 20 69 73 20 63  ant that it is c
5920: 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  reated.      ** 
5930: 61 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  as an auto-vacuu
5940: 6d 20 63 61 70 61 62 6c 65 20 64 62 2e 0a 20 20  m capable db..  
5950: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
5960: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  = sqlite3BtreeSe
5970: 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74 2c  tAutoVacuum(pBt,
5980: 20 65 41 75 74 6f 29 3b 0a 20 20 20 20 20 20 69   eAuto);.      i
5990: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
59a0: 20 26 26 20 28 65 41 75 74 6f 3d 3d 31 20 7c 7c   && (eAuto==1 ||
59b0: 20 65 41 75 74 6f 3d 3d 32 29 20 29 7b 0a 20 20   eAuto==2) ){.  
59c0: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 73 65        /* When se
59d0: 74 74 69 6e 67 20 74 68 65 20 61 75 74 6f 5f 76  tting the auto_v
59e0: 61 63 75 75 6d 20 6d 6f 64 65 20 74 6f 20 65 69  acuum mode to ei
59f0: 74 68 65 72 20 22 66 75 6c 6c 22 20 6f 72 20 0a  ther "full" or .
5a00: 20 20 20 20 20 20 20 20 2a 2a 20 22 69 6e 63 72          ** "incr
5a10: 65 6d 65 6e 74 61 6c 22 2c 20 77 72 69 74 65 20  emental", write 
5a20: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74  the value of met
5a30: 61 5b 36 5d 20 69 6e 20 74 68 65 20 64 61 74 61  a[6] in the data
5a40: 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  base.        ** 
5a50: 66 69 6c 65 2e 20 42 65 66 6f 72 65 20 77 72 69  file. Before wri
5a60: 74 69 6e 67 20 74 6f 20 6d 65 74 61 5b 36 5d 2c  ting to meta[6],
5a70: 20 63 68 65 63 6b 20 74 68 61 74 20 6d 65 74 61   check that meta
5a80: 5b 33 5d 20 69 6e 64 69 63 61 74 65 73 0a 20 20  [3] indicates.  
5a90: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
5aa0: 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  is really is an 
5ab0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
5ac0: 62 6c 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ble database..  
5ad0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
5ae0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
5af0: 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46  t iLn = VDBE_OFF
5b00: 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20  SET_LINENO(2);. 
5b10: 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
5b20: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73  nst VdbeOpList s
5b30: 65 74 4d 65 74 61 36 5b 5d 20 3d 20 7b 0a 20 20  etMeta6[] = {.  
5b40: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61          { OP_Tra
5b50: 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20  nsaction,    0, 
5b60: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5b70: 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20             0},  
5b80: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
5b90: 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f      { OP_ReadCoo
5ba0: 6b 69 65 2c 20 20 20 20 20 30 2c 20 20 20 20 20  kie,     0,     
5bb0: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 42      1,         B
5bc0: 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f  TREE_LARGEST_ROO
5bd0: 54 5f 50 41 47 45 7d 2c 0a 20 20 20 20 20 20 20  T_PAGE},.       
5be0: 20 20 20 7b 20 4f 50 5f 49 66 2c 20 20 20 20 20     { OP_If,     
5bf0: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5c00: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
5c10: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c20: 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  2 */.          {
5c30: 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20 20 20 20   OP_Halt,       
5c40: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f      SQLITE_OK, O
5c50: 45 5f 41 62 6f 72 74 2c 20 20 20 20 20 20 20 20  E_Abort,        
5c60: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f    0},    /* 3 */
5c70: 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  .          { OP_
5c80: 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20  SetCookie,      
5c90: 30 2c 20 20 20 20 20 20 20 20 20 42 54 52 45 45  0,         BTREE
5ca0: 5f 49 4e 43 52 5f 56 41 43 55 55 4d 2c 20 30 7d  _INCR_VACUUM, 0}
5cb0: 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20  ,    /* 4 */.   
5cc0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20       };.        
5cd0: 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20  VdbeOp *aOp;.   
5ce0: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
5cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
5d00: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
5d10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56      sqlite3VdbeV
5d20: 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71  erifyNoMallocReq
5d30: 75 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69  uired(v, ArraySi
5d40: 7a 65 28 73 65 74 4d 65 74 61 36 29 29 3b 0a 20  ze(setMeta6));. 
5d50: 20 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c         aOp = sql
5d60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
5d70: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  t(v, ArraySize(s
5d80: 65 74 4d 65 74 61 36 29 2c 20 73 65 74 4d 65 74  etMeta6), setMet
5d90: 61 36 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20  a6, iLn);.      
5da0: 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45    if( ONLY_IF_RE
5db0: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70  ALLOC_STRESS(aOp
5dc0: 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ==0) ) break;.  
5dd0: 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20        aOp[0].p1 
5de0: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 61  = iDb;.        a
5df0: 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[1].p1 = iDb;.
5e00: 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70          aOp[2].p
5e10: 32 20 3d 20 69 41 64 64 72 2b 34 3b 0a 20 20 20  2 = iAddr+4;.   
5e20: 20 20 20 20 20 61 4f 70 5b 34 5d 2e 70 31 20 3d       aOp[4].p1 =
5e30: 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f   iDb;.        aO
5e40: 70 5b 34 5d 2e 70 33 20 3d 20 65 41 75 74 6f 20  p[4].p3 = eAuto 
5e50: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  - 1;.        sql
5e60: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
5e70: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  e(v, iDb);.     
5e80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
5e90: 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ak;.  }.#endif..
5ea0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
5eb0: 41 20 5b 73 63 68 65 6d 61 2e 5d 69 6e 63 72 65  A [schema.]incre
5ec0: 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28 4e 29  mental_vacuum(N)
5ed0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 4e 20  .  **.  ** Do N 
5ee0: 73 74 65 70 73 20 6f 66 20 69 6e 63 72 65 6d 65  steps of increme
5ef0: 6e 74 61 6c 20 76 61 63 75 75 6d 69 6e 67 20 6f  ntal vacuuming o
5f00: 6e 20 61 20 64 61 74 61 62 61 73 65 2e 0a 20 20  n a database..  
5f10: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
5f20: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
5f30: 4d 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  M.  case PragTyp
5f40: 5f 49 4e 43 52 45 4d 45 4e 54 41 4c 5f 56 41 43  _INCREMENTAL_VAC
5f50: 55 55 4d 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  UUM: {.    int i
5f60: 4c 69 6d 69 74 2c 20 61 64 64 72 3b 0a 20 20 20  Limit, addr;.   
5f70: 20 69 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 7c   if( zRight==0 |
5f80: 7c 20 21 73 71 6c 69 74 65 33 47 65 74 49 6e 74  | !sqlite3GetInt
5f90: 33 32 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d  32(zRight, &iLim
5fa0: 69 74 29 20 7c 7c 20 69 4c 69 6d 69 74 3c 3d 30  it) || iLimit<=0
5fb0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
5fc0: 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   = 0x7fffffff;. 
5fd0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5fe0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
5ff0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
6000: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
6010: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6020: 5f 49 6e 74 65 67 65 72 2c 20 69 4c 69 6d 69 74  _Integer, iLimit
6030: 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  , 1);.    addr =
6040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6050: 70 31 28 76 2c 20 4f 50 5f 49 6e 63 72 56 61 63  p1(v, OP_IncrVac
6060: 75 75 6d 2c 20 69 44 62 29 3b 20 56 64 62 65 43  uum, iDb); VdbeC
6070: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6090: 31 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  1(v, OP_ResultRo
60a0: 77 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  w, 1);.    sqlit
60b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
60c0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31  OP_AddImm, 1, -1
60d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
60e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
60f0: 66 50 6f 73 2c 20 31 2c 20 61 64 64 72 29 3b 20  fPos, 1, addr); 
6100: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6110: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6120: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6130: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
6140: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
6150: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
6160: 47 45 52 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a  GER_PRAGMAS.  /*
6170: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
6180: 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a  chema.]cache_siz
6190: 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  e.  **  PRAGMA [
61a0: 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 69  schema.]cache_si
61b0: 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ze=N.  **.  ** T
61c0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
61d0: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
61e0: 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20  t local setting 
61f0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
6200: 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20 54 68  e cache size. Th
6210: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
6220: 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a 20 20 2a  ts the local.  *
6230: 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  * page cache siz
6240: 65 20 76 61 6c 75 65 2e 20 20 49 66 20 4e 20 69  e value.  If N i
6250: 73 20 70 6f 73 69 74 69 76 65 20 74 68 65 6e 20  s positive then 
6260: 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 2a 2a  that is the.  **
6270: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
6280: 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 20 20   in the cache.  
6290: 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65  If N is negative
62a0: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
62b0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
62c0: 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f 20 74  is adjusted so t
62d0: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 75 73  hat the cache us
62e0: 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65 73 0a  es -N kibibytes.
62f0: 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a    ** of memory..
6300: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
6310: 54 79 70 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20  Typ_CACHE_SIZE: 
6320: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
6330: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
6340: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
6350: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69   );.    if( !zRi
6360: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ght ){.      ret
6370: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
6380: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
6390: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
63a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
63b0: 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74  size = sqlite3At
63c0: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
63d0: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e    pDb->pSchema->
63e0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a  cache_size = siz
63f0: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
6400: 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
6410: 65 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d  e(pDb->pBt, pDb-
6420: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
6430: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  size);.    }.   
6440: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
6450: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
6460: 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70  schema.]cache_sp
6470: 69 6c 6c 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ill.  **  PRAGMA
6480: 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d 42 4f 4f   cache_spill=BOO
6490: 4c 45 41 4e 0a 20 20 2a 2a 20 20 50 52 41 47 4d  LEAN.  **  PRAGM
64a0: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
64b0: 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a 2a 0a 20 20  _spill=N.  **.  
64c0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
64d0: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
64e0: 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74  rrent local sett
64f0: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
6500: 20 70 61 67 65 20 63 61 63 68 65 20 73 70 69 6c   page cache spil
6510: 6c 20 73 69 7a 65 2e 20 54 68 65 20 73 65 63 6f  l size. The seco
6520: 6e 64 20 66 6f 72 6d 20 74 75 72 6e 73 20 63 61  nd form turns ca
6530: 63 68 65 20 73 70 69 6c 6c 20 6f 6e 0a 20 20 2a  che spill on.  *
6540: 2a 20 6f 72 20 6f 66 66 2e 20 20 57 68 65 6e 20  * or off.  When 
6550: 74 75 72 6e 6e 69 6e 67 20 63 61 63 68 65 20 73  turnning cache s
6560: 70 69 6c 6c 20 6f 6e 2c 20 74 68 65 20 73 69 7a  pill on, the siz
6570: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  e is set to the.
6580: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 63 61 63    ** current cac
6590: 68 65 5f 73 69 7a 65 2e 20 20 54 68 65 20 74 68  he_size.  The th
65a0: 69 72 64 20 66 6f 72 6d 20 73 65 74 73 20 61 20  ird form sets a 
65b0: 73 70 69 6c 6c 20 73 69 7a 65 20 74 68 61 74 0a  spill size that.
65c0: 20 20 2a 2a 20 6d 61 79 20 62 65 20 64 69 66 66    ** may be diff
65d0: 65 72 65 6e 74 20 66 6f 72 6d 20 74 68 65 20 63  erent form the c
65e0: 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 2a 2a 20  ache size..  ** 
65f0: 49 66 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65  If N is positive
6600: 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 74 68   then that is th
6610: 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  e.  ** number of
6620: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
6630: 63 68 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65  che.  If N is ne
6640: 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65  gative, then the
6650: 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
6660: 70 61 67 65 73 20 69 73 20 61 64 6a 75 73 74 65  pages is adjuste
6670: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  d so that the ca
6680: 63 68 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69  che uses -N kibi
6690: 62 79 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65  bytes.  ** of me
66a0: 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mory..  **.  ** 
66b0: 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
66c0: 20 63 61 63 68 65 5f 73 70 69 6c 6c 20 70 61 67   cache_spill pag
66d0: 65 73 20 69 73 20 6c 65 73 73 20 74 68 65 6e 20  es is less then 
66e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
66f0: 2a 2a 20 63 61 63 68 65 5f 73 69 7a 65 20 70 61  ** cache_size pa
6700: 67 65 73 2c 20 6e 6f 20 73 70 69 6c 6c 69 6e 67  ges, no spilling
6710: 20 6f 63 63 75 72 73 20 75 6e 74 69 6c 20 74 68   occurs until th
6720: 65 20 70 61 67 65 20 63 6f 75 6e 74 20 65 78 63  e page count exc
6730: 65 65 64 73 0a 20 20 2a 2a 20 74 68 65 20 6e 75  eeds.  ** the nu
6740: 6d 62 65 72 20 6f 66 20 63 61 63 68 65 5f 73 69  mber of cache_si
6750: 7a 65 20 70 61 67 65 73 2e 0a 20 20 2a 2a 0a 20  ze pages..  **. 
6760: 20 2a 2a 20 54 68 65 20 63 61 63 68 65 5f 73 70   ** The cache_sp
6770: 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20 73 65 74 74  ill=BOOLEAN sett
6780: 69 6e 67 20 61 70 70 6c 69 65 73 20 74 6f 20 61  ing applies to a
6790: 6c 6c 20 61 74 74 61 63 68 65 64 20 73 63 68 65  ll attached sche
67a0: 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 6a 75  mas,.  ** not ju
67b0: 73 74 20 74 68 65 20 73 63 68 65 6d 61 20 73 70  st the schema sp
67c0: 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20  ecified..  */.  
67d0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 43  case PragTyp_CAC
67e0: 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20  HE_SPILL: {.    
67f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
6800: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
6810: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
6820: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
6830: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
6840: 67 6c 65 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  gleInt(v,.      
6850: 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20     (db->flags & 
6860: 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c  SQLITE_CacheSpil
6870: 6c 29 3d 3d 30 20 3f 20 30 20 3a 20 0a 20 20 20  l)==0 ? 0 : .   
6880: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6890: 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a  BtreeSetSpillSiz
68a0: 65 28 70 44 62 2d 3e 70 42 74 2c 30 29 29 3b 0a  e(pDb->pBt,0));.
68b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
68c0: 20 69 6e 74 20 73 69 7a 65 20 3d 20 31 3b 0a 20   int size = 1;. 
68d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
68e0: 47 65 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c  GetInt32(zRight,
68f0: 20 26 73 69 7a 65 29 20 29 7b 0a 20 20 20 20 20   &size) ){.     
6900: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
6910: 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44 62 2d  etSpillSize(pDb-
6920: 3e 70 42 74 2c 20 73 69 7a 65 29 3b 0a 20 20 20  >pBt, size);.   
6930: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
6940: 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e  qlite3GetBoolean
6950: 28 7a 52 69 67 68 74 2c 20 73 69 7a 65 21 3d 30  (zRight, size!=0
6960: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  ) ){.        db-
6970: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
6980: 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20  _CacheSpill;.   
6990: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
69a0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
69b0: 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c  SQLITE_CacheSpil
69c0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
69d0: 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67   setAllPagerFlag
69e0: 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  s(db);.    }.   
69f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
6a00: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
6a10: 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73 69 7a  schema.]mmap_siz
6a20: 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55  e(N).  **.  ** U
6a30: 73 65 64 20 74 6f 20 73 65 74 20 6d 61 70 70 69  sed to set mappi
6a40: 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20 54  ng size limit. T
6a50: 68 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  he mapping size 
6a60: 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a 20 75 73  limit is.  ** us
6a70: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6a80: 61 67 67 72 65 67 61 74 65 20 73 69 7a 65 20 6f  aggregate size o
6a90: 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d 61 70  f all memory map
6aa0: 70 65 64 20 72 65 67 69 6f 6e 73 20 6f 66 20 74  ped regions of t
6ab0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
6ac0: 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20 70   file. If this p
6ad0: 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20  arameter is set 
6ae0: 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6d 65  to zero, then me
6af0: 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a 20 20 2a  mory mapping.  *
6b00: 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 20 61 74  * is not used at
6b10: 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69 73 20 6e   all.  If N is n
6b20: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68  egative, then th
6b30: 65 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79  e default memory
6b40: 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d 69 74 20   map.  ** limit 
6b50: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 73 71  determined by sq
6b60: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
6b70: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f  ITE_CONFIG_MMAP_
6b80: 53 49 5a 45 29 20 69 73 20 73 65 74 2e 0a 20 20  SIZE) is set..  
6b90: 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ** The parameter
6ba0: 20 4e 20 69 73 20 6d 65 61 73 75 72 65 64 20 69   N is measured i
6bb0: 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a 0a 20 20  n bytes..  **.  
6bc0: 2a 2a 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  ** This value is
6bd0: 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68 65 20   advisory.  The 
6be0: 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20 69  underlying VFS i
6bf0: 73 20 66 72 65 65 20 74 6f 20 6d 65 6d 6f 72 79  s free to memory
6c00: 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20 6c 69 74   map.  ** as lit
6c10: 74 6c 65 20 6f 72 20 61 73 20 6d 75 63 68 20 61  tle or as much a
6c20: 73 20 69 74 20 77 61 6e 74 73 2e 20 20 45 78 63  s it wants.  Exc
6c30: 65 70 74 2c 20 69 66 20 4e 20 69 73 20 73 65 74  ept, if N is set
6c40: 20 74 6f 20 30 20 74 68 65 6e 20 74 68 65 0a 20   to 0 then the. 
6c50: 20 2a 2a 20 75 70 70 65 72 20 6c 61 79 65 72 73   ** upper layers
6c60: 20 77 69 6c 6c 20 6e 65 76 65 72 20 69 6e 76 6f   will never invo
6c70: 6b 65 20 74 68 65 20 78 46 65 74 63 68 20 69 6e  ke the xFetch in
6c80: 74 65 72 66 61 63 65 73 20 74 6f 20 74 68 65 20  terfaces to the 
6c90: 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  VFS..  */.  case
6ca0: 20 50 72 61 67 54 79 70 5f 4d 4d 41 50 5f 53 49   PragTyp_MMAP_SI
6cb0: 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  ZE: {.    sqlite
6cc0: 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23 69 66 20  3_int64 sz;.#if 
6cd0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
6ce0: 53 49 5a 45 3e 30 0a 20 20 20 20 61 73 73 65 72  SIZE>0.    asser
6cf0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
6d00: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
6d10: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28  b, 0) );.    if(
6d20: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
6d30: 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 73   int ii;.      s
6d40: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
6d50: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 73 7a 29  I64(zRight, &sz)
6d60: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c 30  ;.      if( sz<0
6d70: 20 29 20 73 7a 20 3d 20 73 71 6c 69 74 65 33 47   ) sz = sqlite3G
6d80: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
6d90: 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ap;.      if( pI
6da0: 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e 73  d2->n==0 ) db->s
6db0: 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20 20 20 20  zMmap = sz;.    
6dc0: 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62    for(ii=db->nDb
6dd0: 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29  -1; ii>=0; ii--)
6de0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
6df0: 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26  ->aDb[ii].pBt &&
6e00: 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64   (ii==iDb || pId
6e10: 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20  2->n==0) ){.    
6e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
6e30: 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 64  eeSetMmapLimit(d
6e40: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20  b->aDb[ii].pBt, 
6e50: 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  sz);.        }. 
6e60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6e70: 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 72 63   sz = -1;.    rc
6e80: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
6e90: 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c  control(db, zDb,
6ea0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
6eb0: 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 23  AP_SIZE, &sz);.#
6ec0: 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d 20 30 3b  else.    sz = 0;
6ed0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
6ee0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  _OK;.#endif.    
6ef0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6f00: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
6f10: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 7a  nSingleInt(v, sz
6f20: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6f30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
6f40: 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 70 50  OUND ){.      pP
6f50: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
6f60: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
6f70: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62   rc;.    }.    b
6f80: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
6f90: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65    **   PRAGMA te
6fa0: 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a 20 20 20  mp_store.  **   
6fb0: 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
6fc0: 65 20 3d 20 22 64 65 66 61 75 6c 74 22 7c 22 6d  e = "default"|"m
6fd0: 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22 0a 20 20  emory"|"file".  
6fe0: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
6ff0: 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  r set the local 
7000: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65 6d  value of the tem
7010: 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e 20 20 43  p_store flag.  C
7020: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
7030: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65   local value doe
7040: 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67  s not make chang
7050: 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66  es to the disk f
7060: 69 6c 65 20 61 6e 64 20 74 68 65 20 64 65 66 61  ile and the defa
7070: 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20 77  ult.  ** value w
7080: 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20  ill be restored 
7090: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  the next time th
70a0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  e database is op
70b0: 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ened..  **.  ** 
70c0: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
70d0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
70e0: 20 6c 69 62 72 61 72 79 20 63 6f 6d 70 69 6c 65   library compile
70f0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 6f  -time options to
7100: 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64 65 20 74  .  ** override t
7110: 68 69 73 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  his setting.  */
7120: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
7130: 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a 20 20  TEMP_STORE: {.  
7140: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
7150: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
7160: 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 74 65  gleInt(v, db->te
7170: 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20 20 20 7d  mp_store);.    }
7180: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 6e  else{.      chan
7190: 67 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50  geTempStorage(pP
71a0: 61 72 73 65 2c 20 7a 52 69 67 68 74 29 3b 0a 20  arse, zRight);. 
71b0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
71c0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
71d0: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
71e0: 72 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a  re_directory.  *
71f0: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
7200: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
7210: 3d 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f  = ""|"directory_
7220: 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  name".  **.  ** 
7230: 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68  Return or set th
7240: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66  e local value of
7250: 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65 5f   the temp_store_
7260: 64 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20  directory flag. 
7270: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
7280: 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20  he value sets a 
7290: 73 70 65 63 69 66 69 63 20 64 69 72 65 63 74 6f  specific directo
72a0: 72 79 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ry to be used fo
72b0: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
72c0: 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69 6e 67 20  s..  ** Setting 
72d0: 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67  to a null string
72e0: 20 72 65 76 65 72 74 73 20 74 6f 20 74 68 65 20   reverts to the 
72f0: 64 65 66 61 75 6c 74 20 74 65 6d 70 6f 72 61 72  default temporar
7300: 79 20 64 69 72 65 63 74 6f 72 79 20 73 65 61 72  y directory sear
7310: 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74 65 6d 70  ch..  ** If temp
7320: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
7330: 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
7340: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
7350: 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a  torage..  **.  *
7360: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
7370: 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44 49 52 45  _TEMP_STORE_DIRE
7380: 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66 28  CTORY: {.    if(
7390: 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20   !zRight ){.    
73a0: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65    returnSingleTe
73b0: 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 74 65  xt(v, sqlite3_te
73c0: 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
73d0: 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65     }else{.#ifnde
73e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53  f SQLITE_OMIT_WS
73f0: 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  D.      if( zRig
7400: 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ht[0] ){.       
7410: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
7420: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7430: 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73 2c  Access(db->pVfs,
7440: 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45 5f   zRight, SQLITE_
7450: 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
7460: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  , &res);.       
7470: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7480: 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a  OK || res==0 ){.
7490: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
74a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
74b0: 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62 6c  , "not a writabl
74c0: 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a 20  e directory");. 
74d0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72           goto pr
74e0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
74f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7500: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 45 4d    if( SQLITE_TEM
7510: 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20 20  P_STORE==0.     
7520: 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d    || (SQLITE_TEM
7530: 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20 64 62  P_STORE==1 && db
7540: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31 29  ->temp_store<=1)
7550: 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49  .       || (SQLI
7560: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32  TE_TEMP_STORE==2
7570: 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f   && db->temp_sto
7580: 72 65 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b 0a  re==1).      ){.
7590: 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
75a0: 74 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50  teTempStorage(pP
75b0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
75c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
75d0: 65 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  e(sqlite3_temp_d
75e0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20  irectory);.     
75f0: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
7600: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7610: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
7620: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7630: 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29  tf("%s", zRight)
7640: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
7660: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
7670: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  0;.      }.#endi
7680: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7690: 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  _WSD */.    }.  
76a0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69    break;.  }..#i
76b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
76c0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
76d0: 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  MA data_store_di
76e0: 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50  rectory.  **   P
76f0: 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65  RAGMA data_store
7700: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c  _directory = ""|
7710: 22 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22  "directory_name"
7720: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
7730: 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63  n or set the loc
7740: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
7750: 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
7760: 74 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e  tory flag.  Chan
7770: 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61  ging.  ** the va
7780: 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63 69  lue sets a speci
7790: 66 69 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f  fic directory to
77a0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61 74   be used for dat
77b0: 61 62 61 73 65 20 66 69 6c 65 73 20 74 68 61 74  abase files that
77c0: 0a 20 20 2a 2a 20 77 65 72 65 20 73 70 65 63 69  .  ** were speci
77d0: 66 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61  fied with a rela
77e0: 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 20  tive pathname.  
77f0: 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75 6c  Setting to a nul
7800: 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74 73  l string reverts
7810: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 65 66  .  ** to the def
7820: 61 75 6c 74 20 64 61 74 61 62 61 73 65 20 64 69  ault database di
7830: 72 65 63 74 6f 72 79 2c 20 77 68 69 63 68 20 66  rectory, which f
7840: 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  or database file
7850: 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74 68  s specified with
7860: 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74 69 76 65  .  ** a relative
7870: 20 70 61 74 68 20 77 69 6c 6c 20 70 72 6f 62 61   path will proba
7880: 62 6c 79 20 62 65 20 62 61 73 65 64 20 6f 6e 20  bly be based on 
7890: 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72 65  the current dire
78a0: 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a 20 20  ctory for the.  
78b0: 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20 44 61 74  ** process.  Dat
78c0: 61 62 61 73 65 20 66 69 6c 65 20 73 70 65 63 69  abase file speci
78d0: 66 69 65 64 20 77 69 74 68 20 61 6e 20 61 62 73  fied with an abs
78e0: 6f 6c 75 74 65 20 70 61 74 68 20 61 72 65 20 6e  olute path are n
78f0: 6f 74 20 69 6d 70 61 63 74 65 64 0a 20 20 2a 2a  ot impacted.  **
7900: 20 62 79 20 74 68 69 73 20 73 65 74 74 69 6e 67   by this setting
7910: 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
7920: 69 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a 0a  its value..  **.
7930: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7940: 54 79 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f 44  Typ_DATA_STORE_D
7950: 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20  IRECTORY: {.    
7960: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
7970: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
7980: 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33  eText(v, sqlite3
7990: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 29  _data_directory)
79a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
79b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
79c0: 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a  _WSD.      if( z
79d0: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
79e0: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
79f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7a00: 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56  3OsAccess(db->pV
7a10: 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49  fs, zRight, SQLI
7a20: 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
7a30: 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  ITE, &res);.    
7a40: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7a50: 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20  TE_OK || res==0 
7a60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7a70: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7a80: 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74  rse, "not a writ
7a90: 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29  able directory")
7aa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
7ab0: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20   pragma_out;.   
7ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7ae0: 65 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  e(sqlite3_data_d
7af0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20  irectory);.     
7b00: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
7b10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7b20: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7b30: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7b40: 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29  tf("%s", zRight)
7b50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
7b70: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
7b80: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  0;.      }.#endi
7b90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7ba0: 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  _WSD */.    }.  
7bb0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
7bc0: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
7bd0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
7be0: 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  TYLE.  /*.  **  
7bf0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
7c00: 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
7c10: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
7c20: 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f  schema.]lock_pro
7c30: 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61 75 74 6f  xy_file = ":auto
7c40: 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f 70 61  :"|"lock_file_pa
7c50: 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  th".  **.  ** Re
7c60: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
7c70: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 63  value of the loc
7c80: 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20 66 6c 61  k_proxy_file fla
7c90: 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
7ca0: 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73  * the value sets
7cb0: 20 61 20 73 70 65 63 69 66 69 63 20 66 69 6c 65   a specific file
7cc0: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
7cd0: 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
7ce0: 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  locks..  **.  */
7cf0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
7d00: 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49 4c 45 3a  LOCK_PROXY_FILE:
7d10: 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67   {.    if( !zRig
7d20: 68 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  ht ){.      Page
7d30: 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69  r *pPager = sqli
7d40: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
7d50: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 63  b->pBt);.      c
7d60: 68 61 72 20 2a 70 72 6f 78 79 5f 66 69 6c 65 5f  har *proxy_file_
7d70: 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  path = NULL;.   
7d80: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
7d90: 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *pFile = sqlite3
7da0: 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
7db0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7dc0: 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
7dd0: 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  t(pFile, SQLITE_
7de0: 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
7df0: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
7e10: 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29  proxy_file_path)
7e20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
7e30: 6e 67 6c 65 54 65 78 74 28 76 2c 20 70 72 6f 78  ngleText(v, prox
7e40: 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20  y_file_path);.  
7e50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
7e60: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
7e70: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
7e80: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
7e90: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ea0: 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
7eb0: 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29  agerFile(pPager)
7ec0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b  ;.      int res;
7ed0: 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68  .      if( zRigh
7ee0: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  t[0] ){.        
7ef0: 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c  res=sqlite3OsFil
7f00: 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20  eControl(pFile, 
7f10: 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
7f20: 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20  ROXYFILE, .     
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d  zRight);.      }
7f60: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
7f70: 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c  res=sqlite3OsFil
7f80: 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20  eControl(pFile, 
7f90: 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
7fa0: 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20  ROXYFILE, .     
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fd0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
7fe0: 20 20 20 20 20 69 66 28 20 72 65 73 21 3d 53 51       if( res!=SQ
7ff0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8000: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8010: 73 67 28 70 50 61 72 73 65 2c 20 22 66 61 69 6c  sg(pParse, "fail
8020: 65 64 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20 70  ed to set lock p
8030: 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a 20 20 20  roxy file");.   
8040: 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61       goto pragma
8050: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
8060: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8070: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8080: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
8090: 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20 20  NG_STYLE */     
80a0: 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a   .    .  /*.  **
80b0: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
80c0: 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  a.]synchronous. 
80d0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
80e0: 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75  hema.]synchronou
80f0: 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c 7c  s=OFF|ON|NORMAL|
8100: 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20 2a 2a 0a  FULL|EXTRA.  **.
8110: 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73    ** Return or s
8120: 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c  et the local val
8130: 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68 72  ue of the synchr
8140: 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68 61  onous flag.  Cha
8150: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c  nging.  ** the l
8160: 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20  ocal value does 
8170: 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73  not make changes
8180: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c   to the disk fil
8190: 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 64  e and the.  ** d
81a0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c  efault value wil
81b0: 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 68  l be restored th
81c0: 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
81d0: 64 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a 2a  database is.  **
81e0: 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
81f0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 59 4e  case PragTyp_SYN
8200: 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20 20 20  CHRONOUS: {.    
8210: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
8220: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
8230: 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e 73 61 66  eInt(v, pDb->saf
8240: 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a 20 20  ety_level-1);.  
8250: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
8260: 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  f( !db->autoComm
8270: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  it ){.        sq
8280: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8290: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
82a0: 20 20 20 22 53 61 66 65 74 79 20 6c 65 76 65 6c     "Safety level
82b0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e   may not be chan
82c0: 67 65 64 20 69 6e 73 69 64 65 20 61 20 74 72 61  ged inside a tra
82d0: 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20  nsaction");.    
82e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 44 62 21    }else if( iDb!
82f0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =1 ){.        in
8300: 74 20 69 4c 65 76 65 6c 20 3d 20 28 67 65 74 53  t iLevel = (getS
8310: 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67 68  afetyLevel(zRigh
8320: 74 2c 30 2c 31 29 2b 31 29 20 26 20 50 41 47 45  t,0,1)+1) & PAGE
8330: 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
8340: 53 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  SK;.        if( 
8350: 69 4c 65 76 65 6c 3d 3d 30 20 29 20 69 4c 65 76  iLevel==0 ) iLev
8360: 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  el = 1;.        
8370: 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
8380: 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20 20  l = iLevel;.    
8390: 20 20 20 20 70 44 62 2d 3e 62 53 79 6e 63 53 65      pDb->bSyncSe
83a0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  t = 1;.        s
83b0: 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28  etAllPagerFlags(
83c0: 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
83d0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
83e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
83f0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
8400: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
8410: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
8420: 41 47 5f 50 52 41 47 4d 41 53 0a 20 20 63 61 73  AG_PRAGMAS.  cas
8430: 65 20 50 72 61 67 54 79 70 5f 46 4c 41 47 3a 20  e PragTyp_FLAG: 
8440: 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
8450: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74  ==0 ){.      set
8460: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
8470: 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50 72 61 67  mnNames(v, pPrag
8480: 6d 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ma);.      retur
8490: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 28 64  nSingleInt(v, (d
84a0: 62 2d 3e 66 6c 61 67 73 20 26 20 70 50 72 61 67  b->flags & pPrag
84b0: 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20 29 3b 0a  ma->iArg)!=0 );.
84c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
84d0: 20 69 6e 74 20 6d 61 73 6b 20 3d 20 70 50 72 61   int mask = pPra
84e0: 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20 20 2f 2a  gma->iArg;    /*
84f0: 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74 6f   Mask of bits to
8500: 20 73 65 74 20 6f 72 20 63 6c 65 61 72 2e 20 2a   set or clear. *
8510: 2f 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  /.      if( db->
8520: 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  autoCommit==0 ){
8530: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 65  .        /* Fore
8540: 69 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74 20  ign key support 
8550: 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e 61 62 6c  may not be enabl
8560: 65 64 20 6f 72 20 64 69 73 61 62 6c 65 64 20 77  ed or disabled w
8570: 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20 20  hile not.       
8580: 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d   ** in auto-comm
8590: 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 20  it mode.  */.   
85a0: 20 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53       mask &= ~(S
85b0: 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
85c0: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  s);.      }.#if 
85d0: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
85e0: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20  ENTICATION.     
85f0: 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75   if( db->auth.au
8600: 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f 55  thLevel==UAUTH_U
8610: 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ser ){.        /
8620: 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6e  * Do not allow n
8630: 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72 73 20 74  on-admin users t
8640: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63 68  o modify the sch
8650: 65 6d 61 20 61 72 62 69 74 72 61 72 69 6c 79 20  ema arbitrarily 
8660: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  */.        mask 
8670: 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57 72 69 74  &= ~(SQLITE_Writ
8680: 65 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  eSchema);.      
8690: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
86a0: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f  if( sqlite3GetBo
86b0: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29  olean(zRight, 0)
86c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   ){.        db->
86d0: 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20  flags |= mask;. 
86e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
86f0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
8700: 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20   ~mask;.        
8710: 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c 49 54 45  if( mask==SQLITE
8720: 5f 44 65 66 65 72 46 4b 73 20 29 20 64 62 2d 3e  _DeferFKs ) db->
8730: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
8740: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
8750: 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20 6f 66 20       /* Many of 
8760: 74 68 65 20 66 6c 61 67 2d 70 72 61 67 6d 61 73  the flag-pragmas
8770: 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 64 65   modify the code
8780: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
8790: 65 20 53 51 4c 20 0a 20 20 20 20 20 20 2a 2a 20  e SQL .      ** 
87a0: 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e 20 63 6f  compiler (eg. co
87b0: 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e 20 53 6f  unt_changes). So
87c0: 20 61 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   add an opcode t
87d0: 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a 20 20 20  o expire all.   
87e0: 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 53     ** compiled S
87f0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61 66  QL statements af
8800: 74 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20  ter modifying a 
8810: 70 72 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20 20  pragma value..  
8820: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
8830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
8840: 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20  , OP_Expire);.  
8850: 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46      setAllPagerF
8860: 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  lags(db);.    }.
8870: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
8880: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8890: 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41  OMIT_FLAG_PRAGMA
88a0: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
88b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41  LITE_OMIT_SCHEMA
88c0: 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20  _PRAGMAS.  /*.  
88d0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 61 62 6c  **   PRAGMA tabl
88e0: 65 5f 69 6e 66 6f 28 3c 74 61 62 6c 65 3e 29 0a  e_info(<table>).
88f0: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
8900: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 6f   a single row fo
8910: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
8920: 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
8930: 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  . The columns of
8940: 0a 20 20 2a 2a 20 74 68 65 20 72 65 74 75 72 6e  .  ** the return
8950: 65 64 20 64 61 74 61 20 73 65 74 20 61 72 65 3a  ed data set are:
8960: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a 20  .  **.  ** cid: 
8970: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 69 64         Column id
8980: 20 28 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20   (numbered from 
8990: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 73  left to right, s
89a0: 74 61 72 74 69 6e 67 20 61 74 20 30 29 0a 20 20  tarting at 0).  
89b0: 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20 20 20 43  ** name:       C
89c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a 20  olumn name.  ** 
89d0: 74 79 70 65 3a 20 20 20 20 20 20 20 43 6f 6c 75  type:       Colu
89e0: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  mn declaration t
89f0: 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75 6c  ype..  ** notnul
8a00: 6c 3a 20 20 20 20 54 72 75 65 20 69 66 20 27 4e  l:    True if 'N
8a10: 4f 54 20 4e 55 4c 4c 27 20 69 73 20 70 61 72 74  OT NULL' is part
8a20: 20 6f 66 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61   of column decla
8a30: 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c 74  ration.  ** dflt
8a40: 5f 76 61 6c 75 65 3a 20 54 68 65 20 64 65 66 61  _value: The defa
8a50: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
8a60: 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e 79  e column, if any
8a70: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
8a80: 61 67 54 79 70 5f 54 41 42 4c 45 5f 49 4e 46 4f  agTyp_TABLE_INFO
8a90: 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a  : if( zRight ){.
8aa0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8ab0: 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
8ac0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
8ad0: 50 61 72 73 65 2c 20 4c 4f 43 41 54 45 5f 4e 4f  Parse, LOCATE_NO
8ae0: 45 52 52 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  ERR, zRight, zDb
8af0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
8b00: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  ){.      int i, 
8b10: 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69  k;.      int nHi
8b20: 64 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  dden = 0;.      
8b30: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
8b40: 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
8b50: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
8b60: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
8b70: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
8b80: 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 73 71 6c  m = 6;.      sql
8b90: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
8ba0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
8bb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8bc0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
8bd0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
8be0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
8bf0: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
8c00: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
8c10: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
8c20: 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
8c30: 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f 6c 29 20 29  enColumn(pCol) )
8c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69 64  {.          nHid
8c50: 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  den++;.         
8c60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8c70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8c80: 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73   (pCol->colFlags
8c90: 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b   & COLFLAG_PRIMK
8ca0: 45 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  EY)==0 ){.      
8cb0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20      k = 0;.     
8cc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b     }else if( pPk
8cd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8ce0: 20 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20   k = 1;.        
8cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8d00: 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61   for(k=1; k<=pTa
8d10: 62 2d 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e  b->nCol && pPk->
8d20: 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69  aiColumn[k-1]!=i
8d30: 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  ; k++){}.       
8d40: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
8d50: 74 28 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d  t( pCol->pDflt==
8d60: 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  0 || pCol->pDflt
8d70: 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b  ->op==TK_SPAN );
8d80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8d90: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
8da0: 20 31 2c 20 22 69 73 73 69 73 69 22 2c 0a 20 20   1, "issisi",.  
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2d 6e               i-n
8dc0: 48 69 64 64 65 6e 2c 0a 20 20 20 20 20 20 20 20  Hidden,.        
8dd0: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61         pCol->zNa
8de0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
8df0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
8e00: 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 0a 20  Type(pCol,""),. 
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
8e20: 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20  ol->notNull ? 1 
8e30: 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : 0,.           
8e40: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
8e50: 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75  ? pCol->pDflt->u
8e60: 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c 0a 20 20 20  .zToken : 0,.   
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 6b 29 3b 0a              k);.
8e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8e90: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64  }.  break;..#ifd
8ea0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8eb0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53    case PragTyp_S
8ec0: 54 41 54 53 3a 20 7b 0a 20 20 20 20 49 6e 64 65  TATS: {.    Inde
8ed0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 48 61 73  x *pIdx;.    Has
8ee0: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 20 20 70 50  hElem *i;.    pP
8ef0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a  arse->nMem = 5;.
8f00: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
8f10: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
8f20: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 66 6f  se, iDb);.    fo
8f30: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
8f40: 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
8f50: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20  a->tblHash); i; 
8f60: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
8f70: 28 69 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  (i)){.      Tabl
8f80: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
8f90: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
8fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
8fb0: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
8fc0: 73 69 69 69 22 2c 0a 20 20 20 20 20 20 20 20 20  siii",.         
8fd0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
8fe0: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
8ff0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 73 7a          pTab->sz
9000: 54 61 62 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  TabRow,.        
9010: 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
9020: 45 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Est,.           
9030: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 29 3b  pTab->tabFlags);
9040: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
9050: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
9060: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
9070: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73  Next){.        s
9080: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
9090: 6f 61 64 28 76 2c 20 32 2c 20 22 73 69 69 69 58  oad(v, 2, "siiiX
90a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  ",.           pI
90b0: 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  dx->zName,.     
90c0: 20 20 20 20 20 20 70 49 64 78 2d 3e 73 7a 49 64        pIdx->szId
90d0: 78 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  xRow,.          
90e0: 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45   pIdx->aiRowLogE
90f0: 73 74 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  st[0],.         
9100: 20 20 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31    pIdx->hasStat1
9110: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9120: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9130: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
9140: 20 35 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   5);.      }.   
9150: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9160: 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65 20 50  #endif..  case P
9170: 72 61 67 54 79 70 5f 49 4e 44 45 58 5f 49 4e 46  ragTyp_INDEX_INF
9180: 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b  O: if( zRight ){
9190: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
91a0: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
91b0: 62 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71  b;.    pIdx = sq
91c0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
91d0: 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  b, zRight, zDb);
91e0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b  .    if( pIdx ){
91f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
9200: 20 20 20 20 69 6e 74 20 6d 78 3b 0a 20 20 20 20      int mx;.    
9210: 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69    if( pPragma->i
9220: 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Arg ){.        /
9230: 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78  * PRAGMA index_x
9240: 69 6e 66 6f 20 28 6e 65 77 65 72 20 76 65 72 73  info (newer vers
9250: 69 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20 72 6f  ion with more ro
9260: 77 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 29 20  ws and columns) 
9270: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20  */.        mx = 
9280: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
9290: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
92a0: 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 7d  Mem = 6;.      }
92b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
92c0: 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 69 6e   PRAGMA index_in
92d0: 66 6f 20 28 6c 65 67 61 63 79 20 76 65 72 73 69  fo (legacy versi
92e0: 6f 6e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  on) */.        m
92f0: 78 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  x = pIdx->nKeyCo
9300: 6c 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  l;.        pPars
9310: 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20  e->nMem = 3;.   
9320: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 20     }.      pTab 
9330: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a  = pIdx->pTable;.
9340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
9350: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
9360: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
9370: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
9380: 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61 67 6d 61 2d  ->nMem<=pPragma-
9390: 3e 6e 50 72 61 67 43 4e 61 6d 65 20 29 3b 0a 20  >nPragCName );. 
93a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
93b0: 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mx; i++){.      
93c0: 20 20 69 31 36 20 63 6e 75 6d 20 3d 20 70 49 64    i16 cnum = pId
93d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
93e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
93f0: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
9400: 31 2c 20 22 69 69 73 58 22 2c 20 69 2c 20 63 6e  1, "iisX", i, cn
9410: 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 63 6e 75 6d 3c 30 20 3f 20 30 20 3a 20 70 54   cnum<0 ? 0 : pT
9440: 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a  ab->aCol[cnum].z
9450: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
9460: 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67  f( pPragma->iArg
9470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
9480: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9490: 61 64 28 76 2c 20 34 2c 20 22 69 73 69 58 22 2c  ad(v, 4, "isiX",
94a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
94b0: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
94c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ,.            pI
94d0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 0a 20  dx->azColl[i],. 
94e0: 20 20 20 20 20 20 20 20 20 20 20 69 3c 70 49 64             i<pId
94f0: 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20  x->nKeyCol);.   
9500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
9510: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9520: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9530: 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 1, pParse->nMe
9540: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
9550: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
9560: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 49    case PragTyp_I
9570: 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66 28 20 7a  NDEX_LIST: if( z
9580: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 49 6e 64  Right ){.    Ind
9590: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61  ex *pIdx;.    Ta
95a0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
95b0: 6e 74 20 69 3b 0a 20 20 20 20 70 54 61 62 20 3d  nt i;.    pTab =
95c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
95d0: 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  e(db, zRight, zD
95e0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
95f0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
9600: 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20  ->nMem = 5;.    
9610: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
9620: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
9630: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f  , iDb);.      fo
9640: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
9650: 64 65 78 2c 20 69 3d 30 3b 20 70 49 64 78 3b 20  dex, i=0; pIdx; 
9660: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
9670: 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
9680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f 72  const char *azOr
9690: 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c 20  igin[] = { "c", 
96a0: 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a 20 20 20  "u", "pk" };.   
96b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
96c0: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
96d0: 22 69 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20  "isisi",.       
96e0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20      i,.         
96f0: 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20    pIdx->zName,. 
9700: 20 20 20 20 20 20 20 20 20 20 49 73 55 6e 69 71            IsUniq
9710: 75 65 49 6e 64 65 78 28 70 49 64 78 29 2c 0a 20  ueIndex(pIdx),. 
9720: 20 20 20 20 20 20 20 20 20 20 61 7a 4f 72 69 67            azOrig
9730: 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54 79 70 65  in[pIdx->idxType
9740: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  ],.           pI
9750: 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
9760: 65 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e!=0);.      }. 
9770: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
9780: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
9790: 70 5f 44 41 54 41 42 41 53 45 5f 4c 49 53 54 3a  p_DATABASE_LIST:
97a0: 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
97b0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
97c0: 20 33 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   3;.    for(i=0;
97d0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
97e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
97f0: 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[i].pBt==0 ) 
9800: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9810: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
9820: 69 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d 30 20 29  i].zDbSName!=0 )
9830: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9840: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
9850: 31 2c 20 22 69 73 73 22 2c 0a 20 20 20 20 20 20  1, "iss",.      
9860: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20 64     i,.         d
9870: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
9880: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  me,.         sql
9890: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
98a0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  name(db->aDb[i].
98b0: 70 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pBt));.    }.  }
98c0: 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73  .  break;..  cas
98d0: 65 20 50 72 61 67 54 79 70 5f 43 4f 4c 4c 41 54  e PragTyp_COLLAT
98e0: 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20  ION_LIST: {.    
98f0: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 48  int i = 0;.    H
9900: 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20  ashElem *p;.    
9910: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32  pParse->nMem = 2
9920: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
9930: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
9940: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 70 3b 20 70  >aCollSeq); p; p
9950: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9960: 70 29 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  p)){.      CollS
9970: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c  eq *pColl = (Col
9980: 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73  lSeq *)sqliteHas
9990: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20  hData(p);.      
99a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
99b0: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 22 2c  Load(v, 1, "is",
99c0: 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   i++, pColl->zNa
99d0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
99e0: 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66 20   break;..#ifdef 
99f0: 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43  SQLITE_INTROSPEC
9a00: 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 63  TION_PRAGMAS.  c
9a10: 61 73 65 20 50 72 61 67 54 79 70 5f 46 55 4e 43  ase PragTyp_FUNC
9a20: 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20  TION_LIST: {.   
9a30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 48 61 73 68   int i;.    Hash
9a40: 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 46 75 6e  Elem *j;.    Fun
9a50: 63 44 65 66 20 2a 70 3b 0a 20 20 20 20 70 50 61  cDef *p;.    pPa
9a60: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20  rse->nMem = 2;. 
9a70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51     for(i=0; i<SQ
9a80: 4c 49 54 45 5f 46 55 4e 43 5f 48 41 53 48 5f 53  LITE_FUNC_HASH_S
9a90: 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  Z; i++){.      f
9aa0: 6f 72 28 70 3d 73 71 6c 69 74 65 33 42 75 69 6c  or(p=sqlite3Buil
9ab0: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 2e 61 5b 69  tinFunctions.a[i
9ac0: 5d 3b 20 70 3b 20 70 3d 70 2d 3e 75 2e 70 48 61  ]; p; p=p->u.pHa
9ad0: 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  sh ){.        sq
9ae0: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9af0: 61 64 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70  ad(v, 1, "si", p
9b00: 2d 3e 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20  ->zName, 1);.   
9b10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9b20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
9b30: 75 6c 74 52 6f 77 2c 20 31 2c 20 32 29 3b 0a 20  ultRow, 1, 2);. 
9b40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9b50: 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65 48 61 73   for(j=sqliteHas
9b60: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e  hFirst(&db->aFun
9b70: 63 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69 74 65 48  c); j; j=sqliteH
9b80: 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a 20 20 20  ashNext(j)){.   
9b90: 20 20 20 70 20 3d 20 28 46 75 6e 63 44 65 66 2a     p = (FuncDef*
9ba0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
9bb0: 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  j);.      sqlite
9bc0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9bd0: 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d 3e 7a 4e  , 1, "si", p->zN
9be0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ame, 0);.      s
9bf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9c00: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9c10: 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 2);.    }. 
9c20: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66   }.  break;..#if
9c30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9c40: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
9c50: 63 61 73 65 20 50 72 61 67 54 79 70 5f 4d 4f 44  case PragTyp_MOD
9c60: 55 4c 45 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20  ULE_LIST: {.    
9c70: 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20  HashElem *j;.   
9c80: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9c90: 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c  1;.    for(j=sql
9ca0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9cb0: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 6a 3b 20 6a  ->aModule); j; j
9cc0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9cd0: 6a 29 29 7b 0a 20 20 20 20 20 20 4d 6f 64 75 6c  j)){.      Modul
9ce0: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
9cf0: 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
9d00: 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  a(j);.      sqli
9d10: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9d20: 28 76 2c 20 31 2c 20 22 73 22 2c 20 70 4d 6f 64  (v, 1, "s", pMod
9d30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
9d40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9d50: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
9d60: 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  w, 1, 1);.    }.
9d70: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
9d80: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9d90: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
9da0: 2a 2f 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  */..  case PragT
9db0: 79 70 5f 50 52 41 47 4d 41 5f 4c 49 53 54 3a 20  yp_PRAGMA_LIST: 
9dc0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
9dd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
9de0: 79 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d  ySize(aPragmaNam
9df0: 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e); i++){.      
9e00: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9e10: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 22 2c 20  Load(v, 1, "s", 
9e20: 61 50 72 61 67 6d 61 4e 61 6d 65 5b 69 5d 2e 7a  aPragmaName[i].z
9e30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
9e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9e50: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
9e60: 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  1, 1);.    }.  }
9e70: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
9e80: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f   /* SQLITE_INTRO
9e90: 53 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53  SPECTION_PRAGMAS
9ea0: 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
9eb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
9ec0: 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  A_PRAGMAS */..#i
9ed0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9ee0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
9ef0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52  case PragTyp_FOR
9f00: 45 49 47 4e 5f 4b 45 59 5f 4c 49 53 54 3a 20 69  EIGN_KEY_LIST: i
9f10: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
9f20: 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20 20 20 20   FKey *pFK;.    
9f30: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
9f40: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
9f50: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69  indTable(db, zRi
9f60: 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  ght, zDb);.    i
9f70: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
9f80: 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e 70 46 4b   pFK = pTab->pFK
9f90: 65 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  ey;.      if( pF
9fa0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  K ){.        int
9fb0: 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 20   i = 0; .       
9fc0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9fd0: 38 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  8;.        sqlit
9fe0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
9ff0: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
a000: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 70  .        while(p
a010: 46 4b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  FK){.          i
a020: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
a030: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e  for(j=0; j<pFK->
a040: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
a050: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a060: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
a070: 31 2c 20 22 69 69 73 73 73 73 73 73 22 2c 0a 20  1, "iissssss",. 
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20    i,.           
a0a0: 20 20 20 20 20 20 20 20 6a 2c 0a 20 20 20 20 20          j,.     
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
a0c0: 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20 20 20 20 20  K->zTo,.        
a0d0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
a0e0: 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61 43 6f 6c 5b  >aCol[pFK->aCol[
a0f0: 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 2c  j].iFrom].zName,
a100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a110: 20 20 20 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d      pFK->aCol[j]
a120: 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  .zCol,.         
a130: 20 20 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e            action
a140: 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f  Name(pFK->aActio
a150: 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f 4e 20 55 50  n[1]),  /* ON UP
a160: 44 41 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  DATE */.        
a170: 20 20 20 20 20 20 20 20 20 20 20 61 63 74 69 6f             actio
a180: 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69  nName(pFK->aActi
a190: 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20 4f 4e 20 44  on[0]),  /* ON D
a1a0: 45 4c 45 54 45 20 2a 2f 0a 20 20 20 20 20 20 20  ELETE */.       
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 4f 4e              "NON
a1c0: 45 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  E");.          }
a1d0: 0a 20 20 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a  .          ++i;.
a1e0: 20 20 20 20 20 20 20 20 20 20 70 46 4b 20 3d 20            pFK = 
a1f0: 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a  pFK->pNextFrom;.
a200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a210: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
a220: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  eak;.#endif /* !
a230: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a240: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29  MIT_FOREIGN_KEY)
a250: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
a260: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
a270: 5f 4b 45 59 0a 23 69 66 6e 64 65 66 20 53 51 4c  _KEY.#ifndef SQL
a280: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
a290: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
a2a0: 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 43 48 45 43  FOREIGN_KEY_CHEC
a2b0: 4b 3a 20 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70  K: {.    FKey *p
a2c0: 46 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  FK;             
a2d0: 2f 2a 20 41 20 66 6f 72 65 69 67 6e 20 6b 65 79  /* A foreign key
a2e0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
a2f0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
a300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69            /* Chi
a310: 6c 64 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ld table contain
a320: 20 22 52 45 46 45 52 45 4e 43 45 53 22 20 6b 65   "REFERENCES" ke
a330: 79 77 6f 72 64 20 2a 2f 0a 20 20 20 20 54 61 62  yword */.    Tab
a340: 6c 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  le *pParent;    
a350: 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 74 61      /* Parent ta
a360: 62 6c 65 20 74 68 61 74 20 63 68 69 6c 64 20 70  ble that child p
a370: 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20  oints to */.    
a380: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
a390: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
a3a0: 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  in the parent ta
a3b0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ble */.    int i
a3c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a3d0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a3e0: 72 3a 20 20 46 6f 72 65 69 67 6e 20 6b 65 79 20  r:  Foreign key 
a3f0: 6e 75 6d 62 65 72 20 66 6f 72 20 70 54 61 62 20  number for pTab 
a400: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20  */.    int j;   
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a420: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20   Loop counter:  
a430: 46 69 65 6c 64 20 6f 66 20 74 68 65 20 66 6f 72  Field of the for
a440: 65 69 67 6e 20 6b 65 79 20 2a 2f 0a 20 20 20 20  eign key */.    
a450: 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
a460: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
a470: 6f 75 6e 74 65 72 3a 20 20 4e 65 78 74 20 74 61  ounter:  Next ta
a480: 62 6c 65 20 69 6e 20 73 63 68 65 6d 61 20 2a 2f  ble in schema */
a490: 0a 20 20 20 20 69 6e 74 20 78 3b 20 20 20 20 20  .    int x;     
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
a4b0: 65 73 75 6c 74 20 76 61 72 69 61 62 6c 65 20 2a  esult variable *
a4c0: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 73  /.    int regRes
a4d0: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ult;         /* 
a4e0: 33 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  3 registers to h
a4f0: 6f 6c 64 20 61 20 72 65 73 75 6c 74 20 72 6f 77  old a result row
a500: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4b   */.    int regK
a510: 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ey;            /
a520: 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f  * Register to ho
a530: 6c 64 20 6b 65 79 20 66 6f 72 20 63 68 65 63 6b  ld key for check
a540: 69 6e 67 20 74 68 65 20 46 4b 20 2a 2f 0a 20 20  ing the FK */.  
a550: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 20 20 20    int regRow;   
a560: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
a570: 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20  sters to hold a 
a580: 72 6f 77 20 66 72 6f 6d 20 70 54 61 62 20 2a 2f  row from pTab */
a590: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70  .    int addrTop
a5a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
a5b0: 6f 70 20 6f 66 20 61 20 6c 6f 6f 70 20 63 68 65  op of a loop che
a5c0: 63 6b 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65  cking foreign ke
a5d0: 79 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ys */.    int ad
a5e0: 64 72 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20  drOk;           
a5f0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
a600: 20 74 68 65 20 6b 65 79 20 69 73 20 4f 4b 20 2a   the key is OK *
a610: 2f 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c  /.    int *aiCol
a620: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
a630: 63 68 69 6c 64 20 74 6f 20 70 61 72 65 6e 74 20  child to parent 
a640: 63 6f 6c 75 6d 6e 20 6d 61 70 70 69 6e 67 20 2a  column mapping *
a650: 2f 0a 0a 20 20 20 20 72 65 67 52 65 73 75 6c 74  /..    regResult
a660: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
a670: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
a680: 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20 20 20 72 65  Mem += 4;.    re
a690: 67 4b 65 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gKey = ++pParse-
a6a0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 52 6f  >nMem;.    regRo
a6b0: 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
a6c0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  em;.    sqlite3C
a6d0: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
a6e0: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
a6f0: 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68    k = sqliteHash
a700: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
a710: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db].pSchema->tbl
a720: 48 61 73 68 29 3b 0a 20 20 20 20 77 68 69 6c 65  Hash);.    while
a730: 28 20 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ( k ){.      if(
a740: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
a750: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
a760: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
a770: 72 73 65 2c 20 30 2c 20 7a 52 69 67 68 74 2c 20  rse, 0, zRight, 
a780: 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 6b 20  zDb);.        k 
a790: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
a7a0: 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  {.        pTab =
a7b0: 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
a7c0: 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
a7d0: 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61      k = sqliteHa
a7e0: 73 68 4e 65 78 74 28 6b 29 3b 0a 20 20 20 20 20  shNext(k);.     
a7f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 61   }.      if( pTa
a800: 62 3d 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 46  b==0 || pTab->pF
a810: 4b 65 79 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Key==0 ) continu
a820: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
a830: 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
a840: 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
a850: 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
a860: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
a870: 61 62 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e  ab->nCol+regRow>
a880: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70  pParse->nMem ) p
a890: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54  Parse->nMem = pT
a8a0: 61 62 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f  ab->nCol + regRo
a8b0: 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
a8c0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
a8d0: 2c 20 30 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  , 0, iDb, pTab, 
a8e0: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
a8f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
a900: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 72 65 67  oadString(v, reg
a910: 52 65 73 75 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e  Result, pTab->zN
a920: 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
a930: 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70  i=1, pFK=pTab->p
a940: 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20  FKey; pFK; i++, 
a950: 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72  pFK=pFK->pNextFr
a960: 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  om){.        pPa
a970: 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69  rent = sqlite3Fi
a980: 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d  ndTable(db, pFK-
a990: 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20  >zTo, zDb);.    
a9a0: 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d      if( pParent=
a9b0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
a9c0: 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b         pIdx = 0;
a9d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a9e0: 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
a9f0: 2c 20 69 44 62 2c 20 70 50 61 72 65 6e 74 2d 3e  , iDb, pParent->
aa00: 74 6e 75 6d 2c 20 30 2c 20 70 50 61 72 65 6e 74  tnum, 0, pParent
aa10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
aa20: 20 20 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c    x = sqlite3FkL
aa30: 6f 63 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  ocateIndex(pPars
aa40: 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c  e, pParent, pFK,
aa50: 20 26 70 49 64 78 2c 20 30 29 3b 0a 20 20 20 20   &pIdx, 0);.    
aa60: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a      if( x==0 ){.
aa70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
aa80: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  dx==0 ){.       
aa90: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
aaa0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 2c  Table(pParse, i,
aab0: 20 69 44 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f   iDb, pParent, O
aac0: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
aad0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
aae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
aaf0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ab00: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20 70  P_OpenRead, i, p
ab10: 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
ab20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
ab30: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
ab40: 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
ab50: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  x);.          }.
ab60: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ab70: 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a           k = 0;.
ab80: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ab90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aba0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
abb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
abc0: 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b 0a 20 20 20  || pFK==0 );.   
abd0: 20 20 20 69 66 28 20 70 46 4b 20 29 20 62 72 65     if( pFK ) bre
abe0: 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ak;.      if( pP
abf0: 61 72 73 65 2d 3e 6e 54 61 62 3c 69 20 29 20 70  arse->nTab<i ) p
ac00: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69 3b  Parse->nTab = i;
ac10: 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d  .      addrTop =
ac20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ac30: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
ac40: 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
ac50: 65 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  e(v);.      for(
ac60: 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70  i=1, pFK=pTab->p
ac70: 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20  FKey; pFK; i++, 
ac80: 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72  pFK=pFK->pNextFr
ac90: 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  om){.        pPa
aca0: 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69  rent = sqlite3Fi
acb0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d  ndTable(db, pFK-
acc0: 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20  >zTo, zDb);.    
acd0: 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
ace0: 20 20 20 20 20 20 61 69 43 6f 6c 73 20 3d 20 30        aiCols = 0
acf0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
ad00: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  arent ){.       
ad10: 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 46 6b     x = sqlite3Fk
ad20: 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50 61 72  LocateIndex(pPar
ad30: 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 46 4b  se, pParent, pFK
ad40: 2c 20 26 70 49 64 78 2c 20 26 61 69 43 6f 6c 73  , &pIdx, &aiCols
ad50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
ad60: 65 72 74 28 20 78 3d 3d 30 20 29 3b 0a 20 20 20  ert( x==0 );.   
ad70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
ad80: 64 64 72 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  ddrOk = sqlite3V
ad90: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
ada0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e  ..        /* Gen
adb0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
adc0: 61 64 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79  ad the child key
add0: 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 72 65 67   values into reg
ade0: 69 73 74 65 72 73 0a 20 20 20 20 20 20 20 20 2a  isters.        *
adf0: 2a 20 72 65 67 52 6f 77 2e 2e 72 65 67 52 6f 77  * regRow..regRow
ae00: 2b 6e 2e 20 49 66 20 61 6e 79 20 6f 66 20 74 68  +n. If any of th
ae10: 65 20 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75  e child key valu
ae20: 65 73 20 61 72 65 20 4e 55 4c 4c 2c 20 74 68 69  es are NULL, thi
ae30: 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  s .        ** ro
ae40: 77 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20 61  w cannot cause a
ae50: 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e 20  n FK violation. 
ae60: 4a 75 6d 70 20 64 69 72 65 63 74 6c 79 20 74 6f  Jump directly to
ae70: 20 61 64 64 72 4f 6b 20 69 6e 20 0a 20 20 20 20   addrOk in .    
ae80: 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
ae90: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  . */.        for
aea0: 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f  (j=0; j<pFK->nCo
aeb0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
aec0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 61 69     int iCol = ai
aed0: 43 6f 6c 73 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d  Cols ? aiCols[j]
aee0: 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e   : pFK->aCol[j].
aef0: 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20  iFrom;.         
af00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
af10: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
af20: 28 76 2c 20 70 54 61 62 2c 20 30 2c 20 69 43 6f  (v, pTab, 0, iCo
af30: 6c 2c 20 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20  l, regRow+j);.  
af40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
af50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
af60: 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a  IsNull, regRow+j
af70: 2c 20 61 64 64 72 4f 6b 29 3b 20 56 64 62 65 43  , addrOk); VdbeC
af80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
af90: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
afa0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
afb0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 70 61 72  to query the par
afc0: 65 6e 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20  ent index for a 
afd0: 6d 61 74 63 68 69 6e 67 20 70 61 72 65 6e 74 0a  matching parent.
afe0: 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 2e 20          ** key. 
aff0: 49 66 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f  If a match is fo
b000: 75 6e 64 2c 20 6a 75 6d 70 20 74 6f 20 61 64 64  und, jump to add
b010: 72 4f 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  rOk. */.        
b020: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
b030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b040: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
b050: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
b060: 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67  , pFK->nCol, reg
b070: 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
b080: 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41     sqlite3IndexA
b090: 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c 70 49  ffinityStr(db,pI
b0a0: 64 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b  dx), pFK->nCol);
b0b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b0c0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
b0d0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c 20  v, OP_Found, i, 
b0e0: 61 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79 2c 20  addrOk, regKey, 
b0f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  0);.          Vd
b100: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b110: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
b120: 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20   pParent ){.    
b130: 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 20 3d 20        int jmp = 
b140: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
b150: 6e 74 41 64 64 72 28 76 29 2b 32 3b 0a 20 20 20  ntAddr(v)+2;.   
b160: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b170: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
b180: 65 65 6b 52 6f 77 69 64 2c 20 69 2c 20 6a 6d 70  eekRowid, i, jmp
b190: 2c 20 72 65 67 52 6f 77 29 3b 20 56 64 62 65 43  , regRow); VdbeC
b1a0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b1b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b1c0: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 4f 6b 29  eGoto(v, addrOk)
b1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
b1e0: 72 74 28 20 70 46 4b 2d 3e 6e 43 6f 6c 3d 3d 31  rt( pFK->nCol==1
b1f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   );.        }.. 
b200: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
b210: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 70 6f 72  te code to repor
b220: 74 20 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f  t an FK violatio
b230: 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  n to the caller.
b240: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
b250: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
b260: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
b270: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b280: 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65   OP_Rowid, 0, re
b290: 67 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20  gResult+1);.    
b2a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b2c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
b2d0: 6c 2c 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2b  l, 0, regResult+
b2e0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
b2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b300: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 72 65  eMultiLoad(v, re
b310: 67 52 65 73 75 6c 74 2b 32 2c 20 22 73 69 58 22  gResult+2, "siX"
b320: 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29  , pFK->zTo, i-1)
b330: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b340: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b350: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67  P_ResultRow, reg
b360: 52 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20 20 20  Result, 4);.    
b370: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
b380: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
b390: 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20  ddrOk);.        
b3a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b3b0: 2c 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20  , aiCols);.     
b3c0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b3d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b3e0: 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64 72 54 6f  _Next, 0, addrTo
b3f0: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
b400: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
b410: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
b420: 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
b430: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
b440: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
b450: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b460: 54 52 49 47 47 45 52 29 20 2a 2f 0a 23 65 6e 64  TRIGGER) */.#end
b470: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
b480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
b490: 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e  GN_KEY) */..#ifn
b4a0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 63 61 73  def NDEBUG.  cas
b4b0: 65 20 50 72 61 67 54 79 70 5f 50 41 52 53 45 52  e PragTyp_PARSER
b4c0: 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66  _TRACE: {.    if
b4d0: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
b4e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74    if( sqlite3Get
b4f0: 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20  Boolean(zRight, 
b500: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0) ){.        sq
b510: 6c 69 74 65 33 50 61 72 73 65 72 54 72 61 63 65  lite3ParserTrace
b520: 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73 65 72  (stdout, "parser
b530: 3a 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : ");.      }els
b540: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b550: 65 33 50 61 72 73 65 72 54 72 61 63 65 28 30 2c  e3ParserTrace(0,
b560: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
b570: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
b580: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 69  #endif..  /* Rei
b590: 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b 45 20  nstall the LIKE 
b5a0: 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f  and GLOB functio
b5b0: 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61 6e 74  ns.  The variant
b5c0: 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20 75 73   of LIKE.  ** us
b5d0: 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73 65 20  ed will be case 
b5e0: 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e 6f 74  sensitive or not
b5f0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
b600: 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 63 61  e RHS..  */.  ca
b610: 73 65 20 50 72 61 67 54 79 70 5f 43 41 53 45 5f  se PragTyp_CASE_
b620: 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 3a 20  SENSITIVE_LIKE: 
b630: 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
b640: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b650: 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e  3RegisterLikeFun
b660: 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c 69 74  ctions(db, sqlit
b670: 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  e3GetBoolean(zRi
b680: 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a  ght, 0));.    }.
b690: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69    }.  break;..#i
b6a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54  fndef SQLITE_INT
b6b0: 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52  EGRITY_CHECK_ERR
b6c0: 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65 20  OR_MAX.# define 
b6d0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59  SQLITE_INTEGRITY
b6e0: 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58  _CHECK_ERROR_MAX
b6f0: 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66   100.#endif..#if
b700: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b710: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
b720: 0a 20 20 2f 2a 20 20 20 20 50 52 41 47 4d 41 20  .  /*    PRAGMA 
b730: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
b740: 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 69    **    PRAGMA i
b750: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28 4e  ntegrity_check(N
b760: 29 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41  ).  **    PRAGMA
b770: 20 71 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20 2a   quick_check.  *
b780: 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75 69 63  *    PRAGMA quic
b790: 6b 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a 0a  k_check(N).  **.
b7a0: 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20    ** Verify the 
b7b0: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
b7c0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a   database..  **.
b7d0: 20 20 2a 2a 20 54 68 65 20 22 71 75 69 63 6b 5f    ** The "quick_
b7e0: 63 68 65 63 6b 22 20 69 73 20 72 65 64 75 63 65  check" is reduce
b7f0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20  d version of .  
b800: 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  ** integrity_che
b810: 63 6b 20 64 65 73 69 67 6e 65 64 20 74 6f 20 64  ck designed to d
b820: 65 74 65 63 74 20 6d 6f 73 74 20 64 61 74 61 62  etect most datab
b830: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 0a 20  ase corruption. 
b840: 20 2a 2a 20 77 69 74 68 6f 75 74 20 74 68 65 20   ** without the 
b850: 6f 76 65 72 68 65 61 64 20 6f 66 20 63 72 6f 73  overhead of cros
b860: 73 2d 63 68 65 63 6b 69 6e 67 20 69 6e 64 65 78  s-checking index
b870: 65 73 2e 20 20 51 75 69 63 6b 5f 63 68 65 63 6b  es.  Quick_check
b880: 0a 20 20 2a 2a 20 69 73 20 6c 69 6e 65 61 72 20  .  ** is linear 
b890: 74 69 6d 65 20 77 68 65 72 65 61 73 65 20 69 6e  time wherease in
b8a0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 69 73  tegrity_check is
b8b0: 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a 2f 0a   O(NlogN)..  */.
b8c0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 49    case PragTyp_I
b8d0: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 3a 20  NTEGRITY_CHECK: 
b8e0: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20  {.    int i, j, 
b8f0: 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a 0a 20 20  addr, mxErr;..  
b900: 20 20 69 6e 74 20 69 73 51 75 69 63 6b 20 3d 20    int isQuick = 
b910: 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28  (sqlite3Tolower(
b920: 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71 27 29 3b  zLeft[0])=='q');
b930: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
b940: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 77  PRAGMA command w
b950: 61 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  as of the form "
b960: 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69 6e 74 65  PRAGMA <db>.inte
b970: 67 72 69 74 79 5f 63 68 65 63 6b 22 2c 0a 20 20  grity_check",.  
b980: 20 20 2a 2a 20 74 68 65 6e 20 69 44 62 20 69 73    ** then iDb is
b990: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
b9a0: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
b9b0: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
b9c0: 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  <db>..    ** In 
b9d0: 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 69  this case, the i
b9e0: 6e 74 65 67 72 69 74 79 20 6f 66 20 64 61 74 61  ntegrity of data
b9f0: 62 61 73 65 20 69 44 62 20 6f 6e 6c 79 20 69 73  base iDb only is
ba00: 20 76 65 72 69 66 69 65 64 20 62 79 0a 20 20 20   verified by.   
ba10: 20 2a 2a 20 74 68 65 20 56 44 42 45 20 63 72 65   ** the VDBE cre
ba20: 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20 20 20 20  ated below..    
ba30: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  **.    ** Otherw
ba40: 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6d 6d  ise, if the comm
ba50: 61 6e 64 20 77 61 73 20 73 69 6d 70 6c 79 20 22  and was simply "
ba60: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
ba70: 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20 20 20 20  _check" (or.    
ba80: 2a 2a 20 22 50 52 41 47 4d 41 20 71 75 69 63 6b  ** "PRAGMA quick
ba90: 5f 63 68 65 63 6b 22 29 2c 20 74 68 65 6e 20 69  _check"), then i
baa0: 44 62 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  Db is set to 0. 
bab0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65  In this case, se
bac0: 74 20 69 44 62 0a 20 20 20 20 2a 2a 20 74 6f 20  t iDb.    ** to 
bad0: 2d 31 20 68 65 72 65 2c 20 74 6f 20 69 6e 64 69  -1 here, to indi
bae0: 63 61 74 65 20 74 68 61 74 20 74 68 65 20 56 44  cate that the VD
baf0: 42 45 20 73 68 6f 75 6c 64 20 76 65 72 69 66 79  BE should verify
bb00: 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 0a 20   the integrity. 
bb10: 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 61 74 74     ** of all att
bb20: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2e  ached databases.
bb30: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
bb40: 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20 61   iDb>=0 );.    a
bb50: 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 7c 7c  ssert( iDb==0 ||
bb60: 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20 20 20 20   pId2->z );.    
bb70: 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d 30 20 29  if( pId2->z==0 )
bb80: 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20 20 20 20   iDb = -1;..    
bb90: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
bba0: 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 2a  e VDBE program *
bbb0: 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  /.    pParse->nM
bbc0: 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a 20  em = 6;..    /* 
bbd0: 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
bbe0: 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a 20  error count */. 
bbf0: 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49 54     mxErr = SQLIT
bc00: 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  E_INTEGRITY_CHEC
bc10: 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20  K_ERROR_MAX;.   
bc20: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
bc30: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49       sqlite3GetI
bc40: 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 6d 78  nt32(zRight, &mx
bc50: 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Err);.      if( 
bc60: 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20 20 20  mxErr<=0 ){.    
bc70: 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49      mxErr = SQLI
bc80: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
bc90: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20  CK_ERROR_MAX;.  
bca0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
bcb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bcc0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
bcd0: 20 6d 78 45 72 72 2d 31 2c 20 31 29 3b 20 2f 2a   mxErr-1, 1); /*
bce0: 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20 65 72   reg[1] holds er
bcf0: 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a 20 20  rors left */..  
bd00: 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67    /* Do an integ
bd10: 72 69 74 79 20 63 68 65 63 6b 20 6f 6e 20 65 61  rity check on ea
bd20: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
bd30: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
bd40: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
bd50: 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c 65 6d  {.      HashElem
bd60: 20 2a 78 3b 0a 20 20 20 20 20 20 48 61 73 68 20   *x;.      Hash 
bd70: 2a 70 54 62 6c 73 3b 0a 20 20 20 20 20 20 69 6e  *pTbls;.      in
bd80: 74 20 2a 61 52 6f 6f 74 3b 0a 20 20 20 20 20 20  t *aRoot;.      
bd90: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
bda0: 20 20 20 69 6e 74 20 6d 78 49 64 78 20 3d 20 30     int mxIdx = 0
bdb0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 78  ;.      int nIdx
bdc0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 4f 4d 49  ;..      if( OMI
bdd0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 3d 3d 31  T_TEMPDB && i==1
bde0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
bdf0: 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 26 26     if( iDb>=0 &&
be00: 20 69 21 3d 69 44 62 20 29 20 63 6f 6e 74 69 6e   i!=iDb ) contin
be10: 75 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ue;..      sqlit
be20: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
be30: 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 0a  ma(pParse, i);..
be40: 20 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69        /* Do an i
be50: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f  ntegrity check o
be60: 66 20 74 68 65 20 42 2d 54 72 65 65 0a 20 20 20  f the B-Tree.   
be70: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
be80: 65 67 69 6e 20 62 79 20 66 69 6e 64 69 6e 67 20  egin by finding 
be90: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 73 20 6e  the root pages n
bea0: 75 6d 62 65 72 73 0a 20 20 20 20 20 20 2a 2a 20  umbers.      ** 
beb0: 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 61  for all tables a
bec0: 6e 64 20 69 6e 64 69 63 65 73 20 69 6e 20 74 68  nd indices in th
bed0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
bee0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
bef0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
bf00: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 2c  MutexHeld(db, i,
bf10: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 54 62   0) );.      pTb
bf20: 6c 73 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  ls = &db->aDb[i]
bf30: 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
bf40: 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74  h;.      for(cnt
bf50: 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68  =0, x=sqliteHash
bf60: 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b  First(pTbls); x;
bf70: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   x=sqliteHashNex
bf80: 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(x)){.        T
bf90: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
bfa0: 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a  iteHashData(x);.
bfb0: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
bfc0: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Idx;.        if(
bfd0: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
bfe0: 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  ) cnt++;.       
bff0: 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49 64   for(nIdx=0, pId
c000: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
c010: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
c020: 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29 7b  >pNext, nIdx++){
c030: 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20 20 20   cnt++; }.      
c040: 20 20 69 66 28 20 6e 49 64 78 3e 6d 78 49 64 78    if( nIdx>mxIdx
c050: 20 29 20 6d 78 49 64 78 20 3d 20 6e 49 64 78 3b   ) mxIdx = nIdx;
c060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
c070: 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62  Root = sqlite3Db
c080: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
c090: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 63 6e 74  sizeof(int)*(cnt
c0a0: 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +1));.      if( 
c0b0: 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72 65 61 6b  aRoot==0 ) break
c0c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74 3d  ;.      for(cnt=
c0d0: 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68 46  0, x=sqliteHashF
c0e0: 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20  irst(pTbls); x; 
c0f0: 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  x=sqliteHashNext
c100: 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61  (x)){.        Ta
c110: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
c120: 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20  teHashData(x);. 
c130: 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
c140: 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  dx;.        if( 
c150: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
c160: 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20   aRoot[cnt++] = 
c170: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  pTab->tnum;.    
c180: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
c190: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
c1a0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
c1b0: 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 52  t){.          aR
c1c0: 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70 49 64  oot[cnt++] = pId
c1d0: 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  x->tnum;.       
c1e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
c1f0: 20 61 52 6f 6f 74 5b 63 6e 74 5d 20 3d 20 30 3b   aRoot[cnt] = 0;
c200: 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  ..      /* Make 
c210: 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
c220: 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74  number of regist
c230: 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 6c  ers have been al
c240: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 20  located */.     
c250: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
c260: 4d 41 58 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65  MAX( pParse->nMe
c270: 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b 0a 0a 20  m, 8+mxIdx );.. 
c280: 20 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 62       /* Do the b
c290: 2d 74 72 65 65 20 69 6e 74 65 67 72 69 74 79 20  -tree integrity 
c2a0: 63 68 65 63 6b 73 20 2a 2f 0a 20 20 20 20 20 20  checks */.      
c2b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c2c0: 34 28 76 2c 20 4f 50 5f 49 6e 74 65 67 72 69 74  4(v, OP_Integrit
c2d0: 79 43 6b 2c 20 32 2c 20 63 6e 74 2c 20 31 2c 20  yCk, 2, cnt, 1, 
c2e0: 28 63 68 61 72 2a 29 61 52 6f 6f 74 2c 50 34 5f  (char*)aRoot,P4_
c2f0: 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 20 20 20  INTARRAY);.     
c300: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
c310: 67 65 50 35 28 76 2c 20 28 75 38 29 69 29 3b 0a  geP5(v, (u8)i);.
c320: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
c330: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
c340: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32 29 3b  , OP_IsNull, 2);
c350: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
c360: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c370: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
c380: 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30  String8, 0, 3, 0
c390: 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
c3a0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2a  e3MPrintf(db, "*
c3b0: 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 25  ** in database %
c3c0: 73 20 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e 61 44  s ***\n", db->aD
c3d0: 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 29 2c 0a  b[i].zDbSName),.
c3e0: 20 20 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41           P4_DYNA
c3f0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  MIC);.      sqli
c400: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c410: 20 4f 50 5f 4d 6f 76 65 2c 20 32 2c 20 34 2c 20   OP_Move, 2, 4, 
c420: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
c430: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c440: 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20  P_Concat, 4, 3, 
c450: 32 29 3b 0a 20 20 20 20 20 20 69 6e 74 65 67 72  2);.      integr
c460: 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f  ityCheckResultRo
c470: 77 28 76 2c 20 32 29 3b 0a 20 20 20 20 20 20 73  w(v, 2);.      s
c480: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
c490: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20 20  re(v, addr);..  
c4a0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
c4b0: 20 61 6c 6c 20 74 68 65 20 69 6e 64 69 63 65 73   all the indices
c4c0: 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74 65 64   are constructed
c4d0: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20 20   correctly..    
c4e0: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 78    */.      for(x
c4f0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
c500: 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71  (pTbls); x; x=sq
c510: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29 29  liteHashNext(x))
c520: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
c530: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
c540: 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20  shData(x);.     
c550: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20     Index *pIdx, 
c560: 2a 70 50 6b 3b 0a 20 20 20 20 20 20 20 20 49 6e  *pPk;.        In
c570: 64 65 78 20 2a 70 50 72 69 6f 72 20 3d 20 30 3b  dex *pPrior = 0;
c580: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 6f 6f  .        int loo
c590: 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 6e  pTop;.        in
c5a0: 74 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78  t iDataCur, iIdx
c5b0: 43 75 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Cur;.        int
c5c0: 20 72 31 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 20   r1 = -1;..     
c5d0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75     if( pTab->tnu
c5e0: 6d 3c 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  m<1 ) continue; 
c5f0: 20 2f 2a 20 53 6b 69 70 20 56 49 45 57 73 20 6f   /* Skip VIEWs o
c600: 72 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 73  r VIRTUAL TABLEs
c610: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
c620: 70 54 61 62 2d 3e 70 43 68 65 63 6b 3d 3d 30 0a  pTab->pCheck==0.
c630: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54 61           && (pTa
c640: 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
c650: 5f 48 61 73 4e 6f 74 4e 75 6c 6c 29 3d 3d 30 0a  _HasNotNull)==0.
c660: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54 61           && (pTa
c670: 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 7c 7c 20  b->pIndex==0 || 
c680: 69 73 51 75 69 63 6b 29 0a 20 20 20 20 20 20 20  isQuick).       
c690: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
c6a0: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 4e 6f 20 61  ntinue;  /* No a
c6b0: 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 73  dditional checks
c6c0: 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68 69 73   needed for this
c6d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
c6e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 6b 20    }.        pPk 
c6f0: 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  = HasRowid(pTab)
c700: 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 50 72   ? 0 : sqlite3Pr
c710: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
c720: 61 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ab);.        sql
c730: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
c740: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
c750: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
c760: 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 70  ableAndIndices(p
c770: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4f 50 5f  Parse, pTab, OP_
c780: 4f 70 65 6e 52 65 61 64 2c 20 30 2c 0a 20 20 20  OpenRead, 0,.   
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 31 2c 20 30 2c 20 26 69 44 61 74 61 43 75 72 2c  1, 0, &iDataCur,
c7c0: 20 26 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20   &iIdxCur);.    
c7d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c7e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
c7f0: 67 65 72 2c 20 30 2c 20 37 29 3b 0a 20 20 20 20  ger, 0, 7);.    
c800: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64      for(j=0, pId
c810: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
c820: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
c830: 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20  >pNext, j++){.  
c840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c850: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c860: 49 6e 74 65 67 65 72 2c 20 30 2c 20 38 2b 6a 29  Integer, 0, 8+j)
c870: 3b 20 2f 2a 20 69 6e 64 65 78 20 65 6e 74 72 69  ; /* index entri
c880: 65 73 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  es counter */.  
c890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c8a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
c8b0: 6e 4d 65 6d 3e 3d 38 2b 6a 20 29 3b 0a 20 20 20  nMem>=8+j );.   
c8c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
c8d0: 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e  ite3NoTempsInRan
c8e0: 67 65 28 70 50 61 72 73 65 2c 31 2c 37 2b 6a 29  ge(pParse,1,7+j)
c8f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
c900: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c910: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44 61 74   OP_Rewind, iDat
c920: 61 43 75 72 2c 20 30 29 3b 20 56 64 62 65 43 6f  aCur, 0); VdbeCo
c930: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
c940: 20 20 20 6c 6f 6f 70 54 6f 70 20 3d 20 73 71 6c     loopTop = sql
c950: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c960: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 37 2c 20  , OP_AddImm, 7, 
c970: 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56  1);.        /* V
c980: 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 4e  erify that all N
c990: 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
c9a0: 72 65 61 6c 6c 79 20 61 72 65 20 4e 4f 54 20 4e  really are NOT N
c9b0: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ULL */.        f
c9c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
c9d0: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
c9e0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
c9f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
ca00: 6a 6d 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  jmp2;.          
ca10: 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( j==pTab->iPK
ca20: 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ey ) continue;. 
ca30: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61           if( pTa
ca40: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75  b->aCol[j].notNu
ca50: 6c 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ll==0 ) continue
ca60: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ca70: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
ca80: 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
ca90: 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 6a  Tab, iDataCur, j
caa0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
cab0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
cac0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
cad0: 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
cae0: 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74      jmp2 = sqlit
caf0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
cb00: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 33 29 3b 20  OP_NotNull, 3); 
cb10: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
cb20: 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 20  .          zErr 
cb30: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
cb40: 28 64 62 2c 20 22 4e 55 4c 4c 20 76 61 6c 75 65  (db, "NULL value
cb50: 20 69 6e 20 25 73 2e 25 73 22 2c 20 70 54 61 62   in %s.%s", pTab
cb60: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb80: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
cb90: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
cba0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cbb0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
cbc0: 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c  tring8, 0, 3, 0,
cbd0: 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49   zErr, P4_DYNAMI
cbe0: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  C);.          in
cbf0: 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75  tegrityCheckResu
cc00: 6c 74 52 6f 77 28 76 2c 20 33 29 3b 0a 20 20 20  ltRow(v, 3);.   
cc10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cc20: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
cc30: 70 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  p2);.        }. 
cc40: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
cc50: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
cc60: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ts */.        if
cc70: 28 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 26  ( pTab->pCheck &
cc80: 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
cc90: 51 4c 49 54 45 5f 49 67 6e 6f 72 65 43 68 65 63  QLITE_IgnoreChec
cca0: 6b 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ks)==0 ){.      
ccb0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43      ExprList *pC
ccc0: 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
ccd0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 54  prListDup(db, pT
cce0: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 30 29 3b 0a  ab->pCheck, 0);.
ccf0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
cd00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
cd10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
cd20: 20 69 6e 74 20 61 64 64 72 43 6b 46 61 75 6c 74   int addrCkFault
cd30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
cd40: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
cd50: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
cd60: 43 6b 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  CkOk = sqlite3Vd
cd70: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
cd90: 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20   *zErr;.        
cda0: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
cdb0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69         pParse->i
cdc0: 53 65 6c 66 54 61 62 20 3d 20 69 44 61 74 61 43  SelfTab = iDataC
cdd0: 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur;.            
cde0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
cdf0: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
ce00: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
ce10: 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72 2d 31 3b  pCheck->nExpr-1;
ce20: 20 6b 3e 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20   k>0; k--){.    
ce30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ce40: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
ce50: 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b 6b  rse, pCheck->a[k
ce60: 5d 2e 70 45 78 70 72 2c 20 61 64 64 72 43 6b 46  ].pExpr, addrCkF
ce70: 61 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ault, 0);.      
ce80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ce90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
cea0: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 43  fTrue(pParse, pC
ceb0: 68 65 63 6b 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  heck->a[0].pExpr
cec0: 2c 20 61 64 64 72 43 6b 4f 6b 2c 20 0a 20 20 20  , addrCkOk, .   
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
cee0: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
cef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
cf00: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
cf10: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 46 61  abel(v, addrCkFa
cf20: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ult);.          
cf30: 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
cf40: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 48 45  MPrintf(db, "CHE
cf50: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  CK constraint fa
cf60: 69 6c 65 64 20 69 6e 20 25 73 22 2c 0a 20 20 20  iled in %s",.   
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
cf80: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
cf90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cfa0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
cfb0: 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c  tring8, 0, 3, 0,
cfc0: 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49   zErr, P4_DYNAMI
cfd0: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
cfe0: 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65  integrityCheckRe
cff0: 73 75 6c 74 52 6f 77 28 76 2c 20 33 29 3b 0a 20  sultRow(v, 3);. 
d000: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d010: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d020: 65 6c 28 76 2c 20 61 64 64 72 43 6b 4f 6b 29 3b  el(v, addrCkOk);
d030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d040: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
d050: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
d060: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d070: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
d080: 65 6c 65 74 65 28 64 62 2c 20 70 43 68 65 63 6b  elete(db, pCheck
d090: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d0a0: 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65       /* Validate
d0b0: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 66   index entries f
d0c0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
d0d0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  ow */.        fo
d0e0: 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  r(j=0, pIdx=pTab
d0f0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26  ->pIndex; pIdx &
d100: 26 20 21 69 73 51 75 69 63 6b 3b 20 70 49 64 78  & !isQuick; pIdx
d110: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b  =pIdx->pNext, j+
d120: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  +){.          in
d130: 74 20 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20 6a 6d  t jmp2, jmp3, jm
d140: 70 34 2c 20 6a 6d 70 35 3b 0a 20 20 20 20 20 20  p4, jmp5;.      
d150: 20 20 20 20 69 6e 74 20 63 6b 55 6e 69 71 20 3d      int ckUniq =
d160: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d170: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d180: 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64      if( pPk==pId
d190: 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  x ) continue;.  
d1a0: 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
d1b0: 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
d1c0: 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64  xKey(pParse, pId
d1d0: 78 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c 20  x, iDataCur, 0, 
d1e0: 30 2c 20 26 6a 6d 70 33 2c 0a 20 20 20 20 20 20  0, &jmp3,.      
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20 20   pPrior, r1);.  
d220: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d          pPrior =
d230: 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   pIdx;.         
d240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d250: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
d260: 20 38 2b 6a 2c 20 31 29 3b 20 20 2f 2a 20 69 6e   8+j, 1);  /* in
d270: 63 72 65 6d 65 6e 74 20 65 6e 74 72 79 20 63 6f  crement entry co
d280: 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  unt */.         
d290: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
d2a0: 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 65  an index entry e
d2b0: 78 69 73 74 73 20 66 6f 72 20 74 68 65 20 63 75  xists for the cu
d2c0: 72 72 65 6e 74 20 74 61 62 6c 65 20 72 6f 77 20  rrent table row 
d2d0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70  */.          jmp
d2e0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
d2f0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
d300: 6f 75 6e 64 2c 20 69 49 64 78 43 75 72 2b 6a 2c  ound, iIdxCur+j,
d310: 20 63 6b 55 6e 69 71 2c 20 72 31 2c 0a 20 20 20   ckUniq, r1,.   
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e     pIdx->nColumn
d350: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
d360: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
d370: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
d380: 69 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77 20 22  ing(v, 3, "row "
d390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d3a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d3b0: 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 37 2c 20  , OP_Concat, 7, 
d3c0: 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 3);.         
d3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
d3e0: 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 22 20 6d  String(v, 4, " m
d3f0: 69 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65  issing from inde
d400: 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  x ");.          
d410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d420: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
d430: 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20  4, 3, 3);.      
d440: 20 20 20 20 6a 6d 70 35 20 3d 20 73 71 6c 69 74      jmp5 = sqlit
d450: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
d460: 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e 61  (v, 4, pIdx->zNa
d470: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
d480: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d490: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34  (v, OP_Concat, 4
d4a0: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 3, 3);.       
d4b0: 20 20 20 6a 6d 70 34 20 3d 20 69 6e 74 65 67 72     jmp4 = integr
d4c0: 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f  ityCheckResultRo
d4d0: 77 28 76 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  w(v, 3);.       
d4e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d4f0: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b  mpHere(v, jmp2);
d500: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  .          /* Fo
d510: 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 65 73  r UNIQUE indexes
d520: 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 6f 6e  , verify that on
d530: 6c 79 20 6f 6e 65 20 65 6e 74 72 79 20 65 78 69  ly one entry exi
d540: 73 74 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  sts with the.   
d550: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
d560: 74 20 6b 65 79 2e 20 20 54 68 65 20 65 6e 74 72  t key.  The entr
d570: 79 20 69 73 20 75 6e 69 71 75 65 20 69 66 20 28  y is unique if (
d580: 31 29 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73  1) any column is
d590: 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20   NULL.          
d5a0: 2a 2a 20 6f 72 20 28 32 29 20 74 68 65 20 6e 65  ** or (2) the ne
d5b0: 78 74 20 65 6e 74 72 79 20 68 61 73 20 61 20 64  xt entry has a d
d5c0: 69 66 66 65 72 65 6e 74 20 6b 65 79 20 2a 2f 0a  ifferent key */.
d5d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
d5e0: 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
d5f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d600: 20 69 6e 74 20 75 6e 69 71 4f 6b 20 3d 20 73 71   int uniqOk = sq
d610: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
d620: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  el(v);.         
d630: 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20 20 20     int jmp6;.   
d640: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 6b 3b           int kk;
d650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
d660: 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78 2d 3e  (kk=0; kk<pIdx->
d670: 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b 0a  nKeyCol; kk++){.
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d690: 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61  t iCol = pIdx->a
d6a0: 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20 20  iColumn[kk];.   
d6b0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
d6c0: 74 28 20 69 43 6f 6c 21 3d 58 4e 5f 52 4f 57 49  t( iCol!=XN_ROWI
d6d0: 44 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  D && iCol<pTab->
d6e0: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  nCol );.        
d6f0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
d700: 30 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  0 && pTab->aCol[
d710: 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 20  iCol].notNull ) 
d720: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
d730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d740: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d750: 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b 6b 2c 20 75  IsNull, r1+kk, u
d760: 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20  niqOk);.        
d770: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
d780: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
d790: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
d7a0: 20 6a 6d 70 36 20 3d 20 73 71 6c 69 74 65 33 56   jmp6 = sqlite3V
d7b0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
d7c0: 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2b 6a 29  Next, iIdxCur+j)
d7d0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d7e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d7f0: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
d800: 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20  , uniqOk);.     
d810: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d820: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
d830: 70 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p6);.           
d840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d850: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 47  p4Int(v, OP_IdxG
d860: 54 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 75 6e  T, iIdxCur+j, un
d870: 69 71 4f 6b 2c 20 72 31 2c 0a 20 20 20 20 20 20  iqOk, r1,.      
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
d8a0: 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43  >nKeyCol); VdbeC
d8b0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
d8c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d8d0: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
d8e0: 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69 71 75 65 20   3, "non-unique 
d8f0: 65 6e 74 72 79 20 69 6e 20 69 6e 64 65 78 20 22  entry in index "
d900: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d910: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
d920: 2c 20 6a 6d 70 35 29 3b 0a 20 20 20 20 20 20 20  , jmp5);.       
d930: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d940: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
d950: 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20  uniqOk);.       
d960: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
d970: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
d980: 72 65 28 76 2c 20 6a 6d 70 34 29 3b 0a 20 20 20  re(v, jmp4);.   
d990: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
d9a0: 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65  solvePartIdxLabe
d9b0: 6c 28 70 50 61 72 73 65 2c 20 6a 6d 70 33 29 3b  l(pParse, jmp3);
d9c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d9d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d9e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
d9f0: 20 69 44 61 74 61 43 75 72 2c 20 6c 6f 6f 70 54   iDataCur, loopT
da00: 6f 70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  op); VdbeCoverag
da10: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
da20: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
da30: 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31 29 3b  e(v, loopTop-1);
da40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
da50: 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
da60: 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73 51          if( !isQ
da70: 75 69 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  uick ){.        
da80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
da90: 64 53 74 72 69 6e 67 28 76 2c 20 32 2c 20 22 77  dString(v, 2, "w
daa0: 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72 69 65  rong # of entrie
dab0: 73 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20  s in index ");. 
dac0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
dad0: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
dae0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
daf0: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b  pIdx->pNext, j++
db00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
db10: 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20 63  f( pPk==pIdx ) c
db20: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
db30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
db40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
db50: 6e 74 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 33  nt, iIdxCur+j, 3
db60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
db70: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
db80: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
db90: 2c 20 38 2b 6a 2c 20 30 2c 20 33 29 3b 20 56 64  , 8+j, 0, 3); Vd
dba0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
dbb0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
dbc0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
dbd0: 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c  , SQLITE_NOTNULL
dbe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
dbf0: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
dc00: 72 69 6e 67 28 76 2c 20 33 2c 20 70 49 64 78 2d  ring(v, 3, pIdx-
dc10: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
dc20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
dc40: 63 61 74 2c 20 33 2c 20 32 2c 20 37 29 3b 0a 20  cat, 3, 2, 7);. 
dc50: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 67             integ
dc60: 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52  rityCheckResultR
dc70: 6f 77 28 76 2c 20 37 29 3b 0a 20 20 20 20 20 20  ow(v, 7);.      
dc80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dc90: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
dca0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
dcb0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
dcc0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
dcd0: 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20  BTREECOUNT */.  
dce0: 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 20      } .    }.   
dcf0: 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
dd00: 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20  const int iLn = 
dd10: 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45  VDBE_OFFSET_LINE
dd20: 4e 4f 28 32 29 3b 0a 20 20 20 20 20 20 73 74 61  NO(2);.      sta
dd30: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70  tic const VdbeOp
dd40: 4c 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20 3d  List endCode[] =
dd50: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
dd60: 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20  AddImm,      1, 
dd70: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  0,        0},   
dd80: 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20   /* 0 */.       
dd90: 20 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c   { OP_IfNotZero,
dda0: 20 20 20 31 2c 20 34 2c 20 20 20 20 20 20 20 20     1, 4,        
ddb0: 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20  0},    /* 1 */. 
ddc0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69         { OP_Stri
ddd0: 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20 20  ng8,     0, 3,  
dde0: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
ddf0: 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  2 */.        { O
de00: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 33  P_ResultRow,   3
de10: 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 1,        0}, 
de20: 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20     /* 3 */.     
de30: 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70   };.      VdbeOp
de40: 20 2a 61 4f 70 3b 0a 0a 20 20 20 20 20 20 61 4f   *aOp;..      aO
de50: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
de60: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
de70: 79 53 69 7a 65 28 65 6e 64 43 6f 64 65 29 2c 20  ySize(endCode), 
de80: 65 6e 64 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a 20  endCode, iLn);. 
de90: 20 20 20 20 20 69 66 28 20 61 4f 70 20 29 7b 0a       if( aOp ){.
dea0: 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70          aOp[0].p
deb0: 32 20 3d 20 31 2d 6d 78 45 72 72 3b 0a 20 20 20  2 = 1-mxErr;.   
dec0: 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 74 79       aOp[2].p4ty
ded0: 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b 0a  pe = P4_STATIC;.
dee0: 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70          aOp[2].p
def0: 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a 20 20 20 20  4.z = "ok";.    
df00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
df10: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
df20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
df30: 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
df40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
df50: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 0a  OMIT_UTF16.  /*.
df60: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e    **   PRAGMA en
df70: 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52  coding.  **   PR
df80: 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20  AGMA encoding = 
df90: 22 75 74 66 2d 38 22 7c 22 75 74 66 2d 31 36 22  "utf-8"|"utf-16"
dfa0: 7c 22 75 74 66 2d 31 36 6c 65 22 7c 22 75 74 66  |"utf-16le"|"utf
dfb0: 2d 31 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a  -16be".  **.  **
dfc0: 20 49 6e 20 69 74 73 20 66 69 72 73 74 20 66 6f   In its first fo
dfd0: 72 6d 2c 20 74 68 69 73 20 70 72 61 67 6d 61 20  rm, this pragma 
dfe0: 72 65 74 75 72 6e 73 20 74 68 65 20 65 6e 63 6f  returns the enco
dff0: 64 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e  ding of the main
e000: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
e010: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
e020: 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  is not initializ
e030: 65 64 2c 20 69 74 20 69 73 20 69 6e 69 74 69 61  ed, it is initia
e040: 6c 69 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a  lized now..  **.
e050: 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
e060: 66 6f 72 6d 20 6f 66 20 74 68 69 73 20 70 72 61  form of this pra
e070: 67 6d 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  gma is a no-op i
e080: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
e090: 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61  ase file.  ** ha
e0a0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
e0b0: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  en initialized. 
e0c0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
e0d0: 73 65 74 73 20 74 68 65 20 64 65 66 61 75 6c 74  sets the default
e0e0: 0a 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74  .  ** encoding t
e0f0: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
e100: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
e110: 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 61  tabase file if a
e120: 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69   new file.  ** i
e130: 73 20 63 72 65 61 74 65 64 2e 20 49 66 20 61 6e  s created. If an
e140: 20 65 78 69 73 74 69 6e 67 20 6d 61 69 6e 20 64   existing main d
e150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
e160: 6f 70 65 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  opened, then the
e170: 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 74 65  .  ** default te
e180: 78 74 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20  xt encoding for 
e190: 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  the existing dat
e1a0: 61 62 61 73 65 20 69 73 20 75 73 65 64 2e 0a 20  abase is used.. 
e1b0: 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c   ** .  ** In all
e1c0: 20 63 61 73 65 73 20 6e 65 77 20 64 61 74 61 62   cases new datab
e1d0: 61 73 65 73 20 63 72 65 61 74 65 64 20 75 73 69  ases created usi
e1e0: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
e1f0: 6d 6d 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63  mmand are.  ** c
e200: 72 65 61 74 65 64 20 74 6f 20 75 73 65 20 74 68  reated to use th
e210: 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20 74  e same default t
e220: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20  ext encoding as 
e230: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
e240: 65 2e 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  e. If.  ** the m
e250: 61 69 6e 20 64 61 74 61 62 61 73 65 20 68 61 73  ain database has
e260: 20 6e 6f 74 20 62 65 65 6e 20 69 6e 69 74 69 61   not been initia
e270: 6c 69 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72 65  lized and/or cre
e280: 61 74 65 64 20 77 68 65 6e 20 41 54 54 41 43 48  ated when ATTACH
e290: 0a 20 20 2a 2a 20 69 73 20 65 78 65 63 75 74 65  .  ** is execute
e2a0: 64 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  d, this is done 
e2b0: 62 65 66 6f 72 65 20 74 68 65 20 41 54 54 41 43  before the ATTAC
e2c0: 48 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a  H operation..  *
e2d0: 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 73 65  *.  ** In the se
e2e0: 63 6f 6e 64 20 66 6f 72 6d 20 74 68 69 73 20 70  cond form this p
e2f0: 72 61 67 6d 61 20 73 65 74 73 20 74 68 65 20 74  ragma sets the t
e300: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20  ext encoding to 
e310: 62 65 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20  be used in.  ** 
e320: 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69 6c  new database fil
e330: 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  es created using
e340: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 68   this database h
e350: 61 6e 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c  andle. It is onl
e360: 79 0a 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 66  y.  ** useful if
e370: 20 69 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61   invoked immedia
e380: 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 6d  tely after the m
e390: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 0a 20  ain database i. 
e3a0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
e3b0: 79 70 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20  yp_ENCODING: {. 
e3c0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e3d0: 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 7b  struct EncName {
e3e0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
e3f0: 6d 65 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63  me;.      u8 enc
e400: 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61 6d 65 73  ;.    } encnames
e410: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
e420: 55 54 46 38 22 2c 20 20 20 20 20 53 51 4c 49 54  UTF8",     SQLIT
e430: 45 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c  E_UTF8        },
e440: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 38 22  .      { "UTF-8"
e450: 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38  ,    SQLITE_UTF8
e460: 20 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d          },  /* M
e470: 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b  ust be element [
e480: 31 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55  1] */.      { "U
e490: 54 46 2d 31 36 6c 65 22 2c 20 53 51 4c 49 54 45  TF-16le", SQLITE
e4a0: 5f 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 20  _UTF16LE     }, 
e4b0: 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d   /* Must be elem
e4c0: 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20 20 20 20  ent [2] */.     
e4d0: 20 7b 20 22 55 54 46 2d 31 36 62 65 22 2c 20 53   { "UTF-16be", S
e4e0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20 20  QLITE_UTF16BE   
e4f0: 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65    },  /* Must be
e500: 20 65 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a   element [3] */.
e510: 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 6c 65        { "UTF16le
e520: 22 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ",  SQLITE_UTF16
e530: 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  LE     },.      
e540: 7b 20 22 55 54 46 31 36 62 65 22 2c 20 20 53 51  { "UTF16be",  SQ
e550: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20 20 20  LITE_UTF16BE    
e560: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46   },.      { "UTF
e570: 2d 31 36 22 2c 20 20 20 30 20 20 20 20 20 20 20  -16",   0       
e580: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a             }, /*
e590: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
e5a0: 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22  IVE */.      { "
e5b0: 55 54 46 31 36 22 2c 20 20 20 20 30 20 20 20 20  UTF16",    0    
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
e5d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   /* SQLITE_UTF16
e5e0: 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20  NATIVE */.      
e5f0: 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a  { 0, 0 }.    };.
e600: 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74      const struct
e610: 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a   EncName *pEnc;.
e620: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
e630: 29 7b 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41  ){    /* "PRAGMA
e640: 20 65 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20 20   encoding" */.  
e650: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52      if( sqlite3R
e660: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
e670: 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f  ) ) goto pragma_
e680: 6f 75 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  out;.      asser
e690: 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49  t( encnames[SQLI
e6a0: 54 45 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53 51  TE_UTF8].enc==SQ
e6b0: 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20  LITE_UTF8 );.   
e6c0: 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61     assert( encna
e6d0: 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36  mes[SQLITE_UTF16
e6e0: 4c 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  LE].enc==SQLITE_
e6f0: 55 54 46 31 36 4c 45 20 29 3b 0a 20 20 20 20 20  UTF16LE );.     
e700: 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65   assert( encname
e710: 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  s[SQLITE_UTF16BE
e720: 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ].enc==SQLITE_UT
e730: 46 31 36 42 45 20 29 3b 0a 20 20 20 20 20 20 72  F16BE );.      r
e740: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
e750: 76 2c 20 65 6e 63 6e 61 6d 65 73 5b 45 4e 43 28  v, encnames[ENC(
e760: 70 50 61 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61  pParse->db)].zNa
e770: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20  me);.    }else{ 
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e790: 20 20 20 20 20 20 20 2f 2a 20 22 50 52 41 47 4d         /* "PRAGM
e7a0: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58 58  A encoding = XXX
e7b0: 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  " */.      /* On
e7c0: 6c 79 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  ly change the va
e7d0: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 2e 65 6e  lue of sqlite.en
e7e0: 63 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  c if the databas
e7f0: 65 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 0a  e handle is not.
e800: 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c        ** initial
e810: 69 7a 65 64 2e 20 49 66 20 74 68 65 20 6d 61 69  ized. If the mai
e820: 6e 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74  n database exist
e830: 73 2c 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  s, the new sqlit
e840: 65 2e 65 6e 63 20 76 61 6c 75 65 0a 20 20 20 20  e.enc value.    
e850: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76 65    ** will be ove
e860: 72 77 72 69 74 74 65 6e 20 77 68 65 6e 20 74 68  rwritten when th
e870: 65 20 73 63 68 65 6d 61 20 69 73 20 6e 65 78 74  e schema is next
e880: 20 6c 6f 61 64 65 64 2e 20 49 66 20 69 74 20 64   loaded. If it d
e890: 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  oes not.      **
e8a0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c   already exists,
e8b0: 20 69 74 20 77 69 6c 6c 20 62 65 20 63 72 65 61   it will be crea
e8c0: 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6e  ted to use the n
e8d0: 65 77 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c 75  ew encoding valu
e8e0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
e8f0: 20 20 69 66 28 20 0a 20 20 20 20 20 20 20 20 21    if( .        !
e900: 28 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  (DbHasProperty(d
e910: 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c  b, 0, DB_SchemaL
e920: 6f 61 64 65 64 29 29 20 7c 7c 20 0a 20 20 20 20  oaded)) || .    
e930: 20 20 20 20 44 62 48 61 73 50 72 6f 70 65 72 74      DbHasPropert
e940: 79 28 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70 74  y(db, 0, DB_Empt
e950: 79 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  y) .      ){.   
e960: 20 20 20 20 20 66 6f 72 28 70 45 6e 63 3d 26 65       for(pEnc=&e
e970: 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63  ncnames[0]; pEnc
e980: 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29  ->zName; pEnc++)
e990: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
e9a0: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
e9b0: 70 28 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e  p(zRight, pEnc->
e9c0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
e9d0: 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43        SCHEMA_ENC
e9e0: 28 64 62 29 20 3d 20 45 4e 43 28 64 62 29 20 3d  (db) = ENC(db) =
e9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ea00: 20 70 45 6e 63 2d 3e 65 6e 63 20 3f 20 70 45 6e   pEnc->enc ? pEn
ea10: 63 2d 3e 65 6e 63 20 3a 20 53 51 4c 49 54 45 5f  c->enc : SQLITE_
ea20: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20  UTF16NATIVE;.   
ea30: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ea40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ea50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
ea60: 28 20 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29  ( !pEnc->zName )
ea70: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
ea80: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ea90: 73 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64  se, "unsupported
eaa0: 20 65 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c 20   encoding: %s", 
eab0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  zRight);.       
eac0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ead0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
eae0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
eaf0: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
eb00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
eb10: 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e  T_SCHEMA_VERSION
eb20: 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20  _PRAGMAS.  /*.  
eb30: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
eb40: 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73  ema.]schema_vers
eb50: 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ion.  **   PRAGM
eb60: 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d  A [schema.]schem
eb70: 61 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74  a_version = <int
eb80: 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  eger>.  **.  ** 
eb90: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
eba0: 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 0a 20  .]user_version. 
ebb0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
ebc0: 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69  hema.]user_versi
ebd0: 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20  on = <integer>. 
ebe0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
ebf0: 41 20 5b 73 63 68 65 6d 61 2e 5d 66 72 65 65 6c  A [schema.]freel
ec00: 69 73 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20  ist_count.  **. 
ec10: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
ec20: 68 65 6d 61 2e 5d 64 61 74 61 5f 76 65 72 73 69  hema.]data_versi
ec30: 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50  on.  **.  **   P
ec40: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
ec50: 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 0a 20 20  pplication_id.  
ec60: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
ec70: 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e  ema.]application
ec80: 5f 69 64 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a  _id = <integer>.
ec90: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70 72    **.  ** The pr
eca0: 61 67 6d 61 27 73 20 73 63 68 65 6d 61 5f 76 65  agma's schema_ve
ecb0: 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 5f 76  rsion and user_v
ecc0: 65 72 73 69 6f 6e 20 61 72 65 20 75 73 65 64 20  ersion are used 
ecd0: 74 6f 20 73 65 74 20 6f 72 20 67 65 74 0a 20 20  to set or get.  
ece0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
ecf0: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
ed00: 6f 6e 20 61 6e 64 20 75 73 65 72 2d 76 65 72 73  on and user-vers
ed10: 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ion, respectivel
ed20: 79 2e 20 42 6f 74 68 0a 20 20 2a 2a 20 74 68 65  y. Both.  ** the
ed30: 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20   schema-version 
ed40: 61 6e 64 20 74 68 65 20 75 73 65 72 2d 76 65 72  and the user-ver
ed50: 73 69 6f 6e 20 61 72 65 20 33 32 2d 62 69 74 20  sion are 32-bit 
ed60: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 0a  signed integers.
ed70: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74    ** stored in t
ed80: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
ed90: 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er..  **.  ** Th
eda0: 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20  e schema-cookie 
edb0: 69 73 20 75 73 75 61 6c 6c 79 20 6f 6e 6c 79 20  is usually only 
edc0: 6d 61 6e 69 70 75 6c 61 74 65 64 20 69 6e 74 65  manipulated inte
edd0: 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65  rnally by SQLite
ede0: 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 69 6e 63  . It.  ** is inc
edf0: 72 65 6d 65 6e 74 65 64 20 62 79 20 53 51 4c 69  remented by SQLi
ee00: 74 65 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  te whenever the 
ee10: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
ee20: 69 73 20 6d 6f 64 69 66 69 65 64 20 28 62 79 0a  is modified (by.
ee30: 20 20 2a 2a 20 63 72 65 61 74 69 6e 67 20 6f 72    ** creating or
ee40: 20 64 72 6f 70 70 69 6e 67 20 61 20 74 61 62 6c   dropping a tabl
ee50: 65 20 6f 72 20 69 6e 64 65 78 29 2e 20 54 68 65  e or index). The
ee60: 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20   schema version 
ee70: 69 73 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20  is used by.  ** 
ee80: 53 51 4c 69 74 65 20 65 61 63 68 20 74 69 6d 65  SQLite each time
ee90: 20 61 20 71 75 65 72 79 20 69 73 20 65 78 65 63   a query is exec
eea0: 75 74 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  uted to ensure t
eeb0: 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hat the internal
eec0: 20 63 61 63 68 65 0a 20 20 2a 2a 20 6f 66 20 74   cache.  ** of t
eed0: 68 65 20 73 63 68 65 6d 61 20 75 73 65 64 20 77  he schema used w
eee0: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68  hen compiling th
eef0: 65 20 53 51 4c 20 71 75 65 72 79 20 6d 61 74 63  e SQL query matc
ef00: 68 65 73 20 74 68 65 20 73 63 68 65 6d 61 20 6f  hes the schema o
ef10: 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
ef20: 61 73 65 20 61 67 61 69 6e 73 74 20 77 68 69 63  ase against whic
ef30: 68 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 71  h the compiled q
ef40: 75 65 72 79 20 69 73 20 61 63 74 75 61 6c 6c 79  uery is actually
ef50: 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20   executed..  ** 
ef60: 53 75 62 76 65 72 74 69 6e 67 20 74 68 69 73 20  Subverting this 
ef70: 6d 65 63 68 61 6e 69 73 6d 20 62 79 20 75 73 69  mechanism by usi
ef80: 6e 67 20 22 50 52 41 47 4d 41 20 73 63 68 65 6d  ng "PRAGMA schem
ef90: 61 5f 76 65 72 73 69 6f 6e 22 20 74 6f 20 6d 6f  a_version" to mo
efa0: 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63  dify.  ** the sc
efb0: 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 69 73 20  hema-version is 
efc0: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 64 61 6e 67  potentially dang
efd0: 65 72 6f 75 73 20 61 6e 64 20 6d 61 79 20 6c 65  erous and may le
efe0: 61 64 20 74 6f 20 70 72 6f 67 72 61 6d 0a 20 20  ad to program.  
eff0: 2a 2a 20 63 72 61 73 68 65 73 20 6f 72 20 64 61  ** crashes or da
f000: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
f010: 6e 2e 20 55 73 65 20 77 69 74 68 20 63 61 75 74  n. Use with caut
f020: 69 6f 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ion!.  **.  ** T
f030: 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20  he user-version 
f040: 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
f050: 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65  rnally by SQLite
f060: 2e 20 49 74 20 6d 61 79 20 62 65 20 75 73 65 64  . It may be used
f070: 20 62 79 0a 20 20 2a 2a 20 61 70 70 6c 69 63 61   by.  ** applica
f080: 74 69 6f 6e 73 20 66 6f 72 20 61 6e 79 20 70 75  tions for any pu
f090: 72 70 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  rpose..  */.  ca
f0a0: 73 65 20 50 72 61 67 54 79 70 5f 48 45 41 44 45  se PragTyp_HEADE
f0b0: 52 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69  R_VALUE: {.    i
f0c0: 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 70 50 72  nt iCookie = pPr
f0d0: 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 2f 2a 20  agma->iArg;  /* 
f0e0: 57 68 69 63 68 20 63 6f 6f 6b 69 65 20 74 6f 20  Which cookie to 
f0f0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 2a 2f  read or write */
f100: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f110: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
f120: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
f130: 74 20 26 26 20 28 70 50 72 61 67 6d 61 2d 3e 6d  t && (pPragma->m
f140: 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
f150: 67 5f 52 65 61 64 4f 6e 6c 79 29 3d 3d 30 20 29  g_ReadOnly)==0 )
f160: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  {.      /* Write
f170: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63   the specified c
f180: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
f190: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
f1a0: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74  t VdbeOpList set
f1b0: 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20  Cookie[] = {.   
f1c0: 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61       { OP_Transa
f1d0: 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31 2c  ction,    0,  1,
f1e0: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f    0},    /* 0 */
f1f0: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65  .        { OP_Se
f200: 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c  tCookie,      0,
f210: 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20    0,  0},    /* 
f220: 31 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20  1 */.      };.  
f230: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
f240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f250: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
f260: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
f270: 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29  ySize(setCookie)
f280: 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73  );.      aOp = s
f290: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
f2a0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
f2b0: 28 73 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74  (setCookie), set
f2c0: 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20  Cookie, 0);.    
f2d0: 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45    if( ONLY_IF_RE
f2e0: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70  ALLOC_STRESS(aOp
f2f0: 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ==0) ) break;.  
f300: 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20      aOp[0].p1 = 
f310: 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  iDb;.      aOp[1
f320: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
f330: 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69 43    aOp[1].p2 = iC
f340: 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f 70  ookie;.      aOp
f350: 5b 31 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65 33  [1].p3 = sqlite3
f360: 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  Atoi(zRight);.  
f370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
f380: 2a 20 52 65 61 64 20 74 68 65 20 73 70 65 63 69  * Read the speci
f390: 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75  fied cookie valu
f3a0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  e */.      stati
f3b0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
f3c0: 73 74 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d 20  st readCookie[] 
f3d0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
f3e0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
f3f0: 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20    0,  0,  0},   
f400: 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20   /* 0 */.       
f410: 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65   { OP_ReadCookie
f420: 2c 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20 30  ,      0,  1,  0
f430: 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  },    /* 1 */.  
f440: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c        { OP_Resul
f450: 74 52 6f 77 2c 20 20 20 20 20 20 20 31 2c 20 20  tRow,       1,  
f460: 31 2c 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b 0a  1,  0}.      };.
f470: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f        VdbeOp *aO
f480: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
f490: 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c  VdbeVerifyNoMall
f4a0: 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72  ocRequired(v, Ar
f4b0: 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b  raySize(readCook
f4c0: 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20  ie));.      aOp 
f4d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f4e0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
f4f0: 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 2c  ize(readCookie),
f500: 72 65 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20  readCookie,0);. 
f510: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
f520: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
f530: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
f540: 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31  .      aOp[0].p1
f550: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
f560: 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[1].p1 = iDb;. 
f570: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d       aOp[1].p3 =
f580: 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20   iCookie;.      
f590: 73 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61  sqlite3VdbeReusa
f5a0: 62 6c 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  ble(v);.    }.  
f5b0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
f5c0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
f5d0: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f  _SCHEMA_VERSION_
f5e0: 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e  PRAGMAS */..#ifn
f5f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f600: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
f610: 41 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  AGS.  /*.  **   
f620: 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f  PRAGMA compile_o
f630: 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a  ptions.  **.  **
f640: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
f650: 73 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c 65  s of all compile
f660: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75 73  -time options us
f670: 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
f680: 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f  ,.  ** one optio
f690: 6e 20 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a  n per row..  */.
f6a0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
f6b0: 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20  OMPILE_OPTIONS: 
f6c0: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  {.    int i = 0;
f6d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f6e0: 2a 7a 4f 70 74 3b 0a 20 20 20 20 70 50 61 72 73  *zOpt;.    pPars
f6f0: 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20  e->nMem = 1;.   
f700: 20 77 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20   while( (zOpt = 
f710: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f  sqlite3_compileo
f720: 70 74 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21  ption_get(i++))!
f730: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f740: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
f750: 67 28 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20  g(v, 1, zOpt);. 
f760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f770: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
f780: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
f790: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f7a0: 56 64 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b  VdbeReusable(v);
f7b0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
f7c0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
f7d0: 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
f7e0: 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66 6e  N_DIAGS */..#ifn
f7f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f800: 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  WAL.  /*.  **   
f810: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
f820: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 3d  wal_checkpoint =
f830: 20 70 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72 65   passive|full|re
f840: 73 74 61 72 74 7c 74 72 75 6e 63 61 74 65 0a 20  start|truncate. 
f850: 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70 6f   **.  ** Checkpo
f860: 69 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  int the database
f870: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
f880: 61 67 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b 50  agTyp_WAL_CHECKP
f890: 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  OINT: {.    int 
f8a0: 69 42 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69  iBt = (pId2->z?i
f8b0: 44 62 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  Db:SQLITE_MAX_AT
f8c0: 54 41 43 48 45 44 29 3b 0a 20 20 20 20 69 6e 74  TACHED);.    int
f8d0: 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f   eMode = SQLITE_
f8e0: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
f8f0: 56 45 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  VE;.    if( zRig
f900: 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ht ){.      if( 
f910: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
f920: 52 69 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d  Right, "full")==
f930: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
f940: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
f950: 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20  KPOINT_FULL;.   
f960: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
f970: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67  ite3StrICmp(zRig
f980: 68 74 2c 20 22 72 65 73 74 61 72 74 22 29 3d 3d  ht, "restart")==
f990: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
f9a0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
f9b0: 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a  KPOINT_RESTART;.
f9c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f9d0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
f9e0: 52 69 67 68 74 2c 20 22 74 72 75 6e 63 61 74 65  Right, "truncate
f9f0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
fa00: 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f   eMode = SQLITE_
fa10: 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43  CHECKPOINT_TRUNC
fa20: 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ATE;.      }.   
fa30: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e   }.    pParse->n
fa40: 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71 6c  Mem = 3;.    sql
fa50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fa60: 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c  , OP_Checkpoint,
fa70: 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b   iBt, eMode, 1);
fa80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fa90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
faa0: 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20  ultRow, 1, 3);. 
fab0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f   }.  break;..  /
fac0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
fad0: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
fae0: 6e 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  nt.  **   PRAGMA
faf0: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
fb00: 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a  int = N.  **.  *
fb10: 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 20 64 61  * Configure a da
fb20: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
fb30: 6e 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  n to automatical
fb40: 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 20  ly checkpoint a 
fb50: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 66  database.  ** af
fb60: 74 65 72 20 61 63 63 75 6d 75 6c 61 74 69 6e 67  ter accumulating
fb70: 20 4e 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65   N frames in the
fb80: 20 6c 6f 67 2e 20 4f 72 20 71 75 65 72 79 20 66   log. Or query f
fb90: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  or the current v
fba0: 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a  alue.  ** of N..
fbb0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
fbc0: 54 79 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43  Typ_WAL_AUTOCHEC
fbd0: 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 66  KPOINT: {.    if
fbe0: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
fbf0: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
fc00: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  tocheckpoint(db,
fc10: 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69   sqlite3Atoi(zRi
fc20: 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ght));.    }.   
fc30: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
fc40: 28 76 2c 20 0a 20 20 20 20 20 20 20 64 62 2d 3e  (v, .       db->
fc50: 78 57 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73 71  xWalCallback==sq
fc60: 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
fc70: 6f 6f 6b 20 3f 20 0a 20 20 20 20 20 20 20 20 20  ook ? .         
fc80: 20 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f    SQLITE_PTR_TO_
fc90: 49 4e 54 28 64 62 2d 3e 70 57 61 6c 41 72 67 29  INT(db->pWalArg)
fca0: 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65   : 0);.  }.  bre
fcb0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ak;.#endif..  /*
fcc0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 68  .  **  PRAGMA sh
fcd0: 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a  rink_memory.  **
fce0: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
fcf0: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34 35  TION-OF: R-23445
fd00: 2d 34 36 31 30 39 20 54 68 69 73 20 70 72 61 67  -46109 This prag
fd10: 6d 61 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ma causes the da
fd20: 74 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e  tabase.  ** conn
fd30: 65 63 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68 20  ection on which 
fd40: 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  it is invoked to
fd50: 20 66 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   free up as much
fd60: 20 6d 65 6d 6f 72 79 20 61 73 20 69 74 0a 20 20   memory as it.  
fd70: 2a 2a 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c 69  ** can, by calli
fd80: 6e 67 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  ng sqlite3_db_re
fd90: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a  lease_memory()..
fda0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
fdb0: 54 79 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52  Typ_SHRINK_MEMOR
fdc0: 59 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  Y: {.    sqlite3
fdd0: 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
fde0: 72 79 28 64 62 29 3b 0a 20 20 20 20 62 72 65 61  ry(db);.    brea
fdf0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
fe00: 2a 20 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69  *  PRAGMA optimi
fe10: 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  ze.  **  PRAGMA 
fe20: 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20  optimize(MASK). 
fe30: 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65   **  PRAGMA sche
fe40: 6d 61 2e 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a  ma.optimize.  **
fe50: 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61 2e    PRAGMA schema.
fe60: 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20  optimize(MASK). 
fe70: 20 2a 2a 0a 20 20 2a 2a 20 41 74 74 65 6d 70 74   **.  ** Attempt
fe80: 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65   to optimize the
fe90: 20 64 61 74 61 62 61 73 65 2e 20 20 41 6c 6c 20   database.  All 
fea0: 73 63 68 65 6d 61 73 20 61 72 65 20 6f 70 74 69  schemas are opti
feb0: 6d 69 7a 65 64 20 69 6e 20 74 68 65 20 66 69 72  mized in the fir
fec0: 73 74 0a 20 20 2a 2a 20 74 77 6f 20 66 6f 72 6d  st.  ** two form
fed0: 73 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 20  s, and only the 
fee0: 73 70 65 63 69 66 69 65 64 20 73 63 68 65 6d 61  specified schema
fef0: 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e   is optimized in
ff00: 20 74 68 65 20 6c 61 74 74 65 72 20 74 77 6f 2e   the latter two.
ff10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
ff20: 65 74 61 69 6c 73 20 6f 66 20 6f 70 74 69 6d 69  etails of optimi
ff30: 7a 61 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  zations performe
ff40: 64 20 62 79 20 74 68 69 73 20 70 72 61 67 6d 61  d by this pragma
ff50: 20 61 72 65 20 65 78 70 65 63 74 65 64 0a 20 20   are expected.  
ff60: 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 64  ** to change and
ff70: 20 69 6d 70 72 6f 76 65 20 6f 76 65 72 20 74 69   improve over ti
ff80: 6d 65 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e  me.  Application
ff90: 73 20 73 68 6f 75 6c 64 20 61 6e 74 69 63 69 70  s should anticip
ffa0: 61 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ate that.  ** th
ffb0: 69 73 20 70 72 61 67 6d 61 20 77 69 6c 6c 20 70  is pragma will p
ffc0: 65 72 66 6f 72 6d 20 6e 65 77 20 6f 70 74 69 6d  erform new optim
ffd0: 69 7a 61 74 69 6f 6e 73 20 69 6e 20 66 75 74 75  izations in futu
ffe0: 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a  re releases..  *
fff0: 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 70 74 69 6f  *.  ** The optio
10000 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 69 73 20  nal argument is 
10010 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74  a bitmask of opt
10020 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 70 65  imizations to pe
10030 72 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  rform:.  **.  **
10040 20 20 20 20 30 78 30 30 30 31 20 20 20 20 44 65      0x0001    De
10050 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 44  bugging mode.  D
10060 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 70  o not actually p
10070 65 72 66 6f 72 6d 20 61 6e 79 20 6f 70 74 69 6d  erform any optim
10080 69 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 20 20  izations.  **   
10090 20 20 20 20 20 20 20 20 20 20 20 62 75 74 20 69             but i
100a0 6e 73 74 65 61 64 20 72 65 74 75 72 6e 20 6f 6e  nstead return on
100b0 65 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  e line of text f
100c0 6f 72 20 65 61 63 68 20 6f 70 74 69 6d 69 7a 61  or each optimiza
100d0 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20  tion.  **       
100e0 20 20 20 20 20 20 20 74 68 61 74 20 77 6f 75 6c         that woul
100f0 64 20 68 61 76 65 20 62 65 65 6e 20 64 6f 6e 65  d have been done
10100 2e 20 20 4f 66 66 20 62 79 20 64 65 66 61 75 6c  .  Off by defaul
10110 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  t..  **.  **    
10120 30 78 30 30 30 32 20 20 20 20 52 75 6e 20 41 4e  0x0002    Run AN
10130 41 4c 59 5a 45 20 6f 6e 20 74 61 62 6c 65 73 20  ALYZE on tables 
10140 74 68 61 74 20 6d 69 67 68 74 20 62 65 6e 65 66  that might benef
10150 69 74 2e 20 20 4f 6e 20 62 79 20 64 65 66 61 75  it.  On by defau
10160 6c 74 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  lt..  **        
10170 20 20 20 20 20 20 53 65 65 20 62 65 6c 6f 77 20        See below 
10180 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
10190 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a  nformation..  **
101a0 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 34 20  .  **    0x0004 
101b0 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c     (Not yet impl
101c0 65 6d 65 6e 74 65 64 29 20 52 65 63 6f 72 64 20  emented) Record 
101d0 75 73 61 67 65 20 61 6e 64 20 70 65 72 66 6f 72  usage and perfor
101e0 6d 61 6e 63 65 20 0a 20 20 2a 2a 20 20 20 20 20  mance .  **     
101f0 20 20 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61           informa
10200 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63 75  tion from the cu
10210 72 72 65 6e 74 20 73 65 73 73 69 6f 6e 20 69 6e  rrent session in
10220 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 20   the.  **       
10230 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
10240 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
10250 77 69 6c 6c 20 62 65 20 61 76 61 69 6c 61 62 6c  will be availabl
10260 65 20 74 6f 20 22 6f 70 74 69 6d 69 7a 65 22 0a  e to "optimize".
10270 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
10280 20 20 70 72 61 67 6d 61 73 20 72 75 6e 20 62 79    pragmas run by
10290 20 66 75 74 75 72 65 20 64 61 74 61 62 61 73 65   future database
102a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
102b0 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30  **.  **    0x000
102c0 38 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d  8    (Not yet im
102d0 70 6c 65 6d 65 6e 74 65 64 29 20 43 72 65 61 74  plemented) Creat
102e0 65 20 69 6e 64 65 78 65 73 20 74 68 61 74 20 6d  e indexes that m
102f0 69 67 68 74 20 68 61 76 65 0a 20 20 2a 2a 20 20  ight have.  **  
10300 20 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e              been
10310 20 68 65 6c 70 66 75 6c 20 74 6f 20 72 65 63 65   helpful to rece
10320 6e 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 0a  nt queries.  **.
10330 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74    ** The default
10340 20 4d 41 53 4b 20 69 73 20 61 6e 64 20 61 6c 77   MASK is and alw
10350 61 79 73 20 73 68 61 6c 6c 20 62 65 20 30 78 66  ays shall be 0xf
10360 66 66 65 2e 20 20 30 78 66 66 66 65 20 6d 65 61  ffe.  0xfffe mea
10370 6e 73 20 70 65 72 66 6f 72 6d 20 61 6c 6c 0a 20  ns perform all. 
10380 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6d   ** of the optim
10390 69 7a 61 74 69 6f 6e 73 20 6c 69 73 74 65 64 20  izations listed 
103a0 61 62 6f 76 65 20 65 78 63 65 70 74 20 44 65 62  above except Deb
103b0 75 67 20 4d 6f 64 65 2c 20 69 6e 63 6c 75 64 69  ug Mode, includi
103c0 6e 67 20 6e 65 77 0a 20 20 2a 2a 20 6f 70 74 69  ng new.  ** opti
103d0 6d 69 7a 61 74 69 6f 6e 73 20 74 68 61 74 20 68  mizations that h
103e0 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
103f0 20 69 6e 76 65 6e 74 65 64 2e 20 20 49 66 20 6e   invented.  If n
10400 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ew optimizations
10410 20 61 72 65 0a 20 20 2a 2a 20 65 76 65 72 20 61   are.  ** ever a
10420 64 64 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64  dded that should
10430 20 62 65 20 6f 66 66 20 62 79 20 64 65 66 61 75   be off by defau
10440 6c 74 2c 20 74 68 6f 73 65 20 6f 66 66 2d 62 79  lt, those off-by
10450 2d 64 65 66 61 75 6c 74 20 0a 20 20 2a 2a 20 6f  -default .  ** o
10460 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 69 6c  ptimizations wil
10470 6c 20 68 61 76 65 20 62 69 74 6d 61 73 6b 73 20  l have bitmasks 
10480 6f 66 20 30 78 31 30 30 30 30 20 6f 72 20 6c 61  of 0x10000 or la
10490 72 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rger..  **.  ** 
104a0 44 45 54 45 52 4d 49 4e 41 54 49 4f 4e 20 4f 46  DETERMINATION OF
104b0 20 57 48 45 4e 20 54 4f 20 52 55 4e 20 41 4e 41   WHEN TO RUN ANA
104c0 4c 59 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  LYZE.  **.  ** I
104d0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
104e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20  plementation, a 
104f0 74 61 62 6c 65 20 69 73 20 61 6e 61 6c 79 7a 65  table is analyze
10500 64 20 69 66 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  d if only if all
10510 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c   of.  ** the fol
10520 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
10530 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 29 20 4d  .  **.  ** (1) M
10540 41 53 4b 20 62 69 74 20 30 78 30 32 20 69 73 20  ASK bit 0x02 is 
10550 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28  set..  **.  ** (
10560 32 29 20 54 68 65 20 71 75 65 72 79 20 70 6c 61  2) The query pla
10570 6e 6e 65 72 20 75 73 65 64 20 73 71 6c 69 74 65  nner used sqlite
10580 5f 73 74 61 74 31 2d 73 74 79 6c 65 20 73 74 61  _stat1-style sta
10590 74 69 73 74 69 63 73 20 66 6f 72 20 6f 6e 65 20  tistics for one 
105a0 6f 72 0a 20 20 2a 2a 20 20 20 20 20 6d 6f 72 65  or.  **     more
105b0 20 69 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20   indexes of the 
105c0 74 61 62 6c 65 20 61 74 20 73 6f 6d 65 20 70 6f  table at some po
105d0 69 6e 74 20 64 75 72 69 6e 67 20 74 68 65 20 6c  int during the l
105e0 69 66 65 74 69 6d 65 20 6f 66 0a 20 20 2a 2a 20  ifetime of.  ** 
105f0 20 20 20 20 74 68 65 20 63 75 72 72 65 6e 74 20      the current 
10600 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
10610 0a 20 20 2a 2a 20 28 33 29 20 4f 6e 65 20 6f 72  .  ** (3) One or
10620 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66   more indexes of
10630 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 63   the table are c
10640 75 72 72 65 6e 74 6c 79 20 75 6e 61 6e 61 6c 79  urrently unanaly
10650 7a 65 64 20 4f 52 0a 20 20 2a 2a 20 20 20 20 20  zed OR.  **     
10660 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
10670 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
10680 68 61 73 20 69 6e 63 72 65 61 73 65 64 20 62 79  has increased by
10690 20 32 35 20 74 69 6d 65 73 20 6f 72 20 6d 6f 72   25 times or mor
106a0 65 0a 20 20 2a 2a 20 20 20 20 20 73 69 6e 63 65  e.  **     since
106b0 20 74 68 65 20 6c 61 73 74 20 74 69 6d 65 20 41   the last time A
106c0 4e 41 4c 59 5a 45 20 77 61 73 20 72 75 6e 2e 0a  NALYZE was run..
106d0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75    **.  ** The ru
106e0 6c 65 73 20 66 6f 72 20 77 68 65 6e 20 74 61 62  les for when tab
106f0 6c 65 73 20 61 72 65 20 61 6e 61 6c 79 7a 65 64  les are analyzed
10700 20 61 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63   are likely to c
10710 68 61 6e 67 65 20 69 6e 0a 20 20 2a 2a 20 66 75  hange in.  ** fu
10720 74 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20  ture releases.. 
10730 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
10740 79 70 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b 0a 20  yp_OPTIMIZE: {. 
10750 20 20 20 69 6e 74 20 69 44 62 4c 61 73 74 3b 20     int iDbLast; 
10760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
10770 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 70 6f  p termination po
10780 69 6e 74 20 66 6f 72 20 74 68 65 20 73 63 68 65  int for the sche
10790 6d 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  ma loop */.    i
107a0 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20  nt iTabCur;     
107b0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
107c0 66 6f 72 20 61 20 74 61 62 6c 65 20 77 68 6f 73  for a table whos
107d0 65 20 73 69 7a 65 20 6e 65 65 64 73 20 63 68 65  e size needs che
107e0 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 48 61 73  cking */.    Has
107f0 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20  hElem *k;       
10800 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72      /* Loop over
10810 20 74 61 62 6c 65 73 20 6f 66 20 61 20 73 63 68   tables of a sch
10820 65 6d 61 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d  ema */.    Schem
10830 61 20 2a 70 53 63 68 65 6d 61 3b 20 20 20 20 20  a *pSchema;     
10840 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
10850 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 54   schema */.    T
10860 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
10870 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
10880 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a   in the schema *
10890 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
108a0 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x;           /* 
108b0 41 6e 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  An index of the 
108c0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4c 6f 67  table */.    Log
108d0 45 73 74 20 73 7a 54 68 72 65 73 68 6f 6c 64 3b  Est szThreshold;
108e0 20 20 20 20 2f 2a 20 53 69 7a 65 20 74 68 72 65      /* Size thre
108f0 73 68 6f 6c 64 20 61 62 6f 76 65 20 77 68 69 63  shold above whic
10900 68 20 72 65 61 6e 61 6c 79 73 69 73 20 69 73 20  h reanalysis is 
10910 6e 65 65 64 64 20 2a 2f 0a 20 20 20 20 63 68 61  needd */.    cha
10920 72 20 2a 7a 53 75 62 53 71 6c 3b 20 20 20 20 20  r *zSubSql;     
10930 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65      /* SQL state
10940 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 4f 50 5f  ment for the OP_
10950 53 71 6c 45 78 65 63 20 6f 70 63 6f 64 65 20 2a  SqlExec opcode *
10960 2f 0a 20 20 20 20 75 33 32 20 6f 70 4d 61 73 6b  /.    u32 opMask
10970 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10980 4d 61 73 6b 20 6f 66 20 6f 70 65 72 61 74 69 6f  Mask of operatio
10990 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f  ns to perform */
109a0 0a 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ..    if( zRight
109b0 20 29 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b   ){.      opMask
109c0 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 41   = (u32)sqlite3A
109d0 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  toi(zRight);.   
109e0 20 20 20 69 66 28 20 28 6f 70 4d 61 73 6b 20 26     if( (opMask &
109f0 20 30 78 30 32 29 3d 3d 30 20 29 20 62 72 65 61   0x02)==0 ) brea
10a00 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
10a10 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 30 78 66      opMask = 0xf
10a20 66 66 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ffe;.    }.    i
10a30 54 61 62 43 75 72 20 3d 20 70 50 61 72 73 65 2d  TabCur = pParse-
10a40 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 66 6f 72  >nTab++;.    for
10a50 28 69 44 62 4c 61 73 74 20 3d 20 7a 44 62 3f 69  (iDbLast = zDb?i
10a60 44 62 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db:db->nDb-1; iD
10a70 62 3c 3d 69 44 62 4c 61 73 74 3b 20 69 44 62 2b  b<=iDbLast; iDb+
10a80 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44  +){.      if( iD
10a90 62 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==1 ) continue;
10aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
10ab0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
10ac0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
10ad0 20 20 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d     pSchema = db-
10ae0 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
10af0 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73  a;.      for(k=s
10b00 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
10b10 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
10b20 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ); k; k=sqliteHa
10b30 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
10b40 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
10b50 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
10b60 61 28 6b 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  a(k);..        /
10b70 2a 20 49 66 20 74 61 62 6c 65 20 70 54 61 62 20  * If table pTab 
10b80 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 75 73 65  has not been use
10b90 64 20 69 6e 20 61 20 77 61 79 20 74 68 61 74 20  d in a way that 
10ba0 77 6f 75 6c 64 20 62 65 6e 65 66 69 74 20 66 72  would benefit fr
10bb0 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61  om.        ** ha
10bc0 76 69 6e 67 20 61 6e 61 6c 79 73 69 73 20 73 74  ving analysis st
10bd0 61 74 69 73 74 69 63 73 20 64 75 72 69 6e 67 20  atistics during 
10be0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 73 73  the current sess
10bf0 69 6f 6e 2c 20 74 68 65 6e 20 73 6b 69 70 20 69  ion, then skip i
10c00 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  t..        ** Th
10c10 69 73 20 61 6c 73 6f 20 68 61 73 20 74 68 65 20  is also has the 
10c20 65 66 66 65 63 74 20 6f 66 20 73 6b 69 70 70 69  effect of skippi
10c30 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ng virtual table
10c40 73 20 61 6e 64 20 76 69 65 77 73 20 2a 2f 0a 20  s and views */. 
10c50 20 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62         if( (pTab
10c60 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
10c70 53 74 61 74 73 55 73 65 64 29 3d 3d 30 20 29 20  StatsUsed)==0 ) 
10c80 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
10c90 20 20 20 2f 2a 20 52 65 61 6e 61 6c 79 7a 65 20     /* Reanalyze 
10ca0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
10cb0 32 35 20 74 69 6d 65 73 20 6c 61 72 67 65 72 20  25 times larger 
10cc0 74 68 61 6e 20 74 68 65 20 6c 61 73 74 20 61 6e  than the last an
10cd0 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20 20 20  alysis */.      
10ce0 20 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20    szThreshold = 
10cf0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
10d00 20 2b 20 34 36 3b 20 61 73 73 65 72 74 28 20 73   + 46; assert( s
10d10 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29  qlite3LogEst(25)
10d20 3d 3d 34 36 20 29 3b 0a 20 20 20 20 20 20 20 20  ==46 );.        
10d30 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
10d40 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
10d50 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
10d60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
10d70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 7b  Idx->hasStat1 ){
10d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 54  .            szT
10d90 68 72 65 73 68 6f 6c 64 20 3d 20 30 3b 20 2f 2a  hreshold = 0; /*
10da0 20 41 6c 77 61 79 73 20 61 6e 61 6c 79 7a 65 20   Always analyze 
10db0 69 66 20 61 6e 79 20 69 6e 64 65 78 20 6c 61 63  if any index lac
10dc0 6b 73 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f  ks statistics */
10dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
10de0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
10df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10e00 20 20 69 66 28 20 73 7a 54 68 72 65 73 68 6f 6c    if( szThreshol
10e10 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
10e20 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
10e30 70 50 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c  pParse, iTabCur,
10e40 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
10e50 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
10e60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10e70 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 53 6d  ddOp3(v, OP_IfSm
10e80 61 6c 6c 65 72 2c 20 69 54 61 62 43 75 72 2c 20  aller, iTabCur, 
10e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ea0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10eb0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
10ec0 28 76 29 2b 32 2b 28 6f 70 4d 61 73 6b 26 31 29  (v)+2+(opMask&1)
10ed0 2c 20 73 7a 54 68 72 65 73 68 6f 6c 64 29 3b 0a  , szThreshold);.
10ee0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
10ef0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
10f00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 75     }.        zSu
10f10 62 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50  bSql = sqlite3MP
10f20 72 69 6e 74 66 28 64 62 2c 20 22 41 4e 41 4c 59  rintf(db, "ANALY
10f30 5a 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22  ZE \"%w\".\"%w\"
10f40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f60 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
10f70 2e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d  .zDbSName, pTab-
10f80 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
10f90 20 69 66 28 20 6f 70 4d 61 73 6b 20 26 20 30 78   if( opMask & 0x
10fa0 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  01 ){.          
10fb0 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
10fc0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
10fd0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
10fe0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
10ff0 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
11000 2c 20 72 31 2c 20 30 2c 20 7a 53 75 62 53 71 6c  , r1, 0, zSubSql
11010 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
11020 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11030 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11040 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 31 2c 20  _ResultRow, r1, 
11050 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
11060 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
11070 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11080 2c 20 4f 50 5f 53 71 6c 45 78 65 63 2c 20 30 2c  , OP_SqlExec, 0,
11090 20 30 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20   0, 0, zSubSql, 
110a0 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
110b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
110c0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
110d0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
110e0 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20 62 72  _Expire);.    br
110f0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
11100 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73   **   PRAGMA bus
11110 79 5f 74 69 6d 65 6f 75 74 0a 20 20 2a 2a 20 20  y_timeout.  **  
11120 20 50 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d   PRAGMA busy_tim
11130 65 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20  eout = N.  **.  
11140 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ** Call sqlite3_
11150 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c  busy_timeout(db,
11160 20 4e 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65   N).  Return the
11170 20 63 75 72 72 65 6e 74 20 74 69 6d 65 6f 75 74   current timeout
11180 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 66 20 6f   value.  ** if o
11190 6e 65 20 69 73 20 73 65 74 2e 20 20 49 66 20 6e  ne is set.  If n
111a0 6f 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 6f  o busy handler o
111b0 72 20 61 20 64 69 66 66 65 72 65 6e 74 20 62 75  r a different bu
111c0 73 79 20 68 61 6e 64 6c 65 72 20 69 73 20 73 65  sy handler is se
111d0 74 0a 20 20 2a 2a 20 74 68 65 6e 20 30 20 69 73  t.  ** then 0 is
111e0 20 72 65 74 75 72 6e 65 64 2e 20 20 53 65 74 74   returned.  Sett
111f0 69 6e 67 20 74 68 65 20 62 75 73 79 5f 74 69 6d  ing the busy_tim
11200 65 6f 75 74 20 74 6f 20 30 20 6f 72 20 6e 65 67  eout to 0 or neg
11210 61 74 69 76 65 0a 20 20 2a 2a 20 64 69 73 61 62  ative.  ** disab
11220 6c 65 73 20 74 68 65 20 74 69 6d 65 6f 75 74 2e  les the timeout.
11230 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61 73 65 20 50  .  */.  /*case P
11240 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45  ragTyp_BUSY_TIME
11250 4f 55 54 2a 2f 20 64 65 66 61 75 6c 74 3a 20 7b  OUT*/ default: {
11260 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
11270 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 3d 3d  agma->ePragTyp==
11280 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d  PragTyp_BUSY_TIM
11290 45 4f 55 54 20 29 3b 0a 20 20 20 20 69 66 28 20  EOUT );.    if( 
112a0 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
112b0 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
112c0 65 6f 75 74 28 64 62 2c 20 73 71 6c 69 74 65 33  eout(db, sqlite3
112d0 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20  Atoi(zRight));. 
112e0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
112f0 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e  ingleInt(v, db->
11300 62 75 73 79 54 69 6d 65 6f 75 74 29 3b 0a 20 20  busyTimeout);.  
11310 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
11320 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
11330 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74   soft_heap_limit
11340 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73  .  **   PRAGMA s
11350 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3d  oft_heap_limit =
11360 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50   N.  **.  ** IMP
11370 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
11380 52 2d 32 36 33 34 33 2d 34 35 39 33 30 20 54 68  R-26343-45930 Th
11390 69 73 20 70 72 61 67 6d 61 20 69 6e 76 6f 6b 65  is pragma invoke
113a0 73 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  s the.  ** sqlit
113b0 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
113c0 69 74 36 34 28 29 20 69 6e 74 65 72 66 61 63 65  it64() interface
113d0 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d 65   with the argume
113e0 6e 74 20 4e 2c 20 69 66 20 4e 20 69 73 0a 20 20  nt N, if N is.  
113f0 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 6e 64  ** specified and
11400 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69   is a non-negati
11410 76 65 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a  ve integer..  **
11420 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
11430 4f 46 3a 20 52 2d 36 34 34 35 31 2d 30 37 31 36  OF: R-64451-0716
11440 33 20 54 68 65 20 73 6f 66 74 5f 68 65 61 70 5f  3 The soft_heap_
11450 6c 69 6d 69 74 20 70 72 61 67 6d 61 20 61 6c 77  limit pragma alw
11460 61 79 73 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  ays.  ** returns
11470 20 74 68 65 20 73 61 6d 65 20 69 6e 74 65 67 65   the same intege
11480 72 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20  r that would be 
11490 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a  returned by the.
114a0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66    ** sqlite3_sof
114b0 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d  t_heap_limit64(-
114c0 31 29 20 43 2d 6c 61 6e 67 75 61 67 65 20 66 75  1) C-language fu
114d0 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
114e0 61 73 65 20 50 72 61 67 54 79 70 5f 53 4f 46 54  ase PragTyp_SOFT
114f0 5f 48 45 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20  _HEAP_LIMIT: {. 
11500 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
11510 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67   N;.    if( zRig
11520 68 74 20 26 26 20 73 71 6c 69 74 65 33 44 65 63  ht && sqlite3Dec
11530 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68  OrHexToI64(zRigh
11540 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f  t, &N)==SQLITE_O
11550 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
11560 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
11570 69 74 36 34 28 4e 29 3b 0a 20 20 20 20 7d 0a 20  it64(N);.    }. 
11580 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
11590 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 73 6f  nt(v, sqlite3_so
115a0 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
115b0 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  -1));.    break;
115c0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
115d0 20 20 50 52 41 47 4d 41 20 74 68 72 65 61 64 73    PRAGMA threads
115e0 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
115f0 68 72 65 61 64 73 20 3d 20 4e 0a 20 20 2a 2a 0a  hreads = N.  **.
11600 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74    ** Configure t
11610 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
11620 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65  r of worker thre
11630 61 64 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ads.  Return the
11640 20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78 69 6d 75   new.  ** maximu
11650 6d 2c 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  m, which might b
11660 65 20 6c 65 73 73 20 74 68 61 6e 20 72 65 71 75  e less than requ
11670 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ested..  */.  ca
11680 73 65 20 50 72 61 67 54 79 70 5f 54 48 52 45 41  se PragTyp_THREA
11690 44 53 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  DS: {.    sqlite
116a0 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69  3_int64 N;.    i
116b0 66 28 20 7a 52 69 67 68 74 0a 20 20 20 20 20 26  f( zRight.     &
116c0 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  & sqlite3DecOrHe
116d0 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26  xToI64(zRight, &
116e0 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  N)==SQLITE_OK.  
116f0 20 20 20 26 26 20 4e 3e 3d 30 0a 20 20 20 20 29     && N>=0.    )
11700 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11710 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45  limit(db, SQLITE
11720 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
11730 52 45 41 44 53 2c 20 28 69 6e 74 29 28 4e 26 30  READS, (int)(N&0
11740 78 37 66 66 66 66 66 66 66 29 29 3b 0a 20 20 20  x7fffffff));.   
11750 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
11760 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65  gleInt(v, sqlite
11770 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49  3_limit(db, SQLI
11780 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
11790 54 48 52 45 41 44 53 2c 20 2d 31 29 29 3b 0a 20  THREADS, -1));. 
117a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23     break;.  }..#
117b0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
117c0 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
117d0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
117e0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f 72  .  /*.  ** Repor
117f0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  t the current st
11800 61 74 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67 73  ate of file logs
11810 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
11820 65 73 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  es.  */.  case P
11830 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 53 54 41 54  ragTyp_LOCK_STAT
11840 55 53 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63  US: {.    static
11850 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
11860 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20  st azLockName[] 
11870 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e 6c 6f 63  = {.      "unloc
11880 6b 65 64 22 2c 20 22 73 68 61 72 65 64 22 2c 20  ked", "shared", 
11890 22 72 65 73 65 72 76 65 64 22 2c 20 22 70 65 6e  "reserved", "pen
118a0 64 69 6e 67 22 2c 20 22 65 78 63 6c 75 73 69 76  ding", "exclusiv
118b0 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  e".    };.    in
118c0 74 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  t i;.    pParse-
118d0 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66  >nMem = 2;.    f
118e0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
118f0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
11900 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 20  tree *pBt;.     
11910 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
11920 61 74 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  ate = "unknown";
11930 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
11940 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
11950 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30 20 29  i].zDbSName==0 )
11960 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
11970 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69   pBt = db->aDb[i
11980 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
11990 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74   pBt==0 || sqlit
119a0 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
119b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
119c0 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f 73 65 64  zState = "closed
119d0 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
119e0 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  f( sqlite3_file_
119f0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69 20 3f 20  control(db, i ? 
11a00 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
11a10 61 6d 65 20 3a 20 30 2c 20 0a 20 20 20 20 20 20  ame : 0, .      
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
11a40 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
11a50 53 54 41 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49  STATE, &j)==SQLI
11a60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11a70 20 20 7a 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63    zState = azLoc
11a80 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20  kName[j];.      
11a90 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
11aa0 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
11ab0 31 2c 20 22 73 73 22 2c 20 64 62 2d 3e 61 44 62  1, "ss", db->aDb
11ac0 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 53  [i].zDbSName, zS
11ad0 74 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tate);.    }.   
11ae0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
11af0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
11b00 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 63 61  E_HAS_CODEC.  ca
11b10 73 65 20 50 72 61 67 54 79 70 5f 4b 45 59 3a 20  se PragTyp_KEY: 
11b20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
11b30 20 29 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76   ) sqlite3_key_v
11b40 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68  2(db, zDb, zRigh
11b50 74 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  t, sqlite3Strlen
11b60 33 30 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20  30(zRight));.   
11b70 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61   break;.  }.  ca
11b80 73 65 20 50 72 61 67 54 79 70 5f 52 45 4b 45 59  se PragTyp_REKEY
11b90 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
11ba0 68 74 20 29 20 73 71 6c 69 74 65 33 5f 72 65 6b  ht ) sqlite3_rek
11bb0 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
11bc0 52 69 67 68 74 2c 20 73 71 6c 69 74 65 33 53 74  Right, sqlite3St
11bd0 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 29 3b  rlen30(zRight));
11be0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11bf0 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 48    case PragTyp_H
11c00 45 58 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66 28  EXKEY: {.    if(
11c10 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
11c20 20 75 38 20 69 42 79 74 65 3b 0a 20 20 20 20 20   u8 iByte;.     
11c30 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 68   int i;.      ch
11c40 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a 20 20 20  ar zKey[40];.   
11c50 20 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74     for(i=0, iByt
11c60 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 4b  e=0; i<sizeof(zK
11c70 65 79 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33  ey)*2 && sqlite3
11c80 49 73 78 64 69 67 69 74 28 7a 52 69 67 68 74 5b  Isxdigit(zRight[
11c90 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i]); i++){.     
11ca0 20 20 20 69 42 79 74 65 20 3d 20 28 69 42 79 74     iByte = (iByt
11cb0 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48  e<<4) + sqlite3H
11cc0 65 78 54 6f 49 6e 74 28 7a 52 69 67 68 74 5b 69  exToInt(zRight[i
11cd0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
11ce0 28 69 26 31 29 21 3d 30 20 29 20 7a 4b 65 79 5b  (i&1)!=0 ) zKey[
11cf0 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20  i/2] = iByte;.  
11d00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11d10 28 7a 4c 65 66 74 5b 33 5d 20 26 20 30 78 66 29  (zLeft[3] & 0xf)
11d20 3d 3d 30 78 62 20 29 7b 0a 20 20 20 20 20 20 20  ==0xb ){.       
11d30 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28   sqlite3_key_v2(
11d40 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69  db, zDb, zKey, i
11d50 2f 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  /2);.      }else
11d60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11d70 33 5f 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a  3_rekey_v2(db, z
11d80 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a  Db, zKey, i/2);.
11d90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11da0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
11db0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
11dc0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
11dd0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
11de0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44  ITE_ENABLE_CEROD
11df0 29 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  ).  case PragTyp
11e00 5f 41 43 54 49 56 41 54 45 5f 45 58 54 45 4e 53  _ACTIVATE_EXTENS
11e10 49 4f 4e 53 3a 20 69 66 28 20 7a 52 69 67 68 74  IONS: if( zRight
11e20 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
11e30 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
11e40 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
11e50 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 73 65 65  Cmp(zRight, "see
11e60 2d 22 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20  -", 4)==0 ){.   
11e70 20 20 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76     sqlite3_activ
11e80 61 74 65 5f 73 65 65 28 26 7a 52 69 67 68 74 5b  ate_see(&zRight[
11e90 34 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  4]);.    }.#endi
11ea0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
11eb0 45 4e 41 42 4c 45 5f 43 45 52 4f 44 0a 20 20 20  ENABLE_CEROD.   
11ec0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
11ed0 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 63 65  ICmp(zRight, "ce
11ee0 72 6f 64 2d 22 2c 20 36 29 3d 3d 30 20 29 7b 0a  rod-", 6)==0 ){.
11ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61 63        sqlite3_ac
11f00 74 69 76 61 74 65 5f 63 65 72 6f 64 28 26 7a 52  tivate_cerod(&zR
11f10 69 67 68 74 5b 36 5d 29 3b 0a 20 20 20 20 7d 0a  ight[6]);.    }.
11f20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65  #endif.  }.  bre
11f30 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 20  ak;.#endif..  } 
11f40 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 50 52  /* End of the PR
11f50 41 47 4d 41 20 73 77 69 74 63 68 20 2a 2f 0a 0a  AGMA switch */..
11f60 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
11f70 6e 67 20 62 6c 6f 63 6b 20 69 73 20 61 20 6e 6f  ng block is a no
11f80 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54  -op unless SQLIT
11f90 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
11fa0 65 64 2e 20 49 74 73 20 6f 6e 6c 79 0a 20 20 2a  ed. Its only.  *
11fb0 2a 20 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20  * purpose is to 
11fc0 65 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  execute assert()
11fd0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 76   statements to v
11fe0 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
11ff0 65 0a 20 20 2a 2a 20 50 72 61 67 46 6c 67 5f 4e  e.  ** PragFlg_N
12000 6f 43 6f 6c 75 6d 6e 73 31 20 66 6c 61 67 20 69  oColumns1 flag i
12010 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 63 61  s set and the ca
12020 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61  ller specified a
12030 6e 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20  n argument.  ** 
12040 74 6f 20 74 68 65 20 50 52 41 47 4d 41 2c 20 74  to the PRAGMA, t
12050 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
12060 6e 20 68 61 73 20 6e 6f 74 20 61 64 64 65 64 20  n has not added 
12070 61 6e 79 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  any OP_ResultRow
12080 20 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69   .  ** instructi
12090 6f 6e 73 20 74 6f 20 74 68 65 20 56 4d 2e 20 20  ons to the VM.  
120a0 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d  */.  if( (pPragm
120b0 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72  a->mPragFlg & Pr
120c0 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31  agFlg_NoColumns1
120d0 29 20 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20  ) && zRight ){. 
120e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
120f0 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28  rifyNoResultRow(
12100 76 29 3b 0a 20 20 7d 0a 0a 70 72 61 67 6d 61 5f  v);.  }..pragma_
12110 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  out:.  sqlite3Db
12120 46 72 65 65 28 64 62 2c 20 7a 4c 65 66 74 29 3b  Free(db, zLeft);
12130 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12140 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 7d 0a  (db, zRight);.}.
12150 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12160 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
12170 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
12180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
121c0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
121d0 6e 20 6f 66 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  n of an eponymou
121e0 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
121f0 74 68 61 74 20 72 75 6e 73 20 61 20 70 72 61 67  that runs a prag
12200 6d 61 2e 0a 2a 2a 0a 2a 2f 0a 74 79 70 65 64 65  ma..**.*/.typede
12210 66 20 73 74 72 75 63 74 20 50 72 61 67 6d 61 56  f struct PragmaV
12220 74 61 62 20 50 72 61 67 6d 61 56 74 61 62 3b 0a  tab PragmaVtab;.
12230 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
12240 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20  ragmaVtabCursor 
12250 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
12260 3b 0a 73 74 72 75 63 74 20 50 72 61 67 6d 61 56  ;.struct PragmaV
12270 74 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  tab {.  sqlite3_
12280 76 74 61 62 20 62 61 73 65 3b 20 20 20 20 20 20  vtab base;      
12290 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e    /* Base class.
122a0 20 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20    Must be first 
122b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
122c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
122d0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
122e0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 77 68 69  onnection to whi
122f0 63 68 20 69 74 20 62 65 6c 6f 6e 67 73 20 2a 2f  ch it belongs */
12300 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e  .  const PragmaN
12310 61 6d 65 20 2a 70 4e 61 6d 65 3b 20 20 2f 2a 20  ame *pName;  /* 
12320 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 61 67  Name of the prag
12330 6d 61 20 2a 2f 0a 20 20 75 38 20 6e 48 69 64 64  ma */.  u8 nHidd
12340 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
12350 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68    /* Number of h
12360 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 2a 2f  idden columns */
12370 0a 20 20 75 38 20 69 48 69 64 64 65 6e 3b 20 20  .  u8 iHidden;  
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12390 49 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72  Index of the fir
123a0 73 74 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  st hidden column
123b0 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 50 72   */.};.struct Pr
123c0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 7b  agmaVtabCursor {
123d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
123e0 63 75 72 73 6f 72 20 62 61 73 65 3b 20 2f 2a 20  cursor base; /* 
123f0 42 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73  Base class.  Mus
12400 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  t be first */.  
12410 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 50  sqlite3_stmt *pP
12420 72 61 67 6d 61 3b 20 20 20 20 2f 2a 20 54 68 65  ragma;    /* The
12430 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e   pragma statemen
12440 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 20 20 73 71  t to run */.  sq
12450 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 69  lite_int64 iRowi
12460 64 3b 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65  d;      /* Curre
12470 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 63 68  nt rowid */.  ch
12480 61 72 20 2a 61 7a 41 72 67 5b 32 5d 3b 20 20 20  ar *azArg[2];   
12490 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
124a0 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
124b0 20 61 6e 64 20 73 63 68 65 6d 61 20 2a 2f 0a 7d   and schema */.}
124c0 3b 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61  ;../* .** Pragma
124d0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
124e0 6f 64 75 6c 65 20 78 43 6f 6e 6e 65 63 74 20 6d  odule xConnect m
124f0 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
12500 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43   int pragmaVtabC
12510 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65  onnect(.  sqlite
12520 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70  3 *db,.  void *p
12530 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  Aux,.  int argc,
12540 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
12550 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74  st*argv,.  sqlit
12560 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62  e3_vtab **ppVtab
12570 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
12580 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67  .){.  const Prag
12590 6d 61 4e 61 6d 65 20 2a 70 50 72 61 67 6d 61 20  maName *pPragma 
125a0 3d 20 28 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e  = (const PragmaN
125b0 61 6d 65 2a 29 70 41 75 78 3b 0a 20 20 50 72 61  ame*)pAux;.  Pra
125c0 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20  gmaVtab *pTab = 
125d0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  0;.  int rc;.  i
125e0 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  nt i, j;.  char 
125f0 63 53 65 70 20 3d 20 27 28 27 3b 0a 20 20 53 74  cSep = '(';.  St
12600 72 41 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68  rAccum acc;.  ch
12610 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 0a 20  ar zBuf[200];.. 
12620 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12630 52 28 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45  R(argc);.  UNUSE
12640 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 76  D_PARAMETER(argv
12650 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
12660 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30  ccumInit(&acc, 0
12670 2c 20 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a  , zBuf, sizeof(z
12680 42 75 66 29 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Buf), 0);.  sqli
12690 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
126a0 64 41 6c 6c 28 26 61 63 63 2c 20 22 43 52 45 41  dAll(&acc, "CREA
126b0 54 45 20 54 41 42 4c 45 20 78 22 29 3b 0a 20 20  TE TABLE x");.  
126c0 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67  for(i=0, j=pPrag
126d0 6d 61 2d 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20  ma->iPragCName; 
126e0 69 3c 70 50 72 61 67 6d 61 2d 3e 6e 50 72 61 67  i<pPragma->nPrag
126f0 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20 6a 2b 2b 29  CName; i++, j++)
12700 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  {.    sqlite3XPr
12710 69 6e 74 66 28 26 61 63 63 2c 20 22 25 63 5c 22  intf(&acc, "%c\"
12720 25 73 5c 22 22 2c 20 63 53 65 70 2c 20 70 72 61  %s\"", cSep, pra
12730 67 43 4e 61 6d 65 5b 6a 5d 29 3b 0a 20 20 20 20  gCName[j]);.    
12740 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 7d 0a  cSep = ',';.  }.
12750 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20    if( i==0 ){.  
12760 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
12770 28 26 61 63 63 2c 20 22 28 5c 22 25 73 5c 22 22  (&acc, "(\"%s\""
12780 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
12790 29 3b 0a 20 20 20 20 63 53 65 70 20 3d 20 27 2c  );.    cSep = ',
127a0 27 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  ';.    i++;.  }.
127b0 20 20 6a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70    j = 0;.  if( p
127c0 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67  Pragma->mPragFlg
127d0 20 26 20 50 72 61 67 46 6c 67 5f 52 65 73 75 6c   & PragFlg_Resul
127e0 74 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t1 ){.    sqlite
127f0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
12800 6c 6c 28 26 61 63 63 2c 20 22 2c 61 72 67 20 48  ll(&acc, ",arg H
12810 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b  IDDEN");.    j++
12820 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 61  ;.  }.  if( pPra
12830 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
12840 28 50 72 61 67 46 6c 67 5f 53 63 68 65 6d 61 4f  (PragFlg_SchemaO
12850 70 74 7c 50 72 61 67 46 6c 67 5f 53 63 68 65 6d  pt|PragFlg_Schem
12860 61 52 65 71 29 20 29 7b 0a 20 20 20 20 73 71 6c  aReq) ){.    sql
12870 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
12880 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 2c 73 63  ndAll(&acc, ",sc
12890 68 65 6d 61 20 48 49 44 44 45 4e 22 29 3b 0a 20  hema HIDDEN");. 
128a0 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71     j++;.  }.  sq
128b0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
128c0 65 6e 64 28 26 61 63 63 2c 20 22 29 22 2c 20 31  end(&acc, ")", 1
128d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
128e0 63 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29  ccumFinish(&acc)
128f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 72 6c  ;.  assert( strl
12900 65 6e 28 7a 42 75 66 29 20 3c 20 73 69 7a 65 6f  en(zBuf) < sizeo
12910 66 28 7a 42 75 66 29 2d 31 20 29 3b 0a 20 20 72  f(zBuf)-1 );.  r
12920 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  c = sqlite3_decl
12930 61 72 65 5f 76 74 61 62 28 64 62 2c 20 7a 42 75  are_vtab(db, zBu
12940 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  f);.  if( rc==SQ
12950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
12960 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Tab = (PragmaVta
12970 62 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  b*)sqlite3_mallo
12980 63 28 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56  c(sizeof(PragmaV
12990 74 61 62 29 29 3b 0a 20 20 20 20 69 66 28 20 70  tab));.    if( p
129a0 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
129b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
129c0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
129d0 20 20 20 20 6d 65 6d 73 65 74 28 70 54 61 62 2c      memset(pTab,
129e0 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61 67 6d   0, sizeof(Pragm
129f0 61 56 74 61 62 29 29 3b 0a 20 20 20 20 20 20 70  aVtab));.      p
12a00 54 61 62 2d 3e 70 4e 61 6d 65 20 3d 20 70 50 72  Tab->pName = pPr
12a10 61 67 6d 61 3b 0a 20 20 20 20 20 20 70 54 61 62  agma;.      pTab
12a20 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20  ->db = db;.     
12a30 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 20 3d   pTab->iHidden =
12a40 20 69 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   i;.      pTab->
12a50 6e 48 69 64 64 65 6e 20 3d 20 6a 3b 0a 20 20 20  nHidden = j;.   
12a60 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
12a70 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
12a80 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
12a90 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
12aa0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 74  ));.  }..  *ppVt
12ab0 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74  ab = (sqlite3_vt
12ac0 61 62 2a 29 70 54 61 62 3b 0a 20 20 72 65 74 75  ab*)pTab;.  retu
12ad0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
12ae0 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   Pragma virtual 
12af0 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 44 69  table module xDi
12b00 73 63 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e  sconnect method.
12b10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12b20 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f 6e 6e  ragmaVtabDisconn
12b30 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ect(sqlite3_vtab
12b40 20 2a 70 56 74 61 62 29 7b 0a 20 20 50 72 61 67   *pVtab){.  Prag
12b50 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28  maVtab *pTab = (
12b60 50 72 61 67 6d 61 56 74 61 62 2a 29 70 56 74 61  PragmaVtab*)pVta
12b70 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  b;.  sqlite3_fre
12b80 65 28 70 54 61 62 29 3b 0a 20 20 72 65 74 75 72  e(pTab);.  retur
12b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12ba0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
12bb0 65 20 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20  e best index to 
12bc0 75 73 65 20 74 6f 20 73 65 61 72 63 68 20 61 20  use to search a 
12bd0 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  pragma virtual t
12be0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  able..**.** Ther
12bf0 65 20 61 72 65 20 6e 6f 74 20 72 65 61 6c 6c 79  e are not really
12c00 20 61 6e 79 20 69 6e 64 65 78 20 63 68 6f 69 63   any index choic
12c10 65 73 2e 20 20 42 75 74 20 77 65 20 77 61 6e 74  es.  But we want
12c20 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68   to encourage th
12c30 65 0a 2a 2a 20 71 75 65 72 79 20 70 6c 61 6e 6e  e.** query plann
12c40 65 72 20 74 6f 20 67 69 76 65 20 3d 3d 20 63 6f  er to give == co
12c50 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 73 20  nstraints on as 
12c60 6d 61 6e 79 20 68 69 64 64 65 6e 20 70 61 72 61  many hidden para
12c70 6d 65 74 65 72 73 20 61 73 0a 2a 2a 20 70 6f 73  meters as.** pos
12c80 73 69 62 6c 65 2c 20 61 6e 64 20 65 73 70 65 63  sible, and espec
12c90 69 61 6c 6c 79 20 6f 6e 20 74 68 65 20 66 69 72  ially on the fir
12ca0 73 74 20 68 69 64 64 65 6e 20 70 61 72 61 6d 65  st hidden parame
12cb0 74 65 72 2e 20 20 53 6f 20 72 65 74 75 72 6e 20  ter.  So return 
12cc0 61 0a 2a 2a 20 68 69 67 68 20 63 6f 73 74 20 69  a.** high cost i
12cd0 66 20 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74  f hidden paramet
12ce0 65 72 73 20 61 72 65 20 75 6e 63 6f 6e 73 74 72  ers are unconstr
12cf0 61 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ained..*/.static
12d00 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 42   int pragmaVtabB
12d10 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74 65 33  estIndex(sqlite3
12d20 5f 76 74 61 62 20 2a 74 61 62 2c 20 73 71 6c 69  _vtab *tab, sqli
12d30 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
12d40 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20 50 72 61  pIdxInfo){.  Pra
12d50 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20  gmaVtab *pTab = 
12d60 28 50 72 61 67 6d 61 56 74 61 62 2a 29 74 61 62  (PragmaVtab*)tab
12d70 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
12d80 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
12d90 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73  onstraint *pCons
12da0 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  traint;.  int i,
12db0 20 6a 3b 0a 20 20 69 6e 74 20 73 65 65 6e 5b 32   j;.  int seen[2
12dc0 5d 3b 0a 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ];..  pIdxInfo->
12dd0 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
12de0 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69 66 28  (double)1;.  if(
12df0 20 70 54 61 62 2d 3e 6e 48 69 64 64 65 6e 3d 3d   pTab->nHidden==
12e00 30 20 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  0 ){ return SQLI
12e10 54 45 5f 4f 4b 3b 20 7d 0a 20 20 70 43 6f 6e 73  TE_OK; }.  pCons
12e20 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66  traint = pIdxInf
12e30 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
12e40 20 20 73 65 65 6e 5b 30 5d 20 3d 20 30 3b 0a 20    seen[0] = 0;. 
12e50 20 73 65 65 6e 5b 31 5d 20 3d 20 30 3b 0a 20 20   seen[1] = 0;.  
12e60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
12e70 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
12e80 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74 72 61 69  ; i++, pConstrai
12e90 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  nt++){.    if( p
12ea0 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73 61 62  Constraint->usab
12eb0 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  le==0 ) continue
12ec0 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74  ;.    if( pConst
12ed0 72 61 69 6e 74 2d 3e 6f 70 21 3d 53 51 4c 49 54  raint->op!=SQLIT
12ee0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
12ef0 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69 6e 75 65  NT_EQ ) continue
12f00 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74  ;.    if( pConst
12f10 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3c  raint->iColumn <
12f20 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 20 29   pTab->iHidden )
12f30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6a   continue;.    j
12f40 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e   = pConstraint->
12f50 69 43 6f 6c 75 6d 6e 20 2d 20 70 54 61 62 2d 3e  iColumn - pTab->
12f60 69 48 69 64 64 65 6e 3b 0a 20 20 20 20 61 73 73  iHidden;.    ass
12f70 65 72 74 28 20 6a 20 3c 20 32 20 29 3b 0a 20 20  ert( j < 2 );.  
12f80 20 20 73 65 65 6e 5b 6a 5d 20 3d 20 69 2b 31 3b    seen[j] = i+1;
12f90 0a 20 20 7d 0a 20 20 69 66 28 20 73 65 65 6e 5b  .  }.  if( seen[
12fa0 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 64  0]==0 ){.    pId
12fb0 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
12fc0 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 32  Cost = (double)2
12fd0 31 34 37 34 38 33 36 34 37 3b 0a 20 20 20 20 70  147483647;.    p
12fe0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
12ff0 65 64 52 6f 77 73 20 3d 20 32 31 34 37 34 38 33  edRows = 2147483
13000 36 34 37 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  647;.    return 
13010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13020 20 6a 20 3d 20 73 65 65 6e 5b 30 5d 2d 31 3b 0a   j = seen[0]-1;.
13030 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
13040 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e  straintUsage[j].
13050 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20  argvIndex = 1;. 
13060 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
13070 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f  traintUsage[j].o
13080 6d 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 73  mit = 1;.  if( s
13090 65 65 6e 5b 31 5d 3d 3d 30 20 29 20 72 65 74 75  een[1]==0 ) retu
130a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
130b0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
130c0 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c  tedCost = (doubl
130d0 65 29 32 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f  e)20;.  pIdxInfo
130e0 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
130f0 3d 20 32 30 3b 0a 20 20 6a 20 3d 20 73 65 65 6e  = 20;.  j = seen
13100 5b 31 5d 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66  [1]-1;.  pIdxInf
13110 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
13120 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78  age[j].argvIndex
13130 20 3d 20 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 2;.  pIdxInfo
13140 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
13150 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a  ge[j].omit = 1;.
13160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13170 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65  OK;.}../* Create
13180 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
13190 72 20 74 68 65 20 70 72 61 67 6d 61 20 76 69 72  r the pragma vir
131a0 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 73 74  tual table */.st
131b0 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
131c0 74 61 62 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  tabOpen(sqlite3_
131d0 76 74 61 62 20 2a 70 56 74 61 62 2c 20 73 71 6c  vtab *pVtab, sql
131e0 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
131f0 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20   **ppCursor){.  
13200 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13210 20 2a 70 43 73 72 3b 0a 20 20 70 43 73 72 20 3d   *pCsr;.  pCsr =
13220 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73   (PragmaVtabCurs
13230 6f 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  or*)sqlite3_mall
13240 6f 63 28 73 69 7a 65 6f 66 28 2a 70 43 73 72 29  oc(sizeof(*pCsr)
13250 29 3b 0a 20 20 69 66 28 20 70 43 73 72 3d 3d 30  );.  if( pCsr==0
13260 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
13270 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
13280 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCsr, 0, sizeof
13290 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
132a0 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e 62 61 73  r));.  pCsr->bas
132b0 65 2e 70 56 74 61 62 20 3d 20 70 56 74 61 62 3b  e.pVtab = pVtab;
132c0 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 26  .  *ppCursor = &
132d0 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65  pCsr->base;.  re
132e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
132f0 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20 61 6c 6c 20  }../* Clear all 
13300 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 72 61  content from pra
13310 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
13320 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 73 74 61  e cursor. */.sta
13330 74 69 63 20 76 6f 69 64 20 70 72 61 67 6d 61 56  tic void pragmaV
13340 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28 50  tabCursorClear(P
13350 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20  ragmaVtabCursor 
13360 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 69 3b  *pCsr){.  int i;
13370 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
13380 69 7a 65 28 70 43 73 72 2d 3e 70 50 72 61 67 6d  ize(pCsr->pPragm
13390 61 29 3b 0a 20 20 70 43 73 72 2d 3e 70 50 72 61  a);.  pCsr->pPra
133a0 67 6d 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  gma = 0;.  for(i
133b0 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
133c0 70 43 73 72 2d 3e 61 7a 41 72 67 29 3b 20 69 2b  pCsr->azArg); i+
133d0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
133e0 66 72 65 65 28 70 43 73 72 2d 3e 61 7a 41 72 67  free(pCsr->azArg
133f0 5b 69 5d 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e  [i]);.    pCsr->
13400 61 7a 41 72 67 5b 69 5d 20 3d 20 30 3b 0a 20 20  azArg[i] = 0;.  
13410 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73 65 20 61 20  }.}../* Close a 
13420 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  pragma virtual t
13430 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 73  able cursor */.s
13440 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
13450 56 74 61 62 43 6c 6f 73 65 28 73 71 6c 69 74 65  VtabClose(sqlite
13460 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
13470 75 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  ur){.  PragmaVta
13480 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  bCursor *pCsr = 
13490 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
134a0 72 2a 29 63 75 72 3b 0a 20 20 70 72 61 67 6d 61  r*)cur;.  pragma
134b0 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28  VtabCursorClear(
134c0 70 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCsr);.  sqlite3
134d0 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20 20 72  _free(pCsr);.  r
134e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
134f0 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63 65 20 74  .}../* Advance t
13500 68 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61  he pragma virtua
13510 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74  l table cursor t
13520 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 2a  o the next row *
13530 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
13540 67 6d 61 56 74 61 62 4e 65 78 74 28 73 71 6c 69  gmaVtabNext(sqli
13550 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
13560 2a 70 56 74 61 62 43 75 72 73 6f 72 29 7b 0a 20  *pVtabCursor){. 
13570 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   PragmaVtabCurso
13580 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d  r *pCsr = (Pragm
13590 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74  aVtabCursor*)pVt
135a0 61 62 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20  abCursor;.  int 
135b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
135c0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
135d0 74 68 65 20 78 52 6f 77 69 64 20 76 61 6c 75 65  the xRowid value
135e0 20 2a 2f 0a 20 20 70 43 73 72 2d 3e 69 52 6f 77   */.  pCsr->iRow
135f0 69 64 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  id++;.  assert( 
13600 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20 29 3b  pCsr->pPragma );
13610 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f  .  if( SQLITE_RO
13620 57 21 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W!=sqlite3_step(
13630 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 20 29  pCsr->pPragma) )
13640 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
13650 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72  e3_finalize(pCsr
13660 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20 20 20 20  ->pPragma);.    
13670 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20 3d 20  pCsr->pPragma = 
13680 30 3b 0a 20 20 20 20 70 72 61 67 6d 61 56 74 61  0;.    pragmaVta
13690 62 43 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73  bCursorClear(pCs
136a0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
136b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50   rc;.}../* .** P
136c0 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
136d0 62 6c 65 20 6d 6f 64 75 6c 65 20 78 46 69 6c 74  ble module xFilt
136e0 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  er method..*/.st
136f0 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
13700 74 61 62 46 69 6c 74 65 72 28 0a 20 20 73 71 6c  tabFilter(.  sql
13710 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
13720 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a   *pVtabCursor, .
13730 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f    int idxNum, co
13740 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53 74 72  nst char *idxStr
13750 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71  ,.  int argc, sq
13760 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
13770 67 76 0a 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  gv.){.  PragmaVt
13780 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  abCursor *pCsr =
13790 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73   (PragmaVtabCurs
137a0 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  or*)pVtabCursor;
137b0 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70  .  PragmaVtab *p
137c0 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Tab = (PragmaVta
137d0 62 2a 29 28 70 56 74 61 62 43 75 72 73 6f 72 2d  b*)(pVtabCursor-
137e0 3e 70 56 74 61 62 29 3b 0a 20 20 69 6e 74 20 72  >pVtab);.  int r
137f0 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  c;.  int i, j;. 
13800 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b 0a 20   StrAccum acc;. 
13810 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20   char *zSql;..  
13820 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13830 28 69 64 78 4e 75 6d 29 3b 0a 20 20 55 4e 55 53  (idxNum);.  UNUS
13840 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 78  ED_PARAMETER(idx
13850 53 74 72 29 3b 0a 20 20 70 72 61 67 6d 61 56 74  Str);.  pragmaVt
13860 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28 70 43  abCursorClear(pC
13870 73 72 29 3b 0a 20 20 6a 20 3d 20 28 70 54 61 62  sr);.  j = (pTab
13880 2d 3e 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c  ->pName->mPragFl
13890 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65 73 75  g & PragFlg_Resu
138a0 6c 74 31 29 21 3d 30 20 3f 20 30 20 3a 20 31 3b  lt1)!=0 ? 0 : 1;
138b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
138c0 67 63 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  gc; i++, j++){. 
138d0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 41 72 72     assert( j<Arr
138e0 61 79 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41  aySize(pCsr->azA
138f0 72 67 29 20 29 3b 0a 20 20 20 20 70 43 73 72 2d  rg) );.    pCsr-
13900 3e 61 7a 41 72 67 5b 6a 5d 20 3d 20 73 71 6c 69  >azArg[j] = sqli
13910 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
13920 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
13930 74 65 78 74 28 61 72 67 76 5b 69 5d 29 29 3b 0a  text(argv[i]));.
13940 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a      if( pCsr->az
13950 41 72 67 5b 6a 5d 3d 3d 30 20 29 7b 0a 20 20 20  Arg[j]==0 ){.   
13960 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13970 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
13980 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
13990 63 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c  cumInit(&acc, 0,
139a0 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 64 62 2d   0, 0, pTab->db-
139b0 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
139c0 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
139d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
139e0 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61  ccumAppendAll(&a
139f0 63 63 2c 20 22 50 52 41 47 4d 41 20 22 29 3b 0a  cc, "PRAGMA ");.
13a00 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72    if( pCsr->azAr
13a10 67 5b 31 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  g[1] ){.    sqli
13a20 74 65 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c  te3XPrintf(&acc,
13a30 20 22 25 51 2e 22 2c 20 70 43 73 72 2d 3e 61 7a   "%Q.", pCsr->az
13a40 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 73  Arg[1]);.  }.  s
13a50 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
13a60 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 70 54  pendAll(&acc, pT
13a70 61 62 2d 3e 70 4e 61 6d 65 2d 3e 7a 4e 61 6d 65  ab->pName->zName
13a80 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61  );.  if( pCsr->a
13a90 7a 41 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 73  zArg[0] ){.    s
13aa0 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 61  qlite3XPrintf(&a
13ab0 63 63 2c 20 22 3d 25 51 22 2c 20 70 43 73 72 2d  cc, "=%Q", pCsr-
13ac0 3e 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 7d 0a  >azArg[0]);.  }.
13ad0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
13ae0 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
13af0 61 63 63 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  acc);.  if( zSql
13b00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
13b10 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20  ITE_NOMEM;.  rc 
13b20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
13b30 65 5f 76 32 28 70 54 61 62 2d 3e 64 62 2c 20 7a  e_v2(pTab->db, z
13b40 53 71 6c 2c 20 2d 31 2c 20 26 70 43 73 72 2d 3e  Sql, -1, &pCsr->
13b50 70 50 72 61 67 6d 61 2c 20 30 29 3b 0a 20 20 73  pPragma, 0);.  s
13b60 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
13b70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
13b80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 54  ITE_OK ){.    pT
13b90 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67  ab->base.zErrMsg
13ba0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
13bb0 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
13bc0 5f 65 72 72 6d 73 67 28 70 54 61 62 2d 3e 64 62  _errmsg(pTab->db
13bd0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ));.    return r
13be0 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  c;.  }.  return 
13bf0 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74 28 70  pragmaVtabNext(p
13c00 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a  VtabCursor);.}..
13c10 2f 2a 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72  /*.** Pragma vir
13c20 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
13c30 65 20 78 45 6f 66 20 6d 65 74 68 6f 64 2e 0a 2a  e xEof method..*
13c40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
13c50 67 6d 61 56 74 61 62 45 6f 66 28 73 71 6c 69 74  gmaVtabEof(sqlit
13c60 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
13c70 70 56 74 61 62 43 75 72 73 6f 72 29 7b 0a 20 20  pVtabCursor){.  
13c80 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13c90 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61   *pCsr = (Pragma
13ca0 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61  VtabCursor*)pVta
13cb0 62 43 75 72 73 6f 72 3b 0a 20 20 72 65 74 75 72  bCursor;.  retur
13cc0 6e 20 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61  n (pCsr->pPragma
13cd0 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  ==0);.}../* The 
13ce0 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 73  xColumn method s
13cf0 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74 68  imply returns th
13d00 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
13d10 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
13d20 68 65 20 50 52 41 47 4d 41 2e 20 20 0a 2a 2f 0a  he PRAGMA.  .*/.
13d30 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
13d40 61 56 74 61 62 43 6f 6c 75 6d 6e 28 0a 20 20 73  aVtabColumn(.  s
13d50 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
13d60 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c  or *pVtabCursor,
13d70 20 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74   .  sqlite3_cont
13d80 65 78 74 20 2a 63 74 78 2c 20 0a 20 20 69 6e 74  ext *ctx, .  int
13d90 20 69 0a 29 7b 0a 20 20 50 72 61 67 6d 61 56 74   i.){.  PragmaVt
13da0 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  abCursor *pCsr =
13db0 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73   (PragmaVtabCurs
13dc0 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  or*)pVtabCursor;
13dd0 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70  .  PragmaVtab *p
13de0 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Tab = (PragmaVta
13df0 62 2a 29 28 70 56 74 61 62 43 75 72 73 6f 72 2d  b*)(pVtabCursor-
13e00 3e 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20 69  >pVtab);.  if( i
13e10 3c 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 20 29  <pTab->iHidden )
13e20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
13e30 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c 20  sult_value(ctx, 
13e40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
13e50 61 6c 75 65 28 70 43 73 72 2d 3e 70 50 72 61 67  alue(pCsr->pPrag
13e60 6d 61 2c 20 69 29 29 3b 0a 20 20 7d 65 6c 73 65  ma, i));.  }else
13e70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
13e80 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70  sult_text(ctx, p
13e90 43 73 72 2d 3e 61 7a 41 72 67 5b 69 2d 70 54 61  Csr->azArg[i-pTa
13ea0 62 2d 3e 69 48 69 64 64 65 6e 5d 2c 2d 31 2c 53  b->iHidden],-1,S
13eb0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
13ec0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
13ed0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
13ee0 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75  .** Pragma virtu
13ef0 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
13f00 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e 0a 2a  xRowid method..*
13f10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
13f20 67 6d 61 56 74 61 62 52 6f 77 69 64 28 73 71 6c  gmaVtabRowid(sql
13f30 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
13f40 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20 73   *pVtabCursor, s
13f50 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 29 7b  qlite_int64 *p){
13f60 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13f70 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13f80 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
13f90 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 2a 70  VtabCursor;.  *p
13fa0 20 3d 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 3b   = pCsr->iRowid;
13fb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13fc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 70  _OK;.}../* The p
13fd0 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
13fe0 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74  ble object */.st
13ff0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
14000 65 33 5f 6d 6f 64 75 6c 65 20 70 72 61 67 6d 61  e3_module pragma
14010 56 74 61 62 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20  VtabModule = {. 
14020 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14040 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 30   iVersion */.  0
14050 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14070 43 72 65 61 74 65 20 2d 20 63 72 65 61 74 65 20  Create - create 
14080 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61  a table */.  pra
14090 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74 2c 20  gmaVtabConnect, 
140a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
140b0 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e 65 63 74 20  nnect - connect 
140c0 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  to an existing t
140d0 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61  able */.  pragma
140e0 56 74 61 62 42 65 73 74 49 6e 64 65 78 2c 20 20  VtabBestIndex,  
140f0 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49         /* xBestI
14100 6e 64 65 78 20 2d 20 44 65 74 65 72 6d 69 6e 65  ndex - Determine
14110 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67 79   search strategy
14120 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
14130 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20  Disconnect,     
14140 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63     /* xDisconnec
14150 74 20 2d 20 44 69 73 63 6f 6e 6e 65 63 74 20 66  t - Disconnect f
14160 72 6f 6d 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20  rom a table */. 
14170 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14190 20 78 44 65 73 74 72 6f 79 20 2d 20 44 72 6f 70   xDestroy - Drop
141a0 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72   a table */.  pr
141b0 61 67 6d 61 56 74 61 62 4f 70 65 6e 2c 20 20 20  agmaVtabOpen,   
141c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
141d0 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72  pen - open a cur
141e0 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  sor */.  pragmaV
141f0 74 61 62 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  tabClose,       
14200 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
14210 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  - close a cursor
14220 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
14230 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20  Filter,         
14240 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20     /* xFilter - 
14250 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63  configure scan c
14260 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
14270 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74 2c 20  pragmaVtabNext, 
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14290 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20  xNext - advance 
142a0 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72  a cursor */.  pr
142b0 61 67 6d 61 56 74 61 62 45 6f 66 2c 20 20 20 20  agmaVtabEof,    
142c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45             /* xE
142d0 6f 66 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  of */.  pragmaVt
142e0 61 62 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  abColumn,       
142f0 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20       /* xColumn 
14300 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
14310 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77 69 64   pragmaVtabRowid
14320 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
14330 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64   xRowid - read d
14340 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ata */.  0,     
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65        /* xUpdate
14370 20 2d 20 77 72 69 74 65 20 64 61 74 61 20 2a 2f   - write data */
14380 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
14390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143a0 2f 2a 20 78 42 65 67 69 6e 20 2d 20 62 65 67 69  /* xBegin - begi
143b0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  n transaction */
143c0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143e0 2f 2a 20 78 53 79 6e 63 20 2d 20 73 79 6e 63 20  /* xSync - sync 
143f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
14400 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
14410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14420 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f 6d 6d 69   xCommit - commi
14430 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  t transaction */
14440 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2d 20 72  /* xRollback - r
14470 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74  ollback transact
14480 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ion */.  0,     
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144a0 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 46 75        /* xFindFu
144b0 6e 63 74 69 6f 6e 20 2d 20 66 75 6e 63 74 69 6f  nction - functio
144c0 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 20 2a 2f  n overloading */
144d0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 2f 2a 20 78 52 65 6e 61 6d 65 20 2d 20 72 65 6e  /* xRename - ren
14500 61 6d 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ame the table */
14510 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14530 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f  /* xSavepoint */
14540 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14560 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20  /* xRelease */. 
14570 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14590 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a   xRollbackTo */.
145a0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  };../*.** Check 
145b0 74 6f 20 73 65 65 20 69 66 20 7a 54 61 62 4e 61  to see if zTabNa
145c0 6d 65 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  me is really the
145d0 20 6e 61 6d 65 20 6f 66 20 61 20 70 72 61 67 6d   name of a pragm
145e0 61 2e 20 20 49 66 20 69 74 20 69 73 2c 0a 2a 2a  a.  If it is,.**
145f0 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 61   then register a
14600 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74  n eponymous virt
14610 75 61 6c 20 74 61 62 6c 65 20 66 6f 72 20 74 68  ual table for th
14620 61 74 20 70 72 61 67 6d 61 20 61 6e 64 20 72 65  at pragma and re
14630 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
14640 72 20 74 6f 20 74 68 65 20 4d 6f 64 75 6c 65 20  r to the Module 
14650 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 6e  object for the n
14660 65 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ew virtual table
14670 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65 20 2a 73 71 6c  ..*/.Module *sql
14680 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52 65  ite3PragmaVtabRe
14690 67 69 73 74 65 72 28 73 71 6c 69 74 65 33 20 2a  gister(sqlite3 *
146a0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
146b0 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20  zName){.  const 
146c0 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d  PragmaName *pNam
146d0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
146e0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 4e  ite3_strnicmp(zN
146f0 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f 22 2c 20  ame, "pragma_", 
14700 37 29 3d 3d 30 20 29 3b 0a 20 20 70 4e 61 6d 65  7)==0 );.  pName
14710 20 3d 20 70 72 61 67 6d 61 4c 6f 63 61 74 65 28   = pragmaLocate(
14720 7a 4e 61 6d 65 2b 37 29 3b 0a 20 20 69 66 28 20  zName+7);.  if( 
14730 70 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  pName==0 ) retur
14740 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4e 61 6d  n 0;.  if( (pNam
14750 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 28 50  e->mPragFlg & (P
14760 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 30 7c 50  ragFlg_Result0|P
14770 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 29 29  ragFlg_Result1))
14780 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
14790 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
147a0 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
147b0 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3d 3d  Module, zName)==
147c0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
147d0 6c 69 74 65 33 56 74 61 62 43 72 65 61 74 65 4d  lite3VtabCreateM
147e0 6f 64 75 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  odule(db, zName,
147f0 20 26 70 72 61 67 6d 61 56 74 61 62 4d 6f 64 75   &pragmaVtabModu
14800 6c 65 2c 20 28 76 6f 69 64 2a 29 70 4e 61 6d 65  le, (void*)pName
14810 2c 20 30 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 0);.}..#endif 
14820 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
14830 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
14840 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14850 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a  _OMIT_PRAGMA */.