/ Hex Artifact Content
Login

Artifact 4e056f042683b99c4ea0db395f68d051b1a95833ab40951c40d3ef7e1fee1354:


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 61  esult row with a
2400: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
2410: 20 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20   string held in 
2420: 72 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63  register 3.  Dec
2430: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c  rement the resul
2440: 74 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73  t count in regis
2450: 74 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c  ter 1.** and hal
2460: 74 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d  t if the maximum
2470: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
2480: 74 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  t rows have been
2490: 20 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74   issued..*/.stat
24a0: 69 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79  ic int integrity
24b0: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56  CheckResultRow(V
24c0: 64 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61  dbe *v){.  int a
24d0: 64 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ddr;.  sqlite3Vd
24e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
24f0: 65 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b  esultRow, 3, 1);
2500: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
2510: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2520: 50 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69  P_IfPos, 1, sqli
2530: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2540: 64 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56  dr(v)+2, 1);.  V
2550: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2570: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
2580: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
25a0: 20 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d   a pragma statem
25b0: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61  ent.  .**.** Pra
25c0: 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73  gmas are of this
25d0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
25e0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
25f0: 2e 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a  .]id [= value].*
2600: 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66  *.** The identif
2610: 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  ier might also b
2620: 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65  e a string.  The
2630: 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
2640: 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74  ng, and.** ident
2650: 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62  ifier, or a numb
2660: 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61  er.  If minusFla
2670: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
2680: 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  the value is.** 
2690: 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61  a number that wa
26a0: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
26b0: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
26c0: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69  * If the left si
26d0: 64 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e  de is "database.
26e0: 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73  id" then pId1 is
26f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
2700: 6d 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69  me.** and pId2 i
2710: 73 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68  s the id.  If th
2720: 65 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a  e left side is j
2730: 75 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49  ust "id" then pI
2740: 64 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20  d1 is the.** id 
2750: 61 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20  and pId2 is any 
2760: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f  empty string..*/
2770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61  .void sqlite3Pra
2780: 67 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gma(.  Parse *pP
2790: 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a  arse, .  Token *
27a0: 70 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20  pId1,        /* 
27b0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73  First part of [s
27c0: 63 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20  chema.]id field 
27d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32  */.  Token *pId2
27e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  ,        /* Seco
27f0: 6e 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65  nd part of [sche
2800: 6d 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72  ma.]id field, or
2810: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
2820: 20 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f   *pValue,      /
2830: 2a 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c  * Token for <val
2840: 75 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ue>, or NULL */.
2850: 20 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20    int minusFlag 
2860: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2870: 20 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63   a '-' sign prec
2880: 65 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a  eded <value> */.
2890: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74  ){.  char *zLeft
28a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
28b0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
28c0: 46 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20  F-8 string <id> 
28d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68  */.  char *zRigh
28e0: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  t = 0;      /* N
28f0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2900: 46 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75  F-8 string <valu
2910: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2920: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2930: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64   = 0;   /* The d
2940: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
2950: 20 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20    Token *pId;   
2960: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2970: 74 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65  ter to <id> toke
2980: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63  n */.  char *aFc
2990: 6e 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a  ntl[4];       /*
29a0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c   Argument to SQL
29b0: 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41  ITE_FCNTL_PRAGMA
29c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 44 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66  Database index f
29f0: 6f 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f  or <database> */
2a00: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 2f 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  /* return value 
2a30: 66 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54  form SQLITE_FCNT
2a40: 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71  L_PRAGMA */.  sq
2a50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2a60: 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68  se->db;    /* Th
2a70: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2a80: 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70  ction */.  Db *p
2a90: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
2ab0: 70 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65  pecific database
2ac0: 20 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20   being pragmaed 
2ad0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
2ae0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
2af0: 61 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61  arse);  /* Prepa
2b00: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
2b10: 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e  .  const PragmaN
2b20: 61 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20  ame *pPragma;   
2b30: 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f  /* The pragma */
2b40: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
2b50: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2b60: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
2b70: 76 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  v);.  pParse->nM
2b80: 65 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e  em = 2;..  /* In
2b90: 74 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68  terpret the [sch
2ba0: 65 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68  ema.] part of th
2bb0: 65 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  e pragma stateme
2bc0: 6e 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20  nt. iDb is the. 
2bd0: 20 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65   ** index of the
2be0: 20 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70   database this p
2bf0: 72 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61  ragma is being a
2c00: 70 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e  pplied to in db.
2c10: 61 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20  aDb[]. */.  iDb 
2c20: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
2c30: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64  Name(pParse, pId
2c40: 31 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a  1, pId2, &pId);.
2c50: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
2c60: 74 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64  turn;.  pDb = &d
2c70: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
2c80: 2f 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64  /* If the temp d
2c90: 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
2ca0: 20 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65   explicitly name
2cb0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2cc0: 20 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d   .  ** pragma, m
2cd0: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f  ake sure it is o
2ce0: 70 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  pen. .  */.  if(
2cf0: 20 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74   iDb==1 && sqlit
2d00: 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
2d10: 73 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  se(pParse) ){.  
2d20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2d30: 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   zLeft = sqlite3
2d40: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
2d50: 2c 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a  , pId);.  if( !z
2d60: 4c 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Left ) return;. 
2d70: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
2d80: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
2d90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2da0: 2c 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29  , "-%T", pValue)
2db0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2dc0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e  Right = sqlite3N
2dd0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2de0: 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20   pValue);.  }.. 
2df0: 20 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b   assert( pId2 );
2e00: 0a 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e  .  zDb = pId2->n
2e10: 3e 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61  >0 ? pDb->zDbSNa
2e20: 6d 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71  me : 0;.  if( sq
2e30: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
2e40: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52  Parse, SQLITE_PR
2e50: 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69  AGMA, zLeft, zRi
2e60: 67 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ght, zDb) ){.   
2e70: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
2e80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64  ;.  }..  /* Send
2e90: 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   an SQLITE_FCNTL
2ea0: 5f 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e  _PRAGMA file-con
2eb0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65  trol to the unde
2ec0: 72 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20  rlying VFS.  ** 
2ed0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20  connection.  If 
2ee0: 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
2ef0: 45 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d  E_OK, then assum
2f00: 65 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20  e that the VFS. 
2f10: 20 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20   ** handled the 
2f20: 70 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72  pragma and gener
2f30: 61 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70  ate a no-op prep
2f40: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
2f50: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
2f60: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31  ENTATION-OF: R-1
2f70: 32 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65  2238-55120 Whene
2f80: 76 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61  ver a PRAGMA sta
2f90: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
2fa0: 2c 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45  ,.  ** an SQLITE
2fb0: 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69  _FCNTL_PRAGMA fi
2fc0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65  le control is se
2fd0: 6e 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73  nt to the open s
2fe0: 71 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a  qlite3_file.  **
2ff0: 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
3000: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  nding to the dat
3010: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68  abase file to wh
3020: 69 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20  ich the pragma. 
3030: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
3040: 66 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fers..  **.  ** 
3050: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
3060: 46 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38  F: R-29875-31678
3070: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   The argument to
3080: 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
3090: 4c 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69  L_PRAGMA.  ** fi
30a0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e  le control is an
30b0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
30c0: 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63  rs to strings (c
30d0: 68 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20  har**) in which 
30e0: 74 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20  the.  ** second 
30f0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
3100: 72 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65  rray is the name
3110: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61   of the pragma a
3120: 6e 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a  nd the third.  *
3130: 2a 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65  * element is the
3140: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3150: 20 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20   pragma or NULL 
3160: 69 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61  if the pragma ha
3170: 73 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65  s no.  ** argume
3180: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74  nt..  */.  aFcnt
3190: 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e  l[0] = 0;.  aFcn
31a0: 74 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20  tl[1] = zLeft;. 
31b0: 20 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69   aFcntl[2] = zRi
31c0: 67 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d  ght;.  aFcntl[3]
31d0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
31e0: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
31f0: 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
3200: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
3210: 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46  b, zDb, SQLITE_F
3220: 43 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f  CNTL_PRAGMA, (vo
3230: 69 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69  id*)aFcntl);.  i
3240: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3250: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
3260: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
3270: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
3280: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
3290: 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 0, COLNAME_NAM
32a0: 45 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51  E, aFcntl[0], SQ
32b0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
32c0: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
32d0: 65 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b  eText(v, aFcntl[
32e0: 30 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0]);.    sqlite3
32f0: 5f 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29  _free(aFcntl[0])
3300: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d  ;.    goto pragm
3310: 61 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  a_out;.  }.  if(
3320: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
3330: 4f 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20  OUND ){.    if( 
3340: 61 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20  aFcntl[0] ){.   
3350: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3360: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
3370: 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20   aFcntl[0]);.   
3380: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3390: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
33a0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  }.    pParse->nE
33b0: 72 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65  rr++;.    pParse
33c0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67  ->rc = rc;.    g
33d0: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
33e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
33f0: 20 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74   the pragma in t
3400: 68 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20  he lookup table 
3410: 2a 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70  */.  pPragma = p
3420: 72 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66  ragmaLocate(zLef
3430: 74 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d  t);.  if( pPragm
3440: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67  a==0 ) goto prag
3450: 6d 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61  ma_out;..  /* Ma
3460: 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
3470: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c  base schema is l
3480: 6f 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61  oaded if the pra
3490: 67 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61  gma requires tha
34a0: 74 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61  t */.  if( (pPra
34b0: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
34c0: 50 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65  PragFlg_NeedSche
34d0: 6d 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ma)!=0 ){.    if
34e0: 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
34f0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
3500: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
3510: 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
3520: 72 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c  r the result col
3530: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 70 72  umn names for pr
3540: 61 67 6d 61 73 20 74 68 61 74 20 72 65 74 75 72  agmas that retur
3550: 6e 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  n results */.  i
3560: 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72  f( (pPragma->mPr
3570: 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
3580: 4e 6f 43 6f 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20  NoColumns)==0 . 
3590: 20 20 26 26 20 28 28 70 50 72 61 67 6d 61 2d 3e    && ((pPragma->
35a0: 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
35b0: 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d  lg_NoColumns1)==
35c0: 30 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 29 0a  0 || zRight==0).
35d0: 20 20 29 7b 0a 20 20 20 20 73 65 74 50 72 61 67    ){.    setPrag
35e0: 6d 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61  maResultColumnNa
35f0: 6d 65 73 28 76 2c 20 70 50 72 61 67 6d 61 29 3b  mes(v, pPragma);
3600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
3610: 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
3620: 74 65 20 70 72 61 67 6d 61 20 68 61 6e 64 6c 65  te pragma handle
3630: 72 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70  r */.  switch( p
3640: 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70  Pragma->ePragTyp
3650: 20 29 7b 0a 20 20 0a 23 69 66 20 21 64 65 66 69   ){.  .#if !defi
3660: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3670: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 26  PAGER_PRAGMAS) &
3680: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
3690: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
36a0: 44 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  D).  /*.  **  PR
36b0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65  AGMA [schema.]de
36c0: 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65  fault_cache_size
36d0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
36e0: 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63  chema.]default_c
36f0: 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a  ache_size=N.  **
3700: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
3710: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
3720: 20 63 75 72 72 65 6e 74 20 70 65 72 73 69 73 74   current persist
3730: 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ent setting for 
3740: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
3750: 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76  che size.  The v
3760: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
3770: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
3780: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65  ber of.  ** page
3790: 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
37a0: 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  che.  The second
37b0: 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20   form sets both 
37c0: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
37d0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
37e0: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
37f0: 65 72 73 69 73 74 65 6e 74 20 70 61 67 65 20 63  ersistent page c
3800: 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a  ache size value.
3810: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74    ** stored in t
3820: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3830: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65  ..  **.  ** Olde
3840: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
3850: 4c 69 74 65 20 77 6f 75 6c 64 20 73 65 74 20 74  Lite would set t
3860: 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65  he default cache
3870: 20 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a 2a 20   size to a.  ** 
3880: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
3890: 74 6f 20 69 6e 64 69 63 61 74 65 20 73 79 6e 63  to indicate sync
38a0: 68 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20 54 68  hronous=OFF.  Th
38b0: 65 73 65 20 64 61 79 73 2c 20 73 79 6e 63 68 72  ese days, synchr
38c0: 6f 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 61 6c  onous.  ** is al
38d0: 77 61 79 73 20 6f 6e 20 62 79 20 64 65 66 61 75  ways on by defau
38e0: 6c 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  lt regardless of
38f0: 20 74 68 65 20 73 69 67 6e 20 6f 66 20 74 68 65   the sign of the
3900: 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a 20   default cache. 
3910: 20 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74 20 63   ** size.  But c
3920: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b 65 20  ontinue to take 
3930: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
3940: 75 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  ue of the defaul
3950: 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a  t cache.  ** siz
3960: 65 20 6f 66 20 68 69 73 74 6f 72 69 63 61 6c 20  e of historical 
3970: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 20  compatibility.. 
3980: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
3990: 79 70 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  yp_DEFAULT_CACHE
39a0: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 74 61  _SIZE: {.    sta
39b0: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c  tic const int iL
39c0: 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f  n = VDBE_OFFSET_
39d0: 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 73  LINENO(2);.    s
39e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65  tatic const Vdbe
39f0: 4f 70 4c 69 73 74 20 67 65 74 43 61 63 68 65 53  OpList getCacheS
3a00: 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ize[] = {.      
3a10: 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  { OP_Transaction
3a20: 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30  , 0, 0,        0
3a30: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  },              
3a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
3a50: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  */.      { OP_Re
3a60: 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 31 2c  adCookie,  0, 1,
3a70: 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 44 45          BTREE_DE
3a80: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
3a90: 7d 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20  },  /* 1 */.    
3aa0: 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20    { OP_IfPos,   
3ab0: 20 20 20 20 31 2c 20 38 2c 20 20 20 20 20 20 20      1, 8,       
3ac0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
3ad0: 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20  Integer,     0, 
3ae0: 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  2,        0},.  
3af0: 20 20 20 20 7b 20 4f 50 5f 53 75 62 74 72 61 63      { OP_Subtrac
3b00: 74 2c 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20  t,    1, 2,     
3b10: 20 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     1},.      { O
3b20: 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31  P_IfPos,       1
3b30: 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 8,        0},.
3b40: 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
3b50: 65 72 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  er,     0, 1,   
3b60: 20 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20 20       0},        
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 6 */.      {
3b90: 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
3ba0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
3bb0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73  ,.      { OP_Res
3bc0: 75 6c 74 52 6f 77 2c 20 20 20 31 2c 20 31 2c 20  ultRow,   1, 1, 
3bd0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
3be0: 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f  ;.    VdbeOp *aO
3bf0: 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  p;.    sqlite3Vd
3c00: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
3c10: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52  Db);.    if( !zR
3c20: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 50  ight ){.      pP
3c30: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b  arse->nMem += 2;
3c40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3c50: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
3c60: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
3c70: 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69  ySize(getCacheSi
3c80: 7a 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20  ze));.      aOp 
3c90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3ca0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
3cb0: 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65  ize(getCacheSize
3cc0: 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 2c  ), getCacheSize,
3cd0: 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28   iLn);.      if(
3ce0: 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43   ONLY_IF_REALLOC
3cf0: 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20  _STRESS(aOp==0) 
3d00: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61  ) break;.      a
3d10: 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[0].p1 = iDb;.
3d20: 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20        aOp[1].p1 
3d30: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70  = iDb;.      aOp
3d40: 5b 36 5d 2e 70 31 20 3d 20 53 51 4c 49 54 45 5f  [6].p1 = SQLITE_
3d50: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
3d60: 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ZE;.    }else{. 
3d70: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
3d80: 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
3d90: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
3da0: 68 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ht));.      sqli
3db0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
3dc0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
3dd0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
3de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3df0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
3e00: 20 69 44 62 2c 20 42 54 52 45 45 5f 44 45 46 41   iDb, BTREE_DEFA
3e10: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20  ULT_CACHE_SIZE, 
3e20: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73  size);.      ass
3e30: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3e40: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3e50: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
3e60: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63   pDb->pSchema->c
3e70: 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
3e80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3e90: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
3ea0: 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e  (pDb->pBt, pDb->
3eb0: 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73  pSchema->cache_s
3ec0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
3ed0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
3ee0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
3ef0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20  T_PAGER_PRAGMAS 
3f00: 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  && !SQLITE_OMIT_
3f10: 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 23  DEPRECATED */..#
3f20: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
3f30: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
3f40: 41 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a  AGMAS).  /*.  **
3f50: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
3f60: 2e 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20 2a 2a  .]page_size.  **
3f70: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
3f80: 2e 5d 70 61 67 65 5f 73 69 7a 65 3d 4e 0a 20 20  .]page_size=N.  
3f90: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
3fa0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
3fb0: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
3fc0: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
3fd0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
3fe0: 7a 65 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68  ze in bytes.  Th
3ff0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
4000: 74 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  ts the.  ** data
4010: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 76  base page size v
4020: 61 6c 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65  alue.  The value
4030: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 73 65 74   can only be set
4040: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74   if.  ** the dat
4050: 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 79 65  abase has not ye
4060: 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2e 0a  t been created..
4070: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
4080: 54 79 70 5f 50 41 47 45 5f 53 49 5a 45 3a 20 7b  Typ_PAGE_SIZE: {
4090: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
40a0: 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20  = pDb->pBt;.    
40b0: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
40c0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
40d0: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  t ){.      int s
40e0: 69 7a 65 20 3d 20 41 4c 57 41 59 53 28 70 42 74  ize = ALWAYS(pBt
40f0: 29 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  ) ? sqlite3Btree
4100: 47 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 29  GetPageSize(pBt)
4110: 20 3a 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   : 0;.      retu
4120: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73  rnSingleInt(v, s
4130: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
4140: 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  .      /* Malloc
4150: 20 6d 61 79 20 66 61 69 6c 20 77 68 65 6e 20 73   may fail when s
4160: 65 74 74 69 6e 67 20 74 68 65 20 70 61 67 65 2d  etting the page-
4170: 73 69 7a 65 2c 20 61 73 20 74 68 65 72 65 20 69  size, as there i
4180: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20  s an internal.  
4190: 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 74 68      ** buffer th
41a0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f 64  at the pager mod
41b0: 75 6c 65 20 72 65 73 69 7a 65 73 20 75 73 69 6e  ule resizes usin
41c0: 67 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  g sqlite3_reallo
41d0: 63 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  c()..      */.  
41e0: 20 20 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65      db->nextPage
41f0: 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74  size = sqlite3At
4200: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
4210: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
4220: 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
4230: 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
4240: 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
4250: 65 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20 20 20  e,-1,0) ){.     
4260: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
4270: 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  lt(db);.      }.
4280: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
4290: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
42a0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
42b0: 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20  ]secure_delete. 
42c0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
42d0: 65 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65  ema.]secure_dele
42e0: 74 65 3d 4f 4e 2f 4f 46 46 2f 46 41 53 54 0a 20  te=ON/OFF/FAST. 
42f0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
4300: 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20  st form reports 
4310: 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
4320: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
4330: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 66   secure_delete f
4340: 6c 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  lag.  The second
4350: 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68   form changes th
4360: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
4370: 20 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69 6e    ** flag settin
4380: 67 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74 68  g and reports th
4390: 65 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a  e new value..  *
43a0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
43b0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20  _SECURE_DELETE: 
43c0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
43d0: 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20   = pDb->pBt;.   
43e0: 20 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20   int b = -1;.   
43f0: 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20   assert( pBt!=0 
4400: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
4410: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  t ){.      if( s
4420: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
4430: 52 69 67 68 74 2c 20 22 66 61 73 74 22 29 3d 3d  Right, "fast")==
4440: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 20 3d  0 ){.        b =
4450: 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   2;.      }else{
4460: 0a 20 20 20 20 20 20 20 20 62 20 3d 20 73 71 6c  .        b = sql
4470: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
4480: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
4490: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
44a0: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62   pId2->n==0 && b
44b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
44c0: 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
44d0: 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
44e0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
44f0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
4500: 72 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62  reDelete(db->aDb
4510: 5b 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20  [ii].pBt, b);.  
4520: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4530: 62 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  b = sqlite3Btree
4540: 53 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74  SecureDelete(pBt
4550: 2c 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , b);.    return
4560: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b  SingleInt(v, b);
4570: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4580: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4590: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f  MA [schema.]max_
45a0: 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20  page_count.  ** 
45b0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
45c0: 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d  ]max_page_count=
45d0: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
45e0: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
45f0: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
4600: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
4610: 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62   ** maximum numb
4620: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
4630: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
4640: 2e 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63  .  The .  ** sec
4650: 6f 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74  ond form attempt
4660: 73 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73  s to change this
4670: 20 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a   setting.  Both.
4680: 20 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72    ** forms retur
4690: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  n the current se
46a0: 74 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tting..  **.  **
46b0: 20 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   The absolute va
46c0: 6c 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64  lue of N is used
46d0: 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
46e0: 75 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68  umented and migh
46f0: 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20  t.  ** change.  
4700: 54 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65  The only purpose
4710: 20 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61   is to provide a
4720: 6e 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65  n easy way to te
4730: 73 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  st.  ** the sqli
4740: 74 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75  te3AbsInt32() fu
4750: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  nction..  **.  *
4760: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4770: 61 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20  a.]page_count.  
4780: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
4790: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
47a0: 65 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  es in the specif
47b0: 69 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ied database..  
47c0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
47d0: 70 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a  p_PAGE_COUNT: {.
47e0: 20 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20      int iReg;.  
47f0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
4800: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
4810: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67  , iDb);.    iReg
4820: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4830: 6d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  m;.    if( sqlit
4840: 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b  e3Tolower(zLeft[
4850: 30 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20  0])=='p' ){.    
4860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4870: 4f 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f  Op2(v, OP_Pageco
4880: 75 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b  unt, iDb, iReg);
4890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
48a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
48b0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63  Op3(v, OP_MaxPgc
48c0: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a  nt, iDb, iReg, .
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
48f0: 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41  bsInt32(sqlite3A
4900: 74 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20  toi(zRight)));. 
4910: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
4920: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4930: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67  _ResultRow, iReg
4940: 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 1);.    break;
4950: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4960: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4970: 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20  ]locking_mode.  
4980: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4990: 6d 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ma.]locking_mode
49a0: 20 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75   = (normal|exclu
49b0: 73 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73  sive).  */.  cas
49c0: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e  e PragTyp_LOCKIN
49d0: 47 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f  G_MODE: {.    co
49e0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  nst char *zRet =
49f0: 20 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69   "normal";.    i
4a00: 6e 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f  nt eMode = getLo
4a10: 63 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74  ckingMode(zRight
4a20: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32  );..    if( pId2
4a30: 2d 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d  ->n==0 && eMode=
4a40: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4a50: 44 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20  DE_QUERY ){.    
4a60: 20 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41    /* Simple "PRA
4a70: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
4a80: 3b 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ;" statement. Th
4a90: 69 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f  is is a query fo
4aa0: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
4ab0: 75 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c  urrent default l
4ac0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69  ocking mode (whi
4ad0: 63 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  ch may be differ
4ae0: 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ent to.      ** 
4af0: 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
4b00: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
4b10: 61 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f  abase)..      */
4b20: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64  .      eMode = d
4b30: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b  b->dfltLockMode;
4b40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b50: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
4b60: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d  .      if( pId2-
4b70: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >n==0 ){.       
4b80: 20 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   /* This indicat
4b90: 65 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62  es that no datab
4ba0: 61 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65  ase name was spe
4bb0: 63 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20  cified as part. 
4bc0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
4bd0: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e   PRAGMA command.
4be0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
4bf0: 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d  e locking-mode m
4c00: 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
4c10: 2a 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74  * set on all att
4c20: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c  ached databases,
4c30: 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
4c40: 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20  main db file..  
4c50: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
4c60: 20 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71   ** Also, the sq
4c70: 6c 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f  lite3.dfltLockMo
4c80: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  de variable is s
4c90: 65 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20  et so that.     
4ca0: 20 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71     ** any subseq
4cb0: 75 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20  uently attached 
4cc0: 64 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75  databases also u
4cd0: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
4ce0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
4cf0: 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20  ing mode..      
4d00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
4d10: 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
4d20: 65 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44  ert(pDb==&db->aD
4d30: 62 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  b[0]);.        f
4d40: 6f 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e  or(ii=2; ii<db->
4d50: 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
4d60: 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
4d70: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4d80: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4da0: 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
4db0: 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f  Mode(pPager, eMo
4dc0: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  de);.        }. 
4dd0: 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c         db->dfltL
4de0: 6f 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  ockMode = (u8)eM
4df0: 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
4e00: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
4e10: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
4e20: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65  b->pBt);.      e
4e30: 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Mode = sqlite3Pa
4e40: 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  gerLockingMode(p
4e50: 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  Pager, eMode);. 
4e60: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
4e70: 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
4e80: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
4e90: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
4ea0: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4eb0: 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
4ec0: 49 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65  IVE );.    if( e
4ed0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4ee0: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
4ef0: 45 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20  E ){.      zRet 
4f00: 3d 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20  = "exclusive";. 
4f10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
4f20: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65  ingleText(v, zRe
4f30: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
4f40: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
4f50: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
4f60: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a  ournal_mode.  **
4f70: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4f80: 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  .]journal_mode =
4f90: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
4fa0: 20 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65             (dele
4fb0: 74 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74  te|persist|off|t
4fc0: 72 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77  runcate|memory|w
4fd0: 61 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63  al|off).  */.  c
4fe0: 61 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52  ase PragTyp_JOUR
4ff0: 4e 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20  NAL_MODE: {.    
5000: 69 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20  int eMode;      
5010: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
5020: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
5030: 45 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f  E_XXX symbols */
5040: 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
5050: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5060: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69  ounter */..    i
5070: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( zRight==0 ){.
5080: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
5090: 65 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20  e is no "=MODE" 
50a0: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67  part of the prag
50b0: 6d 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66  ma, do a query f
50c0: 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
50d0: 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a  current mode */.
50e0: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41        eMode = PA
50f0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
5100: 51 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65  QUERY;.    }else
5110: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
5120: 61 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20  ar *zMode;.     
5130: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
5140: 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29  Strlen30(zRight)
5150: 3b 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64  ;.      for(eMod
5160: 65 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71  e=0; (zMode = sq
5170: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65  lite3JournalMode
5180: 6e 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b  name(eMode))!=0;
5190: 20 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20   eMode++){.     
51a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
51b0: 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a  rNICmp(zRight, z
51c0: 4d 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72  Mode, n)==0 ) br
51d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
51e0: 20 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b     if( !zMode ){
51f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
5200: 68 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20  he "=MODE" part 
5210: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
5220: 6e 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c  ny known journal
5230: 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a   mode,.        *
5240: 2a 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72  * then do a quer
5250: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f  y */.        eMo
5260: 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
5270: 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20  ALMODE_QUERY;.  
5280: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5290: 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  if( eMode==PAGER
52a0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
52b0: 52 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30  RY && pId2->n==0
52c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e   ){.      /* Con
52d0: 76 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75  vert "PRAGMA jou
52e0: 72 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20  rnal_mode" into 
52f0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
5300: 72 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20  rnal_mode" */.  
5310: 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20      iDb = 0;.   
5320: 20 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a     pId2->n = 1;.
5330: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
5340: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d  =db->nDb-1; ii>=
5350: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
5360: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  if( db->aDb[ii].
5370: 70 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20  pBt && (ii==iDb 
5380: 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29  || pId2->n==0) )
5390: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
53a0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
53b0: 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73  , ii);.        s
53c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
53d0: 28 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  (v, OP_JournalMo
53e0: 64 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65  de, ii, 1, eMode
53f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5400: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5410: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
5420: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
5430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
5440: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
5450: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5460: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a  l_size_limit.  *
5470: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
5480: 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  a.]journal_size_
5490: 6c 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  limit=N.  **.  *
54a0: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
54b0: 20 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72   size limit on r
54c0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
54d0: 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  files..  */.  ca
54e0: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
54f0: 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b  AL_SIZE_LIMIT: {
5500: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
5510: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
5520: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
5530: 3b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74  ;.    i64 iLimit
5540: 20 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a   = -2;.    if( z
5550: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
5560: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
5570: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69  I64(zRight, &iLi
5580: 6d 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mit);.      if( 
5590: 69 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d  iLimit<-1 ) iLim
55a0: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  it = -1;.    }. 
55b0: 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69     iLimit = sqli
55c0: 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
55d0: 69 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c  izeLimit(pPager,
55e0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65   iLimit);.    re
55f0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
5600: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72   iLimit);.    br
5610: 65 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  eak;.  }..#endif
5620: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5630: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
5640: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
5650: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74  GMA [schema.]aut
5660: 6f 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50  o_vacuum.  **  P
5670: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
5680: 75 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a  uto_vacuum=N.  *
5690: 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65  *.  ** Get or se
56a0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
56b0: 68 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74  he database 'aut
56c0: 6f 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65  o-vacuum' parame
56d0: 74 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  ter..  ** The va
56e0: 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20  lue is one of:  
56f0: 30 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20  0 NONE 1 FULL 2 
5700: 49 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f  INCREMENTAL.  */
5710: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5720: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
5730: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
5740: 55 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20  UTO_VACUUM: {.  
5750: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
5760: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  Db->pBt;.    ass
5770: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
5780: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
5790: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
57a0: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74  ngleInt(v, sqlit
57b0: 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
57c0: 63 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20  cuum(pBt));.    
57d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
57e0: 20 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f   eAuto = getAuto
57f0: 56 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a  Vacuum(zRight);.
5800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41        assert( eA
5810: 75 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c  uto>=0 && eAuto<
5820: 3d 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  =2 );.      db->
5830: 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75  nextAutovac = (u
5840: 38 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f  8)eAuto;.      /
5850: 2a 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61  * Call SetAutoVa
5860: 63 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e  cuum() to set in
5870: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74  itialize the int
5880: 65 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20  ernal auto and. 
5890: 20 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63       ** incr-vac
58a0: 75 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20  uum flags. This 
58b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
58c0: 61 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ase this connect
58d0: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65  ion.      ** cre
58e0: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
58f0: 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d  e file. It is im
5900: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20  portant that it 
5910: 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  is created.     
5920: 20 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76   ** as an auto-v
5930: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62  acuum capable db
5940: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5950: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5960: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
5970: 70 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20  pBt, eAuto);.   
5980: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5990: 45 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d  E_OK && (eAuto==
59a0: 31 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29  1 || eAuto==2) )
59b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  {.        /* Whe
59c0: 6e 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75  n setting the au
59d0: 74 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to_vacuum mode t
59e0: 6f 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20  o either "full" 
59f0: 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  or .        ** "
5a00: 69 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72  incremental", wr
5a10: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ite the value of
5a20: 20 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20   meta[6] in the 
5a30: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
5a40: 20 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65   ** file. Before
5a50: 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61   writing to meta
5a60: 5b 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20  [6], check that 
5a70: 6d 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65  meta[3] indicate
5a80: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
5a90: 74 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73  t this really is
5aa0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
5ab0: 63 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65  capable database
5ac0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5ad0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
5ae0: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
5af0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
5b00: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  );.        stati
5b10: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
5b20: 73 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20  st setMeta6[] = 
5b30: 7b 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50  {.          { OP
5b40: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
5b50: 20 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20   0,         1,  
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b70: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
5b80: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61          { OP_Rea
5b90: 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20  dCookie,     0, 
5ba0: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5bb0: 20 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54     BTREE_LARGEST
5bc0: 5f 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20  _ROOT_PAGE},.   
5bd0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20         { OP_If, 
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20              1,  
5bf0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
5c00: 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20            0},   
5c10: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20   /* 2 */.       
5c20: 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20     { OP_Halt,   
5c30: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
5c40: 4b 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20  K, OE_Abort,    
5c50: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c60: 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  3 */.          {
5c70: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
5c80: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42      0,         B
5c90: 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d  TREE_INCR_VACUUM
5ca0: 2c 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f  , 0},    /* 4 */
5cb0: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
5cc0: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
5cd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64  .        int iAd
5ce0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5cf0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
5d00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5d10: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
5d20: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
5d30: 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29  aySize(setMeta6)
5d40: 29 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d  );.        aOp =
5d50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d60: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
5d70: 7a 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65  ze(setMeta6), se
5d80: 74 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20  tMeta6, iLn);.  
5d90: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
5da0: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
5db0: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
5dc0: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d  ;.        aOp[0]
5dd0: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
5de0: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
5df0: 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  Db;.        aOp[
5e00: 32 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b  2].p2 = iAddr+4;
5e10: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e  .        aOp[4].
5e20: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5e30: 20 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41    aOp[4].p3 = eA
5e40: 75 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  uto - 1;.       
5e50: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
5e60: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
5e70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5e80: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
5e90: 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  if..  /*.  **  P
5ea0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69  RAGMA [schema.]i
5eb0: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
5ec0: 6d 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  m(N).  **.  ** D
5ed0: 6f 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63  o N steps of inc
5ee0: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69  remental vacuumi
5ef0: 6e 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ng on a database
5f00: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5f10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5f20: 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61  ACUUM.  case Pra
5f30: 67 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c  gTyp_INCREMENTAL
5f40: 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69  _VACUUM: {.    i
5f50: 6e 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b  nt iLimit, addr;
5f60: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
5f70: 3d 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65  =0 || !sqlite3Ge
5f80: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
5f90: 69 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69  iLimit) || iLimi
5fa0: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  t<=0 ){.      iL
5fb0: 69 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66  imit = 0x7ffffff
5fc0: 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  f;.    }.    sql
5fd0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5fe0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5ff0: 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
6000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6010: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c  , OP_Integer, iL
6020: 69 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64  imit, 1);.    ad
6030: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
6040: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63  AddOp1(v, OP_Inc
6050: 72 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56  rVacuum, iDb); V
6060: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6080: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp1(v, OP_Resu
6090: 6c 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73  ltRow, 1);.    s
60a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
60b0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
60c0: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
60d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
60e0: 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64  OP_IfPos, 1, add
60f0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
6100: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6110: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
6120: 61 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b  addr);.    break
6130: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
6140: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6150: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
6160: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6170: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6180: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
6190: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
61a0: 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20  e_size=N.  **.  
61b0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
61c0: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
61d0: 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74  rrent local sett
61e0: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
61f0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
6200: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  . The second for
6210: 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c  m sets the local
6220: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
6230: 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66   size value.  If
6240: 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74   N is positive t
6250: 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a  hen that is the.
6260: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
6270: 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
6280: 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61  e.  If N is nega
6290: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  tive, then the. 
62a0: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
62b0: 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20  ges is adjusted 
62c0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
62d0: 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79  e uses -N kibiby
62e0: 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f  tes.  ** of memo
62f0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
6300: 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49  PragTyp_CACHE_SI
6310: 5a 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE: {.    assert
6320: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
6330: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
6340: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
6350: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6360: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6370: 28 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  (v, pDb->pSchema
6380: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
6390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
63a0: 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74  int size = sqlit
63b0: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
63c0: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
63d0: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  ma->cache_size =
63e0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
63f0: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
6400: 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20  eSize(pDb->pBt, 
6410: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
6420: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
6430: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6440: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
6450: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6460: 65 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52  e_spill.  **  PR
6470: 41 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c  AGMA cache_spill
6480: 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50  =BOOLEAN.  **  P
6490: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63  RAGMA [schema.]c
64a0: 61 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a  ache_spill=N.  *
64b0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
64c0: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
64d0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20  e current local 
64e0: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
64f0: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
6500: 73 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20  spill size. The 
6510: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e  second form turn
6520: 73 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e  s cache spill on
6530: 0a 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57  .  ** or off.  W
6540: 68 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63  hen turnning cac
6550: 68 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65  he spill on, the
6560: 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
6570: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
6580: 20 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68   cache_size.  Th
6590: 65 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74  e third form set
65a0: 73 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74  s a spill size t
65b0: 68 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  hat.  ** may be 
65c0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74  different form t
65d0: 68 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  he cache size.. 
65e0: 20 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69   ** If N is posi
65f0: 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69  tive then that i
6600: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
6610: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6620: 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69  e cache.  If N i
6630: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
6640: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
6650: 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a   of pages is adj
6660: 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  usted so that th
6670: 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20  e cache uses -N 
6680: 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f  kibibytes.  ** o
6690: 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20  f memory..  **. 
66a0: 20 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   ** If the numbe
66b0: 72 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c  r of cache_spill
66c0: 20 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74   pages is less t
66d0: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
66e0: 66 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a  f.  ** cache_siz
66f0: 65 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c  e pages, no spil
6700: 6c 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69  ling occurs unti
6710: 6c 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  l the page count
6720: 20 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68   exceeds.  ** th
6730: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
6740: 65 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20  e_size pages..  
6750: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68  **.  ** The cach
6760: 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20  e_spill=BOOLEAN 
6770: 73 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20  setting applies 
6780: 74 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  to all attached 
6790: 73 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f  schemas,.  ** no
67a0: 74 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d  t just the schem
67b0: 61 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a  a specified..  *
67c0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
67d0: 5f 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a  _CACHE_SPILL: {.
67e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
67f0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
6800: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
6810: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
6820: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
6830: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20  nSingleInt(v,.  
6840: 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67         (db->flag
6850: 73 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65  s & SQLITE_Cache
6860: 53 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20  Spill)==0 ? 0 : 
6870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6880: 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
6890: 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30  lSize(pDb->pBt,0
68a0: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
68b0: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
68c0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  1;.      if( sql
68d0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
68e0: 67 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20  ght, &size) ){. 
68f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
6900: 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
6910: 70 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b  pDb->pBt, size);
6920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6930: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
6940: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a  lean(zRight, siz
6950: 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  e!=0) ){.       
6960: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
6970: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b  LITE_CacheSpill;
6980: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6990: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
69a0: 26 3d 20 7e 53 51 4c 49 54 45 5f 43 61 63 68 65  &= ~SQLITE_Cache
69b0: 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  Spill;.      }. 
69c0: 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72       setAllPager
69d0: 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d  Flags(db);.    }
69e0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
69f0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
6a00: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70  MA [schema.]mmap
6a10: 5f 73 69 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20  _size(N).  **.  
6a20: 2a 2a 20 55 73 65 64 20 74 6f 20 73 65 74 20 6d  ** Used to set m
6a30: 61 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69  apping size limi
6a40: 74 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 73  t. The mapping s
6a50: 69 7a 65 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a  ize limit is.  *
6a60: 2a 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  * used to limit 
6a70: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 73 69  the aggregate si
6a80: 7a 65 20 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79  ze of all memory
6a90: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20   mapped regions 
6aa0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  of the.  ** data
6ab0: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
6ac0: 69 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  is parameter is 
6ad0: 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  set to zero, the
6ae0: 6e 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  n memory mapping
6af0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65  .  ** is not use
6b00: 64 20 61 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20  d at all.  If N 
6b10: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
6b20: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 65  n the default me
6b30: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69  mory map.  ** li
6b40: 6d 69 74 20 64 65 74 65 72 6d 69 6e 65 64 20 62  mit determined b
6b50: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
6b60: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
6b70: 4d 41 50 5f 53 49 5a 45 29 20 69 73 20 73 65 74  MAP_SIZE) is set
6b80: 2e 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 61 6d  ..  ** The param
6b90: 65 74 65 72 20 4e 20 69 73 20 6d 65 61 73 75 72  eter N is measur
6ba0: 65 64 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a  ed in bytes..  *
6bb0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 76 61 6c 75  *.  ** This valu
6bc0: 65 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20  e is advisory.  
6bd0: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56  The underlying V
6be0: 46 53 20 69 73 20 66 72 65 65 20 74 6f 20 6d 65  FS is free to me
6bf0: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73  mory map.  ** as
6c00: 20 6c 69 74 74 6c 65 20 6f 72 20 61 73 20 6d 75   little or as mu
6c10: 63 68 20 61 73 20 69 74 20 77 61 6e 74 73 2e 20  ch as it wants. 
6c20: 20 45 78 63 65 70 74 2c 20 69 66 20 4e 20 69 73   Except, if N is
6c30: 20 73 65 74 20 74 6f 20 30 20 74 68 65 6e 20 74   set to 0 then t
6c40: 68 65 0a 20 20 2a 2a 20 75 70 70 65 72 20 6c 61  he.  ** upper la
6c50: 79 65 72 73 20 77 69 6c 6c 20 6e 65 76 65 72 20  yers will never 
6c60: 69 6e 76 6f 6b 65 20 74 68 65 20 78 46 65 74 63  invoke the xFetc
6c70: 68 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20  h interfaces to 
6c80: 74 68 65 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20  the VFS..  */.  
6c90: 63 61 73 65 20 50 72 61 67 54 79 70 5f 4d 4d 41  case PragTyp_MMA
6ca0: 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71  P_SIZE: {.    sq
6cb0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
6cc0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
6cd0: 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61  MAP_SIZE>0.    a
6ce0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
6cf0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
6d00: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
6d10: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
6d20: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
6d30: 20 20 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48     sqlite3DecOrH
6d40: 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20  exToI64(zRight, 
6d50: 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &sz);.      if( 
6d60: 73 7a 3c 30 20 29 20 73 7a 20 3d 20 73 71 6c 69  sz<0 ) sz = sqli
6d70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
6d80: 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 69 66  szMmap;.      if
6d90: 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64  ( pId2->n==0 ) d
6da0: 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a  b->szMmap = sz;.
6db0: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d        for(ii=db-
6dc0: 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69  >nDb-1; ii>=0; i
6dd0: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i--){.        if
6de0: 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  ( db->aDb[ii].pB
6df0: 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c  t && (ii==iDb ||
6e00: 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a   pId2->n==0) ){.
6e10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6e20: 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
6e30: 69 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  it(db->aDb[ii].p
6e40: 42 74 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  Bt, sz);.       
6e50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6e60: 0a 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20  .    sz = -1;.  
6e70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
6e80: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
6e90: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  zDb, SQLITE_FCNT
6ea0: 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
6eb0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 7a 20  );.#else.    sz 
6ec0: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 0;.    rc = SQ
6ed0: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
6ee0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6ef0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6f00: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
6f10: 2c 20 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , sz);.    }else
6f20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6f30: 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
6f40: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6f50: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
6f60: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  rc = rc;.    }. 
6f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6f80: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
6f90: 41 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a  A temp_store.  *
6fa0: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
6fb0: 73 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74  store = "default
6fc0: 22 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65  "|"memory"|"file
6fd0: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
6fe0: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
6ff0: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
7000: 20 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67   temp_store flag
7010: 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a  .  Changing.  **
7020: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
7030: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63   does not make c
7040: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69  hanges to the di
7050: 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  sk file and the 
7060: 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c  default.  ** val
7070: 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f  ue will be resto
7080: 72 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d  red the next tim
7090: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
70a0: 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20  s opened..  **. 
70b0: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74   ** Note that it
70c0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
70d0: 20 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d   the library com
70e0: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
70f0: 73 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69  s to.  ** overri
7100: 64 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a  de this setting.
7110: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7120: 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20  Typ_TEMP_STORE: 
7130: 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  {.    if( !zRigh
7140: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
7150: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62  nSingleInt(v, db
7160: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20  ->temp_store);. 
7170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7180: 63 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67  changeTempStorag
7190: 65 28 70 50 61 72 73 65 2c 20 7a 52 69 67 68 74  e(pParse, zRight
71a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
71b0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
71c0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
71d0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
71e0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
71f0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
7200: 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74  ory = ""|"direct
7210: 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20  ory_name".  **. 
7220: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
7230: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
7240: 65 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74  e of the temp_st
7250: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c  ore_directory fl
7260: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7270: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7280: 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72  s a specific dir
7290: 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65  ectory to be use
72a0: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
72b0: 66 69 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74  files..  ** Sett
72c0: 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74  ing to a null st
72d0: 72 69 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20  ring reverts to 
72e0: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70  the default temp
72f0: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
7300: 73 65 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20  search..  ** If 
7310: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
7320: 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ory is changed, 
7330: 74 68 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54  then invalidateT
7340: 65 6d 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a  empStorage..  **
7350: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
7360: 67 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f  gTyp_TEMP_STORE_
7370: 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20  DIRECTORY: {.   
7380: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7390: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
73a0: 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65  leText(v, sqlite
73b0: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
73c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
73d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
73e0: 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20  T_WSD.      if( 
73f0: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
7400: 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
7410: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7420: 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70  e3OsAccess(db->p
7430: 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c  Vfs, zRight, SQL
7440: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
7450: 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20  RITE, &res);.   
7460: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
7470: 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30  ITE_OK || res==0
7480: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7490: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
74a0: 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69  arse, "not a wri
74b0: 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22  table directory"
74c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
74d0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
74e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
74f0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
7500: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20  _TEMP_STORE==0. 
7510: 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45        || (SQLITE
7520: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26  _TEMP_STORE==1 &
7530: 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  & db->temp_store
7540: 3c 3d 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  <=1).       || (
7550: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7560: 45 3d 3d 32 20 26 26 20 64 62 2d 3e 74 65 6d 70  E==2 && db->temp
7570: 5f 73 74 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20  _store==1).     
7580: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
7590: 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67  lidateTempStorag
75a0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
75b0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
75c0: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 74 65  _free(sqlite3_te
75d0: 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
75e0: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
75f0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
7600: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
7610: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
7620: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
7630: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
7640: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7650: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7660: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7670: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7680: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7690: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
76a0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
76b0: 57 49 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  WIN.  /*.  **   
76c0: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
76d0: 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a  e_directory.  **
76e0: 20 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73     PRAGMA data_s
76f0: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d  tore_directory =
7700: 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e   ""|"directory_n
7710: 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ame".  **.  ** R
7720: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
7730: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20   local value of 
7740: 74 68 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  the data_store_d
7750: 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20  irectory flag.  
7760: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
7770: 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73  e value sets a s
7780: 70 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72  pecific director
7790: 79 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  y to be used for
77a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
77b0: 74 68 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73  that.  ** were s
77c0: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 20  pecified with a 
77d0: 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
77e0: 65 2e 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61  e.  Setting to a
77f0: 20 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76   null string rev
7800: 65 72 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  erts.  ** to the
7810: 20 64 65 66 61 75 6c 74 20 64 61 74 61 62 61 73   default databas
7820: 65 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69  e directory, whi
7830: 63 68 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ch for database 
7840: 66 69 6c 65 73 20 73 70 65 63 69 66 69 65 64 20  files specified 
7850: 77 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61  with.  ** a rela
7860: 74 69 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70  tive path will p
7870: 72 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65 64  robably be based
7880: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
7890: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
78a0: 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20  e.  ** process. 
78b0: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   Database file s
78c0: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 6e  pecified with an
78d0: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61   absolute path a
78e0: 72 65 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a  re not impacted.
78f0: 20 20 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74    ** by this set
7900: 74 69 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73  ting, regardless
7910: 20 6f 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20   of its value.. 
7920: 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
7930: 50 72 61 67 54 79 70 5f 44 41 54 41 5f 53 54 4f  PragTyp_DATA_STO
7940: 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a  RE_DIRECTORY: {.
7950: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
7960: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
7970: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 73 71 6c  ingleText(v, sql
7980: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
7990: 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ory);.    }else{
79a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
79b0: 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 69  OMIT_WSD.      i
79c0: 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a  f( zRight[0] ){.
79d0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
79e0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
79f0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 64 62  lite3OsAccess(db
7a00: 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68 74 2c 20  ->pVfs, zRight, 
7a10: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
7a20: 41 44 57 52 49 54 45 2c 20 26 72 65 73 29 3b 0a  ADWRITE, &res);.
7a30: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
7a40: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73  SQLITE_OK || res
7a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7a60: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7a70: 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 20  (pParse, "not a 
7a80: 77 72 69 74 61 62 6c 65 20 64 69 72 65 63 74 6f  writable directo
7a90: 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ry");.          
7aa0: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
7ab0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7ac0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7ad0: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 64 61  _free(sqlite3_da
7ae0: 74 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  ta_directory);. 
7af0: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
7b00: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
7b10: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
7b20: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
7b30: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
7b40: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
7b50: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7b60: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7b70: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7b80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7b90: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7ba0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7bb0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
7bc0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
7bd0: 4e 47 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20  NG_STYLE.  /*.  
7be0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
7bf0: 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ema.]lock_proxy_
7c00: 66 69 6c 65 0a 20 20 2a 2a 20 20 20 50 52 41 47  file.  **   PRAG
7c10: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b  MA [schema.]lock
7c20: 5f 70 72 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a  _proxy_file = ":
7c30: 61 75 74 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c  auto:"|"lock_fil
7c40: 65 5f 70 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a  e_path".  **.  *
7c50: 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
7c60: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
7c70: 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
7c80: 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
7c90: 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
7ca0: 73 65 74 73 20 61 20 73 70 65 63 69 66 69 63 20  sets a specific 
7cb0: 66 69 6c 65 20 74 6f 20 62 65 20 75 73 65 64 20  file to be used 
7cc0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 63 63  for database acc
7cd0: 65 73 73 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a  ess locks..  **.
7ce0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7cf0: 54 79 70 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46  Typ_LOCK_PROXY_F
7d00: 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21  ILE: {.    if( !
7d10: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
7d20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
7d30: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
7d40: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  r(pDb->pBt);.   
7d50: 20 20 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66     char *proxy_f
7d60: 69 6c 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b  ile_path = NULL;
7d70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7d80: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c  ile *pFile = sql
7d90: 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
7da0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
7db0: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
7dc0: 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c  lHint(pFile, SQL
7dd0: 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
7de0: 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  YFILE, .        
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 20 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70     &proxy_file_p
7e10: 61 74 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ath);.      retu
7e20: 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20  rnSingleText(v, 
7e30: 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29  proxy_file_path)
7e40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e50: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
7e60: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7e70: 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  ager(pDb->pBt);.
7e80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
7e90: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
7ea0: 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
7eb0: 67 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ger);.      int 
7ec0: 72 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  res;.      if( z
7ed0: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7ee0: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7ef0: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7f00: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7f10: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 20 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20      zRight);.   
7f50: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
7f60: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7f70: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7f80: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7f90: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20      NULL);.     
7fd0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73   }.      if( res
7fe0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7ff0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
8000: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8010: 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f  failed to set lo
8020: 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b  ck proxy file");
8030: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72  .        goto pr
8040: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
8050: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
8060: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
8070: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
8080: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20  OCKING_STYLE */ 
8090: 20 20 20 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a       .    .  /*.
80a0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
80b0: 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f  chema.]synchrono
80c0: 75 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  us.  **   PRAGMA
80d0: 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72   [schema.]synchr
80e0: 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52  onous=OFF|ON|NOR
80f0: 4d 41 4c 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20  MAL|FULL|EXTRA. 
8100: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
8110: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
8120: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
8130: 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20  nchronous flag. 
8140: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
8150: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64  he local value d
8160: 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61  oes not make cha
8170: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b  nges to the disk
8180: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20   file and the.  
8190: 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
81a0: 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65   will be restore
81b0: 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  d the next time 
81c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
81d0: 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a    ** opened..  *
81e0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
81f0: 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a  _SYNCHRONOUS: {.
8200: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
8210: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
8220: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d  ingleInt(v, pDb-
8230: 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29  >safety_level-1)
8240: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8250: 20 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f     if( !db->auto
8260: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
8270: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8280: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
8290: 20 20 20 20 20 20 20 22 53 61 66 65 74 79 20 6c         "Safety l
82a0: 65 76 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20  evel may not be 
82b0: 63 68 61 6e 67 65 64 20 69 6e 73 69 64 65 20 61  changed inside a
82c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a   transaction");.
82d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
82e0: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
82f0: 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28    int iLevel = (
8300: 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a  getSafetyLevel(z
8310: 52 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26 20  Right,0,1)+1) & 
8320: 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
8330: 53 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20  S_MASK;.        
8340: 69 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20  if( iLevel==0 ) 
8350: 69 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20  iLevel = 1;.    
8360: 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
8370: 6c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a  level = iLevel;.
8380: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53 79          pDb->bSy
8390: 6e 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  ncSet = 1;.     
83a0: 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c     setAllPagerFl
83b0: 61 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  ags(db);.      }
83c0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
83d0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
83e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
83f0: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  R_PRAGMAS */..#i
8400: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8410: 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20  T_FLAG_PRAGMAS. 
8420: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4c   case PragTyp_FL
8430: 41 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  AG: {.    if( zR
8440: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
8450: 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74   setPragmaResult
8460: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70  ColumnNames(v, p
8470: 50 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20 72  Pragma);.      r
8480: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
8490: 2c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 70  , (db->flags & p
84a0: 50 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30  Pragma->iArg)!=0
84b0: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
84c0: 20 20 20 20 20 75 36 34 20 6d 61 73 6b 20 3d 20       u64 mask = 
84d0: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20  pPragma->iArg;  
84e0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
84f0: 73 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65 61  s to set or clea
8500: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
8510: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
8520: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
8530: 46 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70  Foreign key supp
8540: 6f 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 65  ort may not be e
8550: 6e 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62 6c  nabled or disabl
8560: 65 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20  ed while not.   
8570: 20 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d       ** in auto-
8580: 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f  commit mode.  */
8590: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d  .        mask &=
85a0: 20 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   ~(SQLITE_Foreig
85b0: 6e 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a  nKeys);.      }.
85c0: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
85d0: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
85e0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
85f0: 68 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55  h.authLevel==UAU
8600: 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20  TH_User ){.     
8610: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
8620: 6f 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65  ow non-admin use
8630: 72 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  rs to modify the
8640: 20 73 63 68 65 6d 61 20 61 72 62 69 74 72 61 72   schema arbitrar
8650: 69 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ily */.        m
8660: 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ask &= ~(SQLITE_
8670: 57 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20 20  WriteSchema);.  
8680: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
8690: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
86a0: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
86b0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
86c0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73  db->flags |= mas
86d0: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
86e0: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
86f0: 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  s &= ~mask;.    
8700: 20 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51      if( mask==SQ
8710: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 20  LITE_DeferFKs ) 
8720: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
8730: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
8740: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79  }..      /* Many
8750: 20 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72 61   of the flag-pra
8760: 67 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65 20  gmas modify the 
8770: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
8780: 79 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20 20  y the SQL .     
8790: 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65 67   ** compiler (eg
87a0: 2e 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29  . count_changes)
87b0: 2e 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f  . So add an opco
87c0: 64 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c 6c  de to expire all
87d0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
87e0: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
87f0: 73 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69 6e  s after modifyin
8800: 67 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75 65  g a pragma value
8810: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8820: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8830: 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29  p0(v, OP_Expire)
8840: 3b 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61  ;.      setAllPa
8850: 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20  gerFlags(db);.  
8860: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8870: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8880: 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52  ITE_OMIT_FLAG_PR
8890: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
88a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  f SQLITE_OMIT_SC
88b0: 48 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f  HEMA_PRAGMAS.  /
88c0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
88d0: 74 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c  table_info(<tabl
88e0: 65 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  e>).  **.  ** Re
88f0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
8900: 77 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  w for each colum
8910: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74  n of the named t
8920: 61 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e  able. The column
8930: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65  s of.  ** the re
8940: 74 75 72 6e 65 64 20 64 61 74 61 20 73 65 74 20  turned data set 
8950: 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  are:.  **.  ** c
8960: 69 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  id:        Colum
8970: 6e 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20 66  n id (numbered f
8980: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
8990: 74 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20 30  t, starting at 0
89a0: 29 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20  ).  ** name:    
89b0: 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20     Column name. 
89c0: 20 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20 20   ** type:       
89d0: 43 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  Column declarati
89e0: 6f 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f  on type..  ** no
89f0: 74 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20 69  tnull:    True i
8a00: 66 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20  f 'NOT NULL' is 
8a10: 70 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64  part of column d
8a20: 65 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  eclaration.  ** 
8a30: 64 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65 20  dflt_value: The 
8a40: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
8a50: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66  r the column, if
8a60: 20 61 6e 79 2e 0a 20 20 2a 2a 20 70 6b 3a 20 20   any..  ** pk:  
8a70: 20 20 20 20 20 20 20 4e 6f 6e 2d 7a 65 72 6f 20         Non-zero 
8a80: 66 6f 72 20 50 4b 20 66 69 65 6c 64 73 2e 0a 20  for PK fields.. 
8a90: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
8aa0: 79 70 5f 54 41 42 4c 45 5f 49 4e 46 4f 3a 20 69  yp_TABLE_INFO: i
8ab0: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
8ac0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
8ad0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
8ae0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
8af0: 73 65 2c 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52  se, LOCATE_NOERR
8b00: 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a  , zRight, zDb);.
8b10: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
8b20: 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 44 62        int iTabDb
8b30: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
8b40: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
8b50: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
8b60: 20 20 69 6e 74 20 69 2c 20 6b 3b 0a 20 20 20 20    int i, k;.    
8b70: 20 20 69 6e 74 20 6e 48 69 64 64 65 6e 20 3d 20    int nHidden = 
8b80: 30 3b 0a 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  0;.      Column 
8b90: 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 49 6e 64  *pCol;.      Ind
8ba0: 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65  ex *pPk = sqlite
8bb0: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
8bc0: 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 50  (pTab);.      pP
8bd0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 37 3b 0a  arse->nMem = 7;.
8be0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
8bf0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
8c00: 61 72 73 65 2c 20 69 54 61 62 44 62 29 3b 0a 20  arse, iTabDb);. 
8c10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77       sqlite3View
8c20: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
8c30: 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
8c40: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f      for(i=0, pCo
8c50: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c  l=pTab->aCol; i<
8c60: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  pTab->nCol; i++,
8c70: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
8c80: 20 20 69 6e 74 20 69 73 48 69 64 64 65 6e 20 3d    int isHidden =
8c90: 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28   IsHiddenColumn(
8ca0: 70 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  pCol);.        i
8cb0: 66 28 20 69 73 48 69 64 64 65 6e 20 26 26 20 70  f( isHidden && p
8cc0: 50 72 61 67 6d 61 2d 3e 69 41 72 67 3d 3d 30 20  Pragma->iArg==0 
8cd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69  ){.          nHi
8ce0: 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  dden++;.        
8cf0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8d10: 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67  ( (pCol->colFlag
8d20: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
8d30: 4b 45 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  KEY)==0 ){.     
8d40: 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20       k = 0;.    
8d50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
8d60: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
8d70: 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20    k = 1;.       
8d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8d90: 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54    for(k=1; k<=pT
8da0: 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d  ab->nCol && pPk-
8db0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d  >aiColumn[k-1]!=
8dc0: 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  i; k++){}.      
8dd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
8de0: 72 74 28 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d  rt( pCol->pDflt=
8df0: 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c  =0 || pCol->pDfl
8e00: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29  t->op==TK_SPAN )
8e10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8e20: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
8e30: 2c 20 31 2c 20 70 50 72 61 67 6d 61 2d 3e 69 41  , 1, pPragma->iA
8e40: 72 67 20 3f 20 22 69 73 73 69 73 69 69 22 20 3a  rg ? "issisii" :
8e50: 20 22 69 73 73 69 73 69 22 2c 0a 20 20 20 20 20   "issisi",.     
8e60: 20 20 20 20 20 20 20 20 20 20 69 2d 6e 48 69 64            i-nHid
8e70: 64 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  den,.           
8e80: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c      pCol->zName,
8e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ea0: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
8eb0: 65 28 70 43 6f 6c 2c 22 22 29 2c 0a 20 20 20 20  e(pCol,""),.    
8ec0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
8ed0: 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20 3a 20 30  >notNull ? 1 : 0
8ee0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8ef0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3f 20 70   pCol->pDflt ? p
8f00: 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54  Col->pDflt->u.zT
8f10: 6f 6b 65 6e 20 3a 20 30 2c 0a 20 20 20 20 20 20  oken : 0,.      
8f20: 20 20 20 20 20 20 20 20 20 6b 2c 0a 20 20 20 20           k,.    
8f30: 20 20 20 20 20 20 20 20 20 20 20 69 73 48 69 64             isHid
8f40: 64 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  den);.      }.  
8f50: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
8f60: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8f70: 44 45 42 55 47 0a 20 20 63 61 73 65 20 50 72 61  DEBUG.  case Pra
8f80: 67 54 79 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20  gTyp_STATS: {.  
8f90: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
8fa0: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a     HashElem *i;.
8fb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8fc0: 20 3d 20 35 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 5;.    sqlite
8fd0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
8fe0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
8ff0: 20 20 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65      for(i=sqlite
9000: 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
9010: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
9020: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
9030: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
9040: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9050: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
9060: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9070: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9080: 20 31 2c 20 22 73 73 69 69 69 22 2c 0a 20 20 20   1, "ssiii",.   
9090: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
90a0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
90b0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  0,.           pT
90c0: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20  ab->szTabRow,.  
90d0: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
90e0: 52 6f 77 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20  RowLogEst,.     
90f0: 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
9100: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 66 6f 72  lags);.      for
9110: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
9120: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
9130: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9140: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9150: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20  MultiLoad(v, 2, 
9160: 22 73 69 69 69 58 22 2c 0a 20 20 20 20 20 20 20  "siiiX",.       
9170: 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c      pIdx->zName,
9180: 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78  .           pIdx
9190: 2d 3e 73 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20  ->szIdxRow,.    
91a0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 52         pIdx->aiR
91b0: 6f 77 4c 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20  owLogEst[0],.   
91c0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 68 61          pIdx->ha
91d0: 73 53 74 61 74 31 29 3b 0a 20 20 20 20 20 20 20  sStat1);.       
91e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
91f0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
9200: 6f 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20  ow, 1, 5);.     
9210: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
9220: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  reak;.#endif..  
9230: 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44  case PragTyp_IND
9240: 45 58 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69  EX_INFO: if( zRi
9250: 67 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ght ){.    Index
9260: 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c   *pIdx;.    Tabl
9270: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 49 64  e *pTab;.    pId
9280: 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
9290: 6e 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c  ndex(db, zRight,
92a0: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
92b0: 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Idx ){.      int
92c0: 20 69 49 64 78 44 62 20 3d 20 73 71 6c 69 74 65   iIdxDb = sqlite
92d0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
92e0: 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  b, pIdx->pSchema
92f0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  );.      int i;.
9300: 20 20 20 20 20 20 69 6e 74 20 6d 78 3b 0a 20 20        int mx;.  
9310: 20 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d      if( pPragma-
9320: 3e 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  >iArg ){.       
9330: 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78   /* PRAGMA index
9340: 5f 78 69 6e 66 6f 20 28 6e 65 77 65 72 20 76 65  _xinfo (newer ve
9350: 72 73 69 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20  rsion with more 
9360: 72 6f 77 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  rows and columns
9370: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78 20  ) */.        mx 
9380: 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
9390: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
93a0: 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20  >nMem = 6;.     
93b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
93c0: 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  /* PRAGMA index_
93d0: 69 6e 66 6f 20 28 6c 65 67 61 63 79 20 76 65 72  info (legacy ver
93e0: 73 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 20 20 20  sion) */.       
93f0: 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79   mx = pIdx->nKey
9400: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 50 61  Col;.        pPa
9410: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20  rse->nMem = 3;. 
9420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
9430: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
9440: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
9450: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
9460: 70 50 61 72 73 65 2c 20 69 49 64 78 44 62 29 3b  pParse, iIdxDb);
9470: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9480: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72  Parse->nMem<=pPr
9490: 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65  agma->nPragCName
94a0: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
94b0: 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20  0; i<mx; i++){. 
94c0: 20 20 20 20 20 20 20 69 31 36 20 63 6e 75 6d 20         i16 cnum 
94d0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
94e0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  [i];.        sql
94f0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9500: 64 28 76 2c 20 31 2c 20 22 69 69 73 58 22 2c 20  d(v, 1, "iisX", 
9510: 69 2c 20 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20  i, cnum,.       
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 20 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30        cnum<0 ? 0
9540: 20 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e   : pTab->aCol[cn
9550: 75 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  um].zName);.    
9560: 20 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d      if( pPragma-
9570: 3e 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  >iArg ){.       
9580: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9590: 6c 74 69 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69  ltiLoad(v, 4, "i
95a0: 73 69 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  siX",.          
95b0: 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64    pIdx->aSortOrd
95c0: 65 72 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  er[i],.         
95d0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
95e0: 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i],.            
95f0: 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29  i<pIdx->nKeyCol)
9600: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9610: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9620: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
9630: 6c 74 52 6f 77 2c 20 31 2c 20 70 50 61 72 73 65  ltRow, 1, pParse
9640: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  ->nMem);.      }
9650: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
9660: 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67  ak;..  case Prag
9670: 54 79 70 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20  Typ_INDEX_LIST: 
9680: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
9690: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
96a0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
96b0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70      int i;.    p
96c0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
96d0: 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68  dTable(db, zRigh
96e0: 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  t, zDb);.    if(
96f0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69   pTab ){.      i
9700: 6e 74 20 69 54 61 62 44 62 20 3d 20 73 71 6c 69  nt iTabDb = sqli
9710: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
9720: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
9730: 6d 61 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ma);.      pPars
9740: 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20  e->nMem = 5;.   
9750: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
9760: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
9770: 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20  e, iTabDb);.    
9780: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
9790: 3e 70 49 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49  >pIndex, i=0; pI
97a0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
97b0: 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Next, i++){.    
97c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
97d0: 61 7a 4f 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22  azOrigin[] = { "
97e0: 63 22 2c 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b  c", "u", "pk" };
97f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9800: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9810: 20 31 2c 20 22 69 73 69 73 69 22 2c 0a 20 20 20   1, "isisi",.   
9820: 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20          i,.     
9830: 20 20 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d        pIdx->zNam
9840: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 49 73  e,.           Is
9850: 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
9860: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  ),.           az
9870: 4f 72 69 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78  Origin[pIdx->idx
9880: 54 79 70 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Type],.         
9890: 20 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78    pIdx->pPartIdx
98a0: 57 68 65 72 65 21 3d 30 29 3b 0a 20 20 20 20 20  Where!=0);.     
98b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
98c0: 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72  reak;..  case Pr
98d0: 61 67 54 79 70 5f 44 41 54 41 42 41 53 45 5f 4c  agTyp_DATABASE_L
98e0: 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  IST: {.    int i
98f0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
9900: 65 6d 20 3d 20 33 3b 0a 20 20 20 20 66 6f 72 28  em = 3;.    for(
9910: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
9920: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
9930: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d  db->aDb[i].pBt==
9940: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
9950: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
9960: 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 21  aDb[i].zDbSName!
9970: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
9980: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9990: 28 76 2c 20 31 2c 20 22 69 73 73 22 2c 0a 20 20  (v, 1, "iss",.  
99a0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
99b0: 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44     db->aDb[i].zD
99c0: 62 53 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  bSName,.        
99d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
99e0: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
99f0: 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 7d  [i].pBt));.    }
9a00: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20  .  }.  break;.. 
9a10: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f   case PragTyp_CO
9a20: 4c 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a  LLATION_LIST: {.
9a30: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
9a40: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
9a50: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
9a60: 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 70 3d   = 2;.    for(p=
9a70: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
9a80: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20  &db->aCollSeq); 
9a90: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
9aa0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 43  ext(p)){.      C
9ab0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
9ac0: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
9ad0: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
9ae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9af0: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
9b00: 69 73 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d  is", i++, pColl-
9b10: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
9b20: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66   }.  break;..#if
9b30: 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f  def SQLITE_INTRO
9b40: 53 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53  SPECTION_PRAGMAS
9b50: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9b60: 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b  FUNCTION_LIST: {
9b70: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
9b80: 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20  HashElem *j;.   
9b90: 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 20   FuncDef *p;.   
9ba0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9bb0: 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  2;.    for(i=0; 
9bc0: 69 3c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 48 41  i<SQLITE_FUNC_HA
9bd0: 53 48 5f 53 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20  SH_SZ; i++){.   
9be0: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 33     for(p=sqlite3
9bf0: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
9c00: 2e 61 5b 69 5d 3b 20 70 3b 20 70 3d 70 2d 3e 75  .a[i]; p; p=p->u
9c10: 2e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  .pHash ){.      
9c20: 20 20 69 66 28 20 70 2d 3e 66 75 6e 63 46 6c 61    if( p->funcFla
9c30: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
9c40: 5f 49 4e 54 45 52 4e 41 4c 20 29 20 63 6f 6e 74  _INTERNAL ) cont
9c50: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71  inue;.        sq
9c60: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9c70: 61 64 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70  ad(v, 1, "si", p
9c80: 2d 3e 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20  ->zName, 1);.   
9c90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
9ca0: 6f 72 28 6a 3d 73 71 6c 69 74 65 48 61 73 68 46  or(j=sqliteHashF
9cb0: 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e 63 29  irst(&db->aFunc)
9cc0: 3b 20 6a 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73  ; j; j=sqliteHas
9cd0: 68 4e 65 78 74 28 6a 29 29 7b 0a 20 20 20 20 20  hNext(j)){.     
9ce0: 20 70 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73   p = (FuncDef*)s
9cf0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6a 29  qliteHashData(j)
9d00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9d10: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
9d20: 31 2c 20 22 73 69 22 2c 20 70 2d 3e 7a 4e 61 6d  1, "si", p->zNam
9d30: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
9d40: 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64  .  break;..#ifnd
9d50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
9d60: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 63 61  IRTUALTABLE.  ca
9d70: 73 65 20 50 72 61 67 54 79 70 5f 4d 4f 44 55 4c  se PragTyp_MODUL
9d80: 45 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 48 61  E_LIST: {.    Ha
9d90: 73 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 70  shElem *j;.    p
9da0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b  Parse->nMem = 1;
9db0: 0a 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74  .    for(j=sqlit
9dc0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
9dd0: 61 4d 6f 64 75 6c 65 29 3b 20 6a 3b 20 6a 3d 73  aModule); j; j=s
9de0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6a 29  qliteHashNext(j)
9df0: 29 7b 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65 20  ){.      Module 
9e00: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a  *pMod = (Module*
9e10: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
9e20: 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  j);.      sqlite
9e30: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9e40: 2c 20 31 2c 20 22 73 22 2c 20 70 4d 6f 64 2d 3e  , 1, "s", pMod->
9e50: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
9e60: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
9e70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
9e80: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
9e90: 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  ..  case PragTyp
9ea0: 5f 50 52 41 47 4d 41 5f 4c 49 53 54 3a 20 7b 0a  _PRAGMA_LIST: {.
9eb0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
9ec0: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
9ed0: 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65 29  ize(aPragmaName)
9ee0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
9ef0: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9f00: 61 64 28 76 2c 20 31 2c 20 22 73 22 2c 20 61 50  ad(v, 1, "s", aP
9f10: 72 61 67 6d 61 4e 61 6d 65 5b 69 5d 2e 7a 4e 61  ragmaName[i].zNa
9f20: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
9f30: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
9f40: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50  * SQLITE_INTROSP
9f50: 45 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a  ECTION_PRAGMAS *
9f60: 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
9f70: 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f  ITE_OMIT_SCHEMA_
9f80: 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e  PRAGMAS */..#ifn
9f90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9fa0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 63 61  FOREIGN_KEY.  ca
9fb0: 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45 49  se PragTyp_FOREI
9fc0: 47 4e 5f 4b 45 59 5f 4c 49 53 54 3a 20 69 66 28  GN_KEY_LIST: if(
9fd0: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 46   zRight ){.    F
9fe0: 4b 65 79 20 2a 70 46 4b 3b 0a 20 20 20 20 54 61  Key *pFK;.    Ta
9ff0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
a000: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
a010: 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68  dTable(db, zRigh
a020: 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  t, zDb);.    if(
a030: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
a040: 46 4b 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  FK = pTab->pFKey
a050: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 4b 20  ;.      if( pFK 
a060: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
a070: 54 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53  TabDb = sqlite3S
a080: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
a090: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
a0a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
a0b0: 20 30 3b 20 0a 20 20 20 20 20 20 20 20 70 50 61   0; .        pPa
a0c0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 38 3b 0a 20  rse->nMem = 8;. 
a0d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
a0e0: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
a0f0: 50 61 72 73 65 2c 20 69 54 61 62 44 62 29 3b 0a  Parse, iTabDb);.
a100: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 70 46          while(pF
a110: 4b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  K){.          in
a120: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66  t j;.          f
a130: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e  or(j=0; j<pFK->n
a140: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
a150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a160: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
a170: 2c 20 22 69 69 73 73 73 73 73 73 22 2c 0a 20 20  , "iissssss",.  
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a190: 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   i,.            
a1a0: 20 20 20 20 20 20 20 6a 2c 0a 20 20 20 20 20 20         j,.      
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b               pFK
a1c0: 2d 3e 7a 54 6f 2c 0a 20 20 20 20 20 20 20 20 20  ->zTo,.         
a1d0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
a1e0: 61 43 6f 6c 5b 70 46 4b 2d 3e 61 43 6f 6c 5b 6a  aCol[pFK->aCol[j
a1f0: 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 2c 0a  ].iFrom].zName,.
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a210: 20 20 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e     pFK->aCol[j].
a220: 7a 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  zCol,.          
a230: 20 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e           actionN
a240: 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e  ame(pFK->aAction
a250: 5b 31 5d 29 2c 20 20 2f 2a 20 4f 4e 20 55 50 44  [1]),  /* ON UPD
a260: 41 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ATE */.         
a270: 20 20 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e            action
a280: 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f  Name(pFK->aActio
a290: 6e 5b 30 5d 29 2c 20 20 2f 2a 20 4f 4e 20 44 45  n[0]),  /* ON DE
a2a0: 4c 45 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  LETE */.        
a2b0: 20 20 20 20 20 20 20 20 20 20 20 22 4e 4f 4e 45             "NONE
a2c0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
a2d0: 20 20 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20            ++i;. 
a2e0: 20 20 20 20 20 20 20 20 20 70 46 4b 20 3d 20 70           pFK = p
a2f0: 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20  FK->pNextFrom;. 
a300: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
a320: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ak;.#endif /* !d
a330: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a340: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
a350: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
a360: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
a370: 4b 45 59 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  KEY.#ifndef SQLI
a380: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
a390: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46    case PragTyp_F
a3a0: 4f 52 45 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b  OREIGN_KEY_CHECK
a3b0: 3a 20 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46  : {.    FKey *pF
a3c0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
a3d0: 2a 20 41 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  * A foreign key 
a3e0: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
a3f0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
a400: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c           /* Chil
a410: 64 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20  d table contain 
a420: 22 52 45 46 45 52 45 4e 43 45 53 22 20 6b 65 79  "REFERENCES" key
a430: 77 6f 72 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c  word */.    Tabl
a440: 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20  e *pParent;     
a450: 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 74 61 62     /* Parent tab
a460: 6c 65 20 74 68 61 74 20 63 68 69 6c 64 20 70 6f  le that child po
a470: 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49  ints to */.    I
a480: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
a490: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
a4a0: 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  n the parent tab
a4b0: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  le */.    int i;
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4d0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
a4e0: 3a 20 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e  :  Foreign key n
a4f0: 75 6d 62 65 72 20 66 6f 72 20 70 54 61 62 20 2a  umber for pTab *
a500: 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20  /.    int j;    
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a520: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46  Loop counter:  F
a530: 69 65 6c 64 20 6f 66 20 74 68 65 20 66 6f 72 65  ield of the fore
a540: 69 67 6e 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48  ign key */.    H
a550: 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
a560: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a570: 75 6e 74 65 72 3a 20 20 4e 65 78 74 20 74 61 62  unter:  Next tab
a580: 6c 65 20 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a  le in schema */.
a590: 20 20 20 20 69 6e 74 20 78 3b 20 20 20 20 20 20      int x;      
a5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65             /* re
a5b0: 73 75 6c 74 20 76 61 72 69 61 62 6c 65 20 2a 2f  sult variable */
a5c0: 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 75  .    int regResu
a5d0: 6c 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 33  lt;         /* 3
a5e0: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f   registers to ho
a5f0: 6c 64 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ld a result row 
a600: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4b 65  */.    int regKe
a610: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y;            /*
a620: 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c   Register to hol
a630: 64 20 6b 65 79 20 66 6f 72 20 63 68 65 63 6b 69  d key for checki
a640: 6e 67 20 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20  ng the FK */.   
a650: 20 69 6e 74 20 72 65 67 52 6f 77 3b 20 20 20 20   int regRow;    
a660: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
a670: 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20 72  ters to hold a r
a680: 6f 77 20 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a  ow from pTab */.
a690: 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b      int addrTop;
a6a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
a6b0: 70 20 6f 66 20 61 20 6c 6f 6f 70 20 63 68 65 63  p of a loop chec
a6c0: 6b 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79  king foreign key
a6d0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  s */.    int add
a6e0: 72 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  rOk;            
a6f0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
a700: 74 68 65 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f  the key is OK */
a710: 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73  .    int *aiCols
a720: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63  ;           /* c
a730: 68 69 6c 64 20 74 6f 20 70 61 72 65 6e 74 20 63  hild to parent c
a740: 6f 6c 75 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f  olumn mapping */
a750: 0a 0a 20 20 20 20 72 65 67 52 65 73 75 6c 74 20  ..    regResult 
a760: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
a770: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
a780: 65 6d 20 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67  em += 4;.    reg
a790: 4b 65 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Key = ++pParse->
a7a0: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77  nMem;.    regRow
a7b0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
a7c0: 6d 3b 0a 20 20 20 20 6b 20 3d 20 73 71 6c 69 74  m;.    k = sqlit
a7d0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
a7e0: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
a7f0: 2d 3e 74 62 6c 48 61 73 68 29 3b 0a 20 20 20 20  ->tblHash);.    
a800: 77 68 69 6c 65 28 20 6b 20 29 7b 0a 20 20 20 20  while( k ){.    
a810: 20 20 69 6e 74 20 69 54 61 62 44 62 3b 0a 20 20    int iTabDb;.  
a820: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
a830: 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  {.        pTab =
a840: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
a850: 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 7a  ble(pParse, 0, z
a860: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
a870: 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20       k = 0;.    
a880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a890: 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29   pTab = (Table*)
a8a0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b  sqliteHashData(k
a8b0: 29 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73  );.        k = s
a8c0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
a8d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a8e0: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70  if( pTab==0 || p
a8f0: 54 61 62 2d 3e 70 46 4b 65 79 3d 3d 30 20 29 20  Tab->pFKey==0 ) 
a900: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
a910: 69 54 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33  iTabDb = sqlite3
a920: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
a930: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
a940: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
a950: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
a960: 70 50 61 72 73 65 2c 20 69 54 61 62 44 62 29 3b  pParse, iTabDb);
a970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
a980: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
a990: 69 54 61 62 44 62 2c 20 70 54 61 62 2d 3e 74 6e  iTabDb, pTab->tn
a9a0: 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
a9b0: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
a9c0: 54 61 62 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77  Tab->nCol+regRow
a9d0: 3e 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20  >pParse->nMem ) 
a9e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70  pParse->nMem = p
a9f0: 54 61 62 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67 52  Tab->nCol + regR
aa00: 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
aa10: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
aa20: 65 2c 20 30 2c 20 69 54 61 62 44 62 2c 20 70 54  e, 0, iTabDb, pT
aa30: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
aa40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
aa50: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
aa60: 20 72 65 67 52 65 73 75 6c 74 2c 20 70 54 61 62   regResult, pTab
aa70: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
aa80: 66 6f 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61  for(i=1, pFK=pTa
aa90: 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69  b->pFKey; pFK; i
aaa0: 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65  ++, pFK=pFK->pNe
aab0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20  xtFrom){.       
aac0: 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74   pParent = sqlit
aad0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
aae0: 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a  pFK->zTo, zDb);.
aaf0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
ab00: 65 6e 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ent==0 ) continu
ab10: 65 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  e;.        pIdx 
ab20: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
ab30: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
ab40: 61 72 73 65 2c 20 69 54 61 62 44 62 2c 20 70 50  arse, iTabDb, pP
ab50: 61 72 65 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c 20  arent->tnum, 0, 
ab60: 70 50 61 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29 3b  pParent->zName);
ab70: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c  .        x = sql
ab80: 69 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65  ite3FkLocateInde
ab90: 78 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e  x(pParse, pParen
aba0: 74 2c 20 70 46 4b 2c 20 26 70 49 64 78 2c 20 30  t, pFK, &pIdx, 0
abb0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  );.        if( x
abc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
abd0: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a   if( pIdx==0 ){.
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
abf0: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
ac00: 72 73 65 2c 20 69 2c 20 69 54 61 62 44 62 2c 20  rse, i, iTabDb, 
ac10: 70 50 61 72 65 6e 74 2c 20 4f 50 5f 4f 70 65 6e  pParent, OP_Open
ac20: 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  Read);.         
ac30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ac40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ac50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
ac60: 52 65 61 64 2c 20 69 2c 20 70 49 64 78 2d 3e 74  Read, i, pIdx->t
ac70: 6e 75 6d 2c 20 69 54 61 62 44 62 29 3b 0a 20 20  num, iTabDb);.  
ac80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ac90: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
aca0: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
acb0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
acc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
acd0: 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20        k = 0;.   
ace0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
acf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ad00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
ad10: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20  arse->nErr>0 || 
ad20: 70 46 4b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pFK==0 );.      
ad30: 69 66 28 20 70 46 4b 20 29 20 62 72 65 61 6b 3b  if( pFK ) break;
ad40: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
ad50: 65 2d 3e 6e 54 61 62 3c 69 20 29 20 70 50 61 72  e->nTab<i ) pPar
ad60: 73 65 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a 20 20  se->nTab = i;.  
ad70: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
ad80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ad90: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30 29  v, OP_Rewind, 0)
ada0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
adb0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  );.      for(i=1
adc0: 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65  , pFK=pTab->pFKe
add0: 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b  y; pFK; i++, pFK
ade0: 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  =pFK->pNextFrom)
adf0: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65 6e  {.        pParen
ae00: 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  t = sqlite3FindT
ae10: 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54  able(db, pFK->zT
ae20: 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20  o, zDb);.       
ae30: 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20   pIdx = 0;.     
ae40: 20 20 20 61 69 43 6f 6c 73 20 3d 20 30 3b 0a 20     aiCols = 0;. 
ae50: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65         if( pPare
ae60: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
ae70: 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63  x = sqlite3FkLoc
ae80: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
ae90: 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26   pParent, pFK, &
aea0: 70 49 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b 0a  pIdx, &aiCols);.
aeb0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
aec0: 28 20 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( x==0 );.      
aed0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72    }.        addr
aee0: 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Ok = sqlite3Vdbe
aef0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
af00: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
af10: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 61 64 20  te code to read 
af20: 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 76 61  the child key va
af30: 6c 75 65 73 20 69 6e 74 6f 20 72 65 67 69 73 74  lues into regist
af40: 65 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ers.        ** r
af50: 65 67 52 6f 77 2e 2e 72 65 67 52 6f 77 2b 6e 2e  egRow..regRow+n.
af60: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 63   If any of the c
af70: 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 73 20  hild key values 
af80: 61 72 65 20 4e 55 4c 4c 2c 20 74 68 69 73 20 0a  are NULL, this .
af90: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 63          ** row c
afa0: 61 6e 6e 6f 74 20 63 61 75 73 65 20 61 6e 20 46  annot cause an F
afb0: 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e 20 4a 75 6d  K violation. Jum
afc0: 70 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61 64  p directly to ad
afd0: 64 72 4f 6b 20 69 6e 20 0a 20 20 20 20 20 20 20  drOk in .       
afe0: 20 2a 2a 20 74 68 69 73 20 63 61 73 65 2e 20 2a   ** this case. *
aff0: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  /.        for(j=
b000: 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20  0; j<pFK->nCol; 
b010: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
b020: 69 6e 74 20 69 43 6f 6c 20 3d 20 61 69 43 6f 6c  int iCol = aiCol
b030: 73 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d 20 3a 20  s ? aiCols[j] : 
b040: 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72  pFK->aCol[j].iFr
b050: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  om;.          sq
b060: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
b070: 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
b080: 20 70 54 61 62 2c 20 30 2c 20 69 43 6f 6c 2c 20   pTab, 0, iCol, 
b090: 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20 20 20 20  regRow+j);.     
b0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b0b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
b0c0: 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a 2c 20 61  ull, regRow+j, a
b0d0: 64 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f 76 65  ddrOk); VdbeCove
b0e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
b0f0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   }..        /* G
b100: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
b110: 71 75 65 72 79 20 74 68 65 20 70 61 72 65 6e 74  query the parent
b120: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 6d 61 74   index for a mat
b130: 63 68 69 6e 67 20 70 61 72 65 6e 74 0a 20 20 20  ching parent.   
b140: 20 20 20 20 20 2a 2a 20 6b 65 79 2e 20 49 66 20       ** key. If 
b150: 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
b160: 2c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 4f 6b  , jump to addrOk
b170: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
b180: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20   pIdx ){.       
b190: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b1a0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
b1b0: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 70  ecord, regRow, p
b1c0: 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65 79  FK->nCol, regKey
b1d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b1e0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
b1f0: 6e 69 74 79 53 74 72 28 64 62 2c 70 49 64 78 29  nityStr(db,pIdx)
b200: 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a 20 20  , pFK->nCol);.  
b210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b220: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
b230: 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c 20 61 64 64  OP_Found, i, add
b240: 72 4f 6b 2c 20 72 65 67 4b 65 79 2c 20 30 29 3b  rOk, regKey, 0);
b250: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
b260: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b270: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
b280: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  arent ){.       
b290: 20 20 20 69 6e 74 20 6a 6d 70 20 3d 20 73 71 6c     int jmp = sql
b2a0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
b2b0: 64 64 72 28 76 29 2b 32 3b 0a 20 20 20 20 20 20  ddr(v)+2;.      
b2c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b2d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
b2e0: 52 6f 77 69 64 2c 20 69 2c 20 6a 6d 70 2c 20 72  Rowid, i, jmp, r
b2f0: 65 67 52 6f 77 29 3b 20 56 64 62 65 43 6f 76 65  egRow); VdbeCove
b300: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
b310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
b320: 74 6f 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20  to(v, addrOk);. 
b330: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
b340: 20 70 46 4b 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 3b   pFK->nCol==1 );
b350: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
b360: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
b370: 63 6f 64 65 20 74 6f 20 72 65 70 6f 72 74 20 61  code to report a
b380: 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 20 74  n FK violation t
b390: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f  o the caller. */
b3a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73  .        if( Has
b3b0: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
b3c0: 20 20 20 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 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 52 65  _Rowid, 0, regRe
b3f0: 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  sult+1);.       
b400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b420: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
b430: 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b  0, regResult+1);
b440: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b450: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
b460: 6c 74 69 4c 6f 61 64 28 76 2c 20 72 65 67 52 65  ltiLoad(v, regRe
b470: 73 75 6c 74 2b 32 2c 20 22 73 69 58 22 2c 20 70  sult+2, "siX", p
b480: 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29 3b 0a 20  FK->zTo, i-1);. 
b490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b4a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
b4b0: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73  esultRow, regRes
b4c0: 75 6c 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ult, 4);.       
b4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
b4e0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
b4f0: 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Ok);.        sql
b500: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
b510: 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 7d 0a  iCols);.      }.
b520: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b530: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
b540: 78 74 2c 20 30 2c 20 61 64 64 72 54 6f 70 2b 31  xt, 0, addrTop+1
b550: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
b560: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
b570: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b580: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 7d   addrTop);.    }
b590: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
b5a0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
b5b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
b5c0: 47 47 45 52 29 20 2a 2f 0a 23 65 6e 64 69 66 20  GGER) */.#endif 
b5d0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
b5e0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
b5f0: 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  KEY) */..#ifndef
b600: 20 4e 44 45 42 55 47 0a 20 20 63 61 73 65 20 50   NDEBUG.  case P
b610: 72 61 67 54 79 70 5f 50 41 52 53 45 52 5f 54 52  ragTyp_PARSER_TR
b620: 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a  ACE: {.    if( z
b630: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69  Right ){.      i
b640: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
b650: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 20  lean(zRight, 0) 
b660: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b670: 65 33 50 61 72 73 65 72 54 72 61 63 65 28 73 74  e3ParserTrace(st
b680: 64 6f 75 74 2c 20 22 70 61 72 73 65 72 3a 20 22  dout, "parser: "
b690: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b6a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
b6b0: 61 72 73 65 72 54 72 61 63 65 28 30 2c 20 30 29  arserTrace(0, 0)
b6c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b6d0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
b6e0: 64 69 66 0a 0a 20 20 2f 2a 20 52 65 69 6e 73 74  dif..  /* Reinst
b6f0: 61 6c 6c 20 74 68 65 20 4c 49 4b 45 20 61 6e 64  all the LIKE and
b700: 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e   GLOB functions.
b710: 20 20 54 68 65 20 76 61 72 69 61 6e 74 20 6f 66    The variant of
b720: 20 4c 49 4b 45 0a 20 20 2a 2a 20 75 73 65 64 20   LIKE.  ** used 
b730: 77 69 6c 6c 20 62 65 20 63 61 73 65 20 73 65 6e  will be case sen
b740: 73 69 74 69 76 65 20 6f 72 20 6e 6f 74 20 64 65  sitive or not de
b750: 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 52  pending on the R
b760: 48 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  HS..  */.  case 
b770: 50 72 61 67 54 79 70 5f 43 41 53 45 5f 53 45 4e  PragTyp_CASE_SEN
b780: 53 49 54 49 56 45 5f 4c 49 4b 45 3a 20 7b 0a 20  SITIVE_LIKE: {. 
b790: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
b7a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
b7b0: 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69  gisterLikeFuncti
b7c0: 6f 6e 73 28 64 62 2c 20 73 71 6c 69 74 65 33 47  ons(db, sqlite3G
b7d0: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
b7e0: 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , 0));.    }.  }
b7f0: 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64  .  break;..#ifnd
b800: 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52  ef SQLITE_INTEGR
b810: 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f  ITY_CHECK_ERROR_
b820: 4d 41 58 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  MAX.# define SQL
b830: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
b840: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 20 31 30  ECK_ERROR_MAX 10
b850: 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  0.#endif..#ifnde
b860: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
b870: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 20 20  TEGRITY_CHECK.  
b880: 2f 2a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  /*    PRAGMA int
b890: 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 2a  egrity_check.  *
b8a0: 2a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  *    PRAGMA inte
b8b0: 67 72 69 74 79 5f 63 68 65 63 6b 28 4e 29 0a 20  grity_check(N). 
b8c0: 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75   **    PRAGMA qu
b8d0: 69 63 6b 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 20  ick_check.  **  
b8e0: 20 20 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63    PRAGMA quick_c
b8f0: 68 65 63 6b 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a  heck(N).  **.  *
b900: 2a 20 56 65 72 69 66 79 20 74 68 65 20 69 6e 74  * Verify the int
b910: 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 64 61  egrity of the da
b920: 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  tabase..  **.  *
b930: 2a 20 54 68 65 20 22 71 75 69 63 6b 5f 63 68 65  * The "quick_che
b940: 63 6b 22 20 69 73 20 72 65 64 75 63 65 64 20 76  ck" is reduced v
b950: 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20  ersion of .  ** 
b960: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
b970: 64 65 73 69 67 6e 65 64 20 74 6f 20 64 65 74 65  designed to dete
b980: 63 74 20 6d 6f 73 74 20 64 61 74 61 62 61 73 65  ct most database
b990: 20 63 6f 72 72 75 70 74 69 6f 6e 0a 20 20 2a 2a   corruption.  **
b9a0: 20 77 69 74 68 6f 75 74 20 74 68 65 20 6f 76 65   without the ove
b9b0: 72 68 65 61 64 20 6f 66 20 63 72 6f 73 73 2d 63  rhead of cross-c
b9c0: 68 65 63 6b 69 6e 67 20 69 6e 64 65 78 65 73 2e  hecking indexes.
b9d0: 20 20 51 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20    Quick_check.  
b9e0: 2a 2a 20 69 73 20 6c 69 6e 65 61 72 20 74 69 6d  ** is linear tim
b9f0: 65 20 77 68 65 72 65 61 73 65 20 69 6e 74 65 67  e wherease integ
ba00: 72 69 74 79 5f 63 68 65 63 6b 20 69 73 20 4f 28  rity_check is O(
ba10: 4e 6c 6f 67 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63  NlogN)..  */.  c
ba20: 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 54 45  ase PragTyp_INTE
ba30: 47 52 49 54 59 5f 43 48 45 43 4b 3a 20 7b 0a 20  GRITY_CHECK: {. 
ba40: 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 61 64 64     int i, j, add
ba50: 72 2c 20 6d 78 45 72 72 3b 0a 0a 20 20 20 20 69  r, mxErr;..    i
ba60: 6e 74 20 69 73 51 75 69 63 6b 20 3d 20 28 73 71  nt isQuick = (sq
ba70: 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65  lite3Tolower(zLe
ba80: 66 74 5b 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a 20  ft[0])=='q');.. 
ba90: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 41     /* If the PRA
baa0: 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  GMA command was 
bab0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 50 52 41  of the form "PRA
bac0: 47 4d 41 20 3c 64 62 3e 2e 69 6e 74 65 67 72 69  GMA <db>.integri
bad0: 74 79 5f 63 68 65 63 6b 22 2c 0a 20 20 20 20 2a  ty_check",.    *
bae0: 2a 20 74 68 65 6e 20 69 44 62 20 69 73 20 73 65  * then iDb is se
baf0: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
bb00: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
bb10: 64 65 6e 74 69 66 69 65 64 20 62 79 20 3c 64 62  dentified by <db
bb20: 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  >..    ** In thi
bb30: 73 20 63 61 73 65 2c 20 74 68 65 20 69 6e 74 65  s case, the inte
bb40: 67 72 69 74 79 20 6f 66 20 64 61 74 61 62 61 73  grity of databas
bb50: 65 20 69 44 62 20 6f 6e 6c 79 20 69 73 20 76 65  e iDb only is ve
bb60: 72 69 66 69 65 64 20 62 79 0a 20 20 20 20 2a 2a  rified by.    **
bb70: 20 74 68 65 20 56 44 42 45 20 63 72 65 61 74 65   the VDBE create
bb80: 64 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a  d below..    **.
bb90: 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
bba0: 2c 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64  , if the command
bbb0: 20 77 61 73 20 73 69 6d 70 6c 79 20 22 50 52 41   was simply "PRA
bbc0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
bbd0: 65 63 6b 22 20 28 6f 72 0a 20 20 20 20 2a 2a 20  eck" (or.    ** 
bbe0: 22 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68  "PRAGMA quick_ch
bbf0: 65 63 6b 22 29 2c 20 74 68 65 6e 20 69 44 62 20  eck"), then iDb 
bc00: 69 73 20 73 65 74 20 74 6f 20 30 2e 20 49 6e 20  is set to 0. In 
bc10: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 69  this case, set i
bc20: 44 62 0a 20 20 20 20 2a 2a 20 74 6f 20 2d 31 20  Db.    ** to -1 
bc30: 68 65 72 65 2c 20 74 6f 20 69 6e 64 69 63 61 74  here, to indicat
bc40: 65 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  e that the VDBE 
bc50: 73 68 6f 75 6c 64 20 76 65 72 69 66 79 20 74 68  should verify th
bc60: 65 20 69 6e 74 65 67 72 69 74 79 0a 20 20 20 20  e integrity.    
bc70: 2a 2a 20 6f 66 20 61 6c 6c 20 61 74 74 61 63 68  ** of all attach
bc80: 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 2a  ed databases.  *
bc90: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  /.    assert( iD
bca0: 62 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  b>=0 );.    asse
bcb0: 72 74 28 20 69 44 62 3d 3d 30 20 7c 7c 20 70 49  rt( iDb==0 || pI
bcc0: 64 32 2d 3e 7a 20 29 3b 0a 20 20 20 20 69 66 28  d2->z );.    if(
bcd0: 20 70 49 64 32 2d 3e 7a 3d 3d 30 20 29 20 69 44   pId2->z==0 ) iD
bce0: 62 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20  b = -1;..    /* 
bcf0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 56  Initialize the V
bd00: 44 42 45 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20  DBE program */. 
bd10: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
bd20: 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  = 6;..    /* Set
bd30: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 65 72 72   the maximum err
bd40: 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  or count */.    
bd50: 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 49  mxErr = SQLITE_I
bd60: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45  NTEGRITY_CHECK_E
bd70: 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 69 66  RROR_MAX;.    if
bd80: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
bd90: 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33    sqlite3GetInt3
bda0: 32 28 7a 52 69 67 68 74 2c 20 26 6d 78 45 72 72  2(zRight, &mxErr
bdb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 45  );.      if( mxE
bdc0: 72 72 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr<=0 ){.       
bdd0: 20 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f   mxErr = SQLITE_
bde0: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f  INTEGRITY_CHECK_
bdf0: 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 20  ERROR_MAX;.     
be00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
be10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
be20: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 78  , OP_Integer, mx
be30: 45 72 72 2d 31 2c 20 31 29 3b 20 2f 2a 20 72 65  Err-1, 1); /* re
be40: 67 5b 31 5d 20 68 6f 6c 64 73 20 65 72 72 6f 72  g[1] holds error
be50: 73 20 6c 65 66 74 20 2a 2f 0a 0a 20 20 20 20 2f  s left */..    /
be60: 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69 74  * Do an integrit
be70: 79 20 63 68 65 63 6b 20 6f 6e 20 65 61 63 68 20  y check on each 
be80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
be90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bea0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
beb0: 20 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 78       HashElem *x
bec0: 3b 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  ;     /* For loo
bed0: 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
bee0: 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a   in the schema *
bef0: 2f 0a 20 20 20 20 20 20 48 61 73 68 20 2a 70 54  /.      Hash *pT
bf00: 62 6c 73 3b 20 20 20 20 20 2f 2a 20 53 65 74 20  bls;     /* Set 
bf10: 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
bf20: 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20   the schema */. 
bf30: 20 20 20 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b       int *aRoot;
bf40: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
bf50: 66 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  f root page numb
bf60: 65 72 73 20 6f 66 20 61 6c 6c 20 62 74 72 65 65  ers of all btree
bf70: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63  s */.      int c
bf80: 6e 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  nt = 0;     /* N
bf90: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
bfa0: 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20   in aRoot[] */. 
bfb0: 20 20 20 20 20 69 6e 74 20 6d 78 49 64 78 20 3d       int mxIdx =
bfc0: 20 30 3b 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d   0;   /* Maximum
bfd0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78   number of index
bfe0: 65 73 20 66 6f 72 20 61 6e 79 20 74 61 62 6c 65  es for any table
bff0: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 4f   */..      if( O
c000: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 3d  MIT_TEMPDB && i=
c010: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =1 ) continue;. 
c020: 20 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20       if( iDb>=0 
c030: 26 26 20 69 21 3d 69 44 62 20 29 20 63 6f 6e 74  && i!=iDb ) cont
c040: 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c  inue;..      sql
c050: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
c060: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b  hema(pParse, i);
c070: 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e  ..      /* Do an
c080: 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
c090: 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a 20   of the B-Tree. 
c0a0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
c0b0: 20 42 65 67 69 6e 20 62 79 20 66 69 6e 64 69 6e   Begin by findin
c0c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 73  g the root pages
c0d0: 20 6e 75 6d 62 65 72 73 0a 20 20 20 20 20 20 2a   numbers.      *
c0e0: 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  * for all tables
c0f0: 20 61 6e 64 20 69 6e 64 69 63 65 73 20 69 6e 20   and indices in 
c100: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
c110: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
c120: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
c130: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
c140: 69 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70  i, 0) );.      p
c150: 54 62 6c 73 20 3d 20 26 64 62 2d 3e 61 44 62 5b  Tbls = &db->aDb[
c160: 69 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  i].pSchema->tblH
c170: 61 73 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 63  ash;.      for(c
c180: 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61  nt=0, x=sqliteHa
c190: 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20  shFirst(pTbls); 
c1a0: 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e  x; x=sqliteHashN
c1b0: 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20  ext(x)){.       
c1c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
c1d0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29  qliteHashData(x)
c1e0: 3b 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 61  ;  /* Current ta
c1f0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  ble */.        I
c200: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20   /* An index on 
c230: 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 20 20  pTab */.        
c240: 69 6e 74 20 6e 49 64 78 3b 20 20 20 20 20 20 20  int nIdx;       
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
c270: 6e 64 65 78 65 73 20 6f 6e 20 70 54 61 62 20 2a  ndexes on pTab *
c280: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61  /.        if( Ha
c290: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 63  sRowid(pTab) ) c
c2a0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt++;.        fo
c2b0: 72 28 6e 49 64 78 3d 30 2c 20 70 49 64 78 3d 70  r(nIdx=0, pIdx=p
c2c0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
c2d0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
c2e0: 65 78 74 2c 20 6e 49 64 78 2b 2b 29 7b 20 63 6e  ext, nIdx++){ cn
c2f0: 74 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  t++; }.        i
c300: 66 28 20 6e 49 64 78 3e 6d 78 49 64 78 20 29 20  f( nIdx>mxIdx ) 
c310: 6d 78 49 64 78 20 3d 20 6e 49 64 78 3b 0a 20 20  mxIdx = nIdx;.  
c320: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 52 6f 6f      }.      aRoo
c330: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
c340: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
c350: 65 6f 66 28 69 6e 74 29 2a 28 63 6e 74 2b 31 29  eof(int)*(cnt+1)
c360: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 52 6f  );.      if( aRo
c370: 6f 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ot==0 ) break;. 
c380: 20 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20       for(cnt=0, 
c390: 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  x=sqliteHashFirs
c3a0: 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73  t(pTbls); x; x=s
c3b0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29  qliteHashNext(x)
c3c0: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
c3d0: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
c3e0: 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20  ashData(x);.    
c3f0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
c400: 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73  .        if( Has
c410: 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 61 52  Rowid(pTab) ) aR
c420: 6f 6f 74 5b 2b 2b 63 6e 74 5d 20 3d 20 70 54 61  oot[++cnt] = pTa
c430: 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  b->tnum;.       
c440: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
c450: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
c460: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
c470: 0a 20 20 20 20 20 20 20 20 20 20 61 52 6f 6f 74  .          aRoot
c480: 5b 2b 2b 63 6e 74 5d 20 3d 20 70 49 64 78 2d 3e  [++cnt] = pIdx->
c490: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tnum;.        }.
c4a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 52        }.      aR
c4b0: 6f 6f 74 5b 30 5d 20 3d 20 63 6e 74 3b 0a 0a 20  oot[0] = cnt;.. 
c4c0: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
c4d0: 65 20 73 75 66 66 69 63 69 65 6e 74 20 6e 75 6d  e sufficient num
c4e0: 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
c4f0: 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
c500: 61 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 50  ated */.      pP
c510: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58  arse->nMem = MAX
c520: 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20  ( pParse->nMem, 
c530: 38 2b 6d 78 49 64 78 20 29 3b 0a 20 20 20 20 20  8+mxIdx );.     
c540: 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
c550: 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
c560: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  );..      /* Do 
c570: 74 68 65 20 62 2d 74 72 65 65 20 69 6e 74 65 67  the b-tree integ
c580: 72 69 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20  rity checks */. 
c590: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c5a0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74  AddOp4(v, OP_Int
c5b0: 65 67 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74  egrityCk, 2, cnt
c5c0: 2c 20 31 2c 20 28 63 68 61 72 2a 29 61 52 6f 6f  , 1, (char*)aRoo
c5d0: 74 2c 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a  t,P4_INTARRAY);.
c5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c5f0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
c600: 29 69 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  )i);.      addr 
c610: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c620: 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
c630: 2c 20 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 2); VdbeCovera
c640: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
c650: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
c660: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
c670: 20 33 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   3, 0,.         
c680: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
c690: 62 2c 20 22 2a 2a 2a 20 69 6e 20 64 61 74 61 62  b, "*** in datab
c6a0: 61 73 65 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64  ase %s ***\n", d
c6b0: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
c6c0: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 50 34  me),.         P4
c6d0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
c6e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c6f0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c  p3(v, OP_Concat,
c700: 20 32 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20   2, 3, 3);.     
c710: 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52   integrityCheckR
c720: 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20  esultRow(v);.   
c730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
c740: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
c750: 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  ..      /* Make 
c760: 73 75 72 65 20 61 6c 6c 20 74 68 65 20 69 6e 64  sure all the ind
c770: 69 63 65 73 20 61 72 65 20 63 6f 6e 73 74 72 75  ices are constru
c780: 63 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  cted correctly..
c790: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
c7a0: 6f 72 28 78 3d 73 71 6c 69 74 65 48 61 73 68 46  or(x=sqliteHashF
c7b0: 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20  irst(pTbls); x; 
c7c0: 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  x=sqliteHashNext
c7d0: 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61  (x)){.        Ta
c7e0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
c7f0: 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20  teHashData(x);. 
c800: 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
c810: 64 78 2c 20 2a 70 50 6b 3b 0a 20 20 20 20 20 20  dx, *pPk;.      
c820: 20 20 49 6e 64 65 78 20 2a 70 50 72 69 6f 72 20    Index *pPrior 
c830: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
c840: 20 6c 6f 6f 70 54 6f 70 3b 0a 20 20 20 20 20 20   loopTop;.      
c850: 20 20 69 6e 74 20 69 44 61 74 61 43 75 72 2c 20    int iDataCur, 
c860: 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
c870: 20 69 6e 74 20 72 31 20 3d 20 2d 31 3b 0a 0a 20   int r1 = -1;.. 
c880: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d         if( pTab-
c890: 3e 74 6e 75 6d 3c 31 20 29 20 63 6f 6e 74 69 6e  >tnum<1 ) contin
c8a0: 75 65 3b 20 20 2f 2a 20 53 6b 69 70 20 56 49 45  ue;  /* Skip VIE
c8b0: 57 73 20 6f 72 20 56 49 52 54 55 41 4c 20 54 41  Ws or VIRTUAL TA
c8c0: 42 4c 45 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  BLEs */.        
c8d0: 70 50 6b 20 3d 20 48 61 73 52 6f 77 69 64 28 70  pPk = HasRowid(p
c8e0: 54 61 62 29 20 3f 20 30 20 3a 20 73 71 6c 69 74  Tab) ? 0 : sqlit
c8f0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
c900: 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
c910: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
c920: 65 41 6e 64 49 6e 64 69 63 65 73 28 70 50 61 72  eAndIndices(pPar
c930: 73 65 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  se, pTab, OP_Ope
c940: 6e 52 65 61 64 2c 20 30 2c 0a 20 20 20 20 20 20  nRead, 0,.      
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
c970: 30 2c 20 26 69 44 61 74 61 43 75 72 2c 20 26 69  0, &iDataCur, &i
c980: 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 20  IdxCur);.       
c990: 20 2f 2a 20 72 65 67 5b 37 5d 20 63 6f 75 6e 74   /* reg[7] count
c9a0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c9b0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 74  entries in the t
c9c0: 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  able..        **
c9d0: 20 72 65 67 5b 38 2b 69 5d 20 63 6f 75 6e 74 73   reg[8+i] counts
c9e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
c9f0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 69 2d  ntries in the i-
ca00: 74 68 20 69 6e 64 65 78 20 0a 20 20 20 20 20 20  th index .      
ca10: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
ca20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ca30: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
ca40: 20 37 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   7);.        for
ca50: 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  (j=0, pIdx=pTab-
ca60: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
ca70: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
ca80: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
ca90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
caa0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
cab0: 2c 20 30 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e  , 0, 8+j); /* in
cac0: 64 65 78 20 65 6e 74 72 69 65 73 20 63 6f 75 6e  dex entries coun
cad0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ter */.        }
cae0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
caf0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d 38   pParse->nMem>=8
cb00: 2b 6a 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  +j );.        as
cb10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4e 6f 54  sert( sqlite3NoT
cb20: 65 6d 70 73 49 6e 52 61 6e 67 65 28 70 50 61 72  empsInRange(pPar
cb30: 73 65 2c 31 2c 37 2b 6a 29 20 29 3b 0a 20 20 20  se,1,7+j) );.   
cb40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cb50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
cb60: 69 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20 30  ind, iDataCur, 0
cb70: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
cb80: 76 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6f 70  v);.        loop
cb90: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
cba0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
cbb0: 64 49 6d 6d 2c 20 37 2c 20 31 29 3b 0a 20 20 20  dImm, 7, 1);.   
cbc0: 20 20 20 20 20 69 66 28 20 21 69 73 51 75 69 63       if( !isQuic
cbd0: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  k ){.          /
cbe0: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 20 6f  * Sanity check o
cbf0: 6e 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  n record header 
cc00: 64 65 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 20 20  decoding */.    
cc10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cc20: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
cc30: 6c 75 6d 6e 2c 20 69 44 61 74 61 43 75 72 2c 20  lumn, iDataCur, 
cc40: 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 2c 20 33 29  pTab->nCol-1, 3)
cc50: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cc60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
cc70: 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  v, OPFLAG_TYPEOF
cc80: 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ARG);.        }.
cc90: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
cca0: 79 20 74 68 61 74 20 61 6c 6c 20 4e 4f 54 20 4e  y that all NOT N
ccb0: 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 72 65 61 6c  ULL columns real
ccc0: 6c 79 20 61 72 65 20 4e 4f 54 20 4e 55 4c 4c 20  ly are NOT NULL 
ccd0: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
cce0: 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
ccf0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
cd00: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
cd10: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32          int jmp2
cd20: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
cd30: 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  j==pTab->iPKey )
cd40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
cd50: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61       if( pTab->a
cd60: 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  Col[j].notNull==
cd70: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
cd80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
cd90: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
cda0: 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
cdb0: 20 69 44 61 74 61 43 75 72 2c 20 6a 2c 20 33 29   iDataCur, j, 3)
cdc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cdd0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
cde0: 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  v, OPFLAG_TYPEOF
cdf0: 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ARG);.          
ce00: 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp2 = sqlite3Vd
ce10: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
ce20: 6f 74 4e 75 6c 6c 2c 20 33 29 3b 20 56 64 62 65  otNull, 3); Vdbe
ce30: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
ce40: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71         zErr = sq
ce50: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
ce60: 20 22 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20   "NULL value in 
ce70: 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
ce80: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d     pTab->aCol[j]
ceb0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
cec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ced0: 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
cee0: 67 38 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72  g8, 0, 3, 0, zEr
cef0: 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  r, P4_DYNAMIC);.
cf00: 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 67 72            integr
cf10: 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f  ityCheckResultRo
cf20: 77 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  w(v);.          
cf30: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
cf40: 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20  ere(v, jmp2);.  
cf50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cf60: 2f 2a 20 56 65 72 69 66 79 20 43 48 45 43 4b 20  /* Verify CHECK 
cf70: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
cf80: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d         if( pTab-
cf90: 3e 70 43 68 65 63 6b 20 26 26 20 28 64 62 2d 3e  >pCheck && (db->
cfa0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
cfb0: 67 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30 20  gnoreChecks)==0 
cfc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
cfd0: 72 4c 69 73 74 20 2a 70 43 68 65 63 6b 20 3d 20  rList *pCheck = 
cfe0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
cff0: 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 43 68  up(db, pTab->pCh
d000: 65 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eck, 0);.       
d010: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
d020: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
d030: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64            int ad
d040: 64 72 43 6b 46 61 75 6c 74 20 3d 20 73 71 6c 69  drCkFault = sqli
d050: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d060: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d070: 20 69 6e 74 20 61 64 64 72 43 6b 4f 6b 20 3d 20   int addrCkOk = 
d080: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d090: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
d0a0: 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b       char *zErr;
d0b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d0c0: 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
d0d0: 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
d0e0: 20 3d 20 69 44 61 74 61 43 75 72 20 2b 20 31 3b   = iDataCur + 1;
d0f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
d100: 28 6b 3d 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72  (k=pCheck->nExpr
d110: 2d 31 3b 20 6b 3e 30 3b 20 6b 2d 2d 29 7b 0a 20  -1; k>0; k--){. 
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
d130: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
d140: 70 50 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e  pParse, pCheck->
d150: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 61 64 64 72  a[k].pExpr, addr
d160: 43 6b 46 61 75 6c 74 2c 20 30 29 3b 0a 20 20 20  CkFault, 0);.   
d170: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d180: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d190: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
d1a0: 20 70 43 68 65 63 6b 2d 3e 61 5b 30 5d 2e 70 45   pCheck->a[0].pE
d1b0: 78 70 72 2c 20 61 64 64 72 43 6b 4f 6b 2c 20 0a  xpr, addrCkOk, .
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1d0: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
d1e0: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  L);.            
d1f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d200: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
d210: 6b 46 61 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  kFault);.       
d220: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65       pParse->iSe
d230: 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  lfTab = 0;.     
d240: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71         zErr = sq
d250: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
d260: 20 22 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69   "CHECK constrai
d270: 6e 74 20 66 61 69 6c 65 64 20 69 6e 20 25 73 22  nt failed in %s"
d280: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d290: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d2b0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
d2c0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
d2d0: 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44  3, 0, zErr, P4_D
d2e0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
d2f0: 20 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68       integrityCh
d300: 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b  eckResultRow(v);
d310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d320: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
d330: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 4f 6b  abel(v, addrCkOk
d340: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
d350: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d360: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
d370: 62 2c 20 70 43 68 65 63 6b 29 3b 0a 20 20 20 20  b, pCheck);.    
d380: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
d390: 28 20 21 69 73 51 75 69 63 6b 20 29 7b 20 2f 2a  ( !isQuick ){ /*
d3a0: 20 4f 6d 69 74 20 74 68 65 20 72 65 6d 61 69 6e   Omit the remain
d3b0: 69 6e 67 20 74 65 73 74 73 20 66 6f 72 20 71 75  ing tests for qu
d3c0: 69 63 6b 5f 63 68 65 63 6b 20 2a 2f 0a 20 20 20  ick_check */.   
d3d0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 61         /* Valida
d3e0: 74 65 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  te index entries
d3f0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
d400: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20   row */.        
d410: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d    for(j=0, pIdx=
d420: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
d430: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
d440: 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20  Next, j++){.    
d450: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32          int jmp2
d460: 2c 20 6a 6d 70 33 2c 20 6a 6d 70 34 2c 20 6a 6d  , jmp3, jmp4, jm
d470: 70 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p5;.            
d480: 69 6e 74 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c  int ckUniq = sql
d490: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
d4a0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l(v);.          
d4b0: 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20    if( pPk==pIdx 
d4c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d4d0: 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
d4e0: 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
d4f0: 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64  xKey(pParse, pId
d500: 78 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c 20  x, iDataCur, 0, 
d510: 30 2c 20 26 6a 6d 70 33 2c 0a 20 20 20 20 20 20  0, &jmp3,.      
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a     pPrior, r1);.
d550: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
d560: 6f 72 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  or = pIdx;.     
d570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d580: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
d590: 64 64 49 6d 6d 2c 20 38 2b 6a 2c 20 31 29 3b 2f  ddImm, 8+j, 1);/
d5a0: 2a 20 69 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72  * increment entr
d5b0: 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  y count */.     
d5c0: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
d5d0: 20 74 68 61 74 20 61 6e 20 69 6e 64 65 78 20 65   that an index e
d5e0: 6e 74 72 79 20 65 78 69 73 74 73 20 66 6f 72 20  ntry exists for 
d5f0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
d600: 65 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  e row */.       
d610: 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69       jmp2 = sqli
d620: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d630: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 49  (v, OP_Found, iI
d640: 64 78 43 75 72 2b 6a 2c 20 63 6b 55 6e 69 71 2c  dxCur+j, ckUniq,
d650: 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r1,.           
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
d680: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 20 56 64 62  x->nColumn); Vdb
d690: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d6a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d6b0: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
d6c0: 76 2c 20 33 2c 20 22 72 6f 77 20 22 29 3b 0a 20  v, 3, "row ");. 
d6d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d6e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d6f0: 4f 50 5f 43 6f 6e 63 61 74 2c 20 37 2c 20 33 2c  OP_Concat, 7, 3,
d700: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   3);.           
d710: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
d720: 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 22 20 6d  String(v, 4, " m
d730: 69 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65  issing from inde
d740: 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  x ");.          
d750: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d760: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
d770: 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20  , 4, 3, 3);.    
d780: 20 20 20 20 20 20 20 20 6a 6d 70 35 20 3d 20 73          jmp5 = s
d790: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
d7a0: 72 69 6e 67 28 76 2c 20 34 2c 20 70 49 64 78 2d  ring(v, 4, pIdx-
d7b0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
d7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d7d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
d7e0: 63 61 74 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20  cat, 4, 3, 3);. 
d7f0: 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 34 20             jmp4 
d800: 3d 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b  = integrityCheck
d810: 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20  ResultRow(v);.  
d820: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d830: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
d840: 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20   jmp2);.        
d850: 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 51 55      /* For UNIQU
d860: 45 20 69 6e 64 65 78 65 73 2c 20 76 65 72 69 66  E indexes, verif
d870: 79 20 74 68 61 74 20 6f 6e 6c 79 20 6f 6e 65 20  y that only one 
d880: 65 6e 74 72 79 20 65 78 69 73 74 73 20 77 69 74  entry exists wit
d890: 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  h the.          
d8a0: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 6b 65 79    ** current key
d8b0: 2e 20 20 54 68 65 20 65 6e 74 72 79 20 69 73 20  .  The entry is 
d8c0: 75 6e 69 71 75 65 20 69 66 20 28 31 29 20 61 6e  unique if (1) an
d8d0: 79 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  y column is NULL
d8e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
d8f0: 6f 72 20 28 32 29 20 74 68 65 20 6e 65 78 74 20  or (2) the next 
d900: 65 6e 74 72 79 20 68 61 73 20 61 20 64 69 66 66  entry has a diff
d910: 65 72 65 6e 74 20 6b 65 79 20 2a 2f 0a 20 20 20  erent key */.   
d920: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 55           if( IsU
d930: 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
d940: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d950: 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20 3d 20 73    int uniqOk = s
d960: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d970: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
d980: 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a        int jmp6;.
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d9a0: 74 20 6b 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  t kk;.          
d9b0: 20 20 20 20 66 6f 72 28 6b 6b 3d 30 3b 20 6b 6b      for(kk=0; kk
d9c0: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
d9d0: 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  kk++){.         
d9e0: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
d9f0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
da00: 5b 6b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [kk];.          
da10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
da20: 6f 6c 21 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20  ol!=XN_ROWID && 
da30: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
da40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
da50: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26     if( iCol>=0 &
da60: 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  & pTab->aCol[iCo
da70: 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f 6e  l].notNull ) con
da80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
da90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
daa0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
dab0: 73 4e 75 6c 6c 2c 20 72 31 2b 6b 6b 2c 20 75 6e  sNull, r1+kk, un
dac0: 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  iqOk);.         
dad0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
dae0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
daf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
db00: 20 20 20 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c        jmp6 = sql
db10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
db20: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78 43  , OP_Next, iIdxC
db30: 75 72 2b 6a 29 3b 20 56 64 62 65 43 6f 76 65 72  ur+j); VdbeCover
db40: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
db50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
db60: 65 47 6f 74 6f 28 76 2c 20 75 6e 69 71 4f 6b 29  eGoto(v, uniqOk)
db70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
db80: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
db90: 65 72 65 28 76 2c 20 6a 6d 70 36 29 3b 0a 20 20  ere(v, jmp6);.  
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
dbb0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
dbc0: 28 76 2c 20 4f 50 5f 49 64 78 47 54 2c 20 69 49  (v, OP_IdxGT, iI
dbd0: 64 78 43 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b 2c  dxCur+j, uniqOk,
dbe0: 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r1,.           
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 4b          pIdx->nK
dc10: 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65  eyCol); VdbeCove
dc20: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
dc30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dc40: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
dc50: 33 2c 20 22 6e 6f 6e 2d 75 6e 69 71 75 65 20 65  3, "non-unique e
dc60: 6e 74 72 79 20 69 6e 20 69 6e 64 65 78 20 22 29  ntry in index ")
dc70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
dc80: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
dc90: 76 2c 20 6a 6d 70 35 29 3b 0a 20 20 20 20 20 20  v, jmp5);.      
dca0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dcb0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
dcc0: 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20  v, uniqOk);.    
dcd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dcf0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70  eJumpHere(v, jmp
dd00: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  4);.            
dd10: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61  sqlite3ResolvePa
dd20: 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73  rtIdxLabel(pPars
dd30: 65 2c 20 6a 6d 70 33 29 3b 0a 20 20 20 20 20 20  e, jmp3);.      
dd40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
dd50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dd60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dd70: 4e 65 78 74 2c 20 69 44 61 74 61 43 75 72 2c 20  Next, iDataCur, 
dd80: 6c 6f 6f 70 54 6f 70 29 3b 20 56 64 62 65 43 6f  loopTop); VdbeCo
dd90: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
dda0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
ddb0: 6d 70 48 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f  mpHere(v, loopTo
ddc0: 70 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  p-1);.#ifndef SQ
ddd0: 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
dde0: 4f 55 4e 54 0a 20 20 20 20 20 20 20 20 69 66 28  OUNT.        if(
ddf0: 20 21 69 73 51 75 69 63 6b 20 29 7b 0a 20 20 20   !isQuick ){.   
de00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
de10: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
de20: 32 2c 20 22 77 72 6f 6e 67 20 23 20 6f 66 20 65  2, "wrong # of e
de30: 6e 74 72 69 65 73 20 69 6e 20 69 6e 64 65 78 20  ntries in index 
de40: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ");.          fo
de50: 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  r(j=0, pIdx=pTab
de60: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
de70: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
de80: 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , j++){.        
de90: 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64      if( pPk==pId
dea0: 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  x ) continue;.  
deb0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dec0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ded0: 50 5f 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72  P_Count, iIdxCur
dee0: 2b 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  +j, 3);.        
def0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
df00: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
df10: 4f 50 5f 45 71 2c 20 38 2b 6a 2c 20 30 2c 20 33  OP_Eq, 8+j, 0, 3
df20: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
df30: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
df40: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
df50: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f  eP5(v, SQLITE_NO
df60: 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  TNULL);.        
df70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
df80: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20  oadString(v, 4, 
df90: 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
dfa0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dfb0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
dfc0: 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 32 2c 20  P_Concat, 4, 2, 
dfd0: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
dfe0: 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65  integrityCheckRe
dff0: 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20  sultRow(v);.    
e000: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e010: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
e020: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
e030: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
e040: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e050: 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a  T_BTREECOUNT */.
e060: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20        } .    }. 
e070: 20 20 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69     {.      stati
e080: 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20  c const int iLn 
e090: 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49  = VDBE_OFFSET_LI
e0a0: 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20 20 73  NENO(2);.      s
e0b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65  tatic const Vdbe
e0c0: 4f 70 4c 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d  OpList endCode[]
e0d0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f   = {.        { O
e0e0: 50 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31  P_AddImm,      1
e0f0: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
e100: 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20     /* 0 */.     
e110: 20 20 20 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65 72     { OP_IfNotZer
e120: 6f 2c 20 20 20 31 2c 20 34 2c 20 20 20 20 20 20  o,   1, 4,      
e130: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f    0},    /* 1 */
e140: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  .        { OP_St
e150: 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c  ring8,     0, 3,
e160: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
e170: 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 2 */.        {
e180: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20   OP_ResultRow,  
e190: 20 33 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d   3, 1,        0}
e1a0: 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20  ,    /* 3 */.   
e1b0: 20 20 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20       { OP_Halt, 
e1c0: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20         0, 0,    
e1d0: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20      0},    /* 4 
e1e0: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
e1f0: 53 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20  String8,     0, 
e200: 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  3,        0},   
e210: 20 2f 2a 20 35 20 2a 2f 0a 20 20 20 20 20 20 20   /* 5 */.       
e220: 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20   { OP_Goto,     
e230: 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20     0, 3,        
e240: 30 7d 2c 20 20 20 20 2f 2a 20 36 20 2a 2f 0a 20  0},    /* 6 */. 
e250: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64       };.      Vd
e260: 62 65 4f 70 20 2a 61 4f 70 3b 0a 0a 20 20 20 20  beOp *aOp;..    
e270: 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    aOp = sqlite3V
e280: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
e290: 41 72 72 61 79 53 69 7a 65 28 65 6e 64 43 6f 64  ArraySize(endCod
e2a0: 65 29 2c 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e  e), endCode, iLn
e2b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f 70  );.      if( aOp
e2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b   ){.        aOp[
e2d0: 30 5d 2e 70 32 20 3d 20 31 2d 6d 78 45 72 72 3b  0].p2 = 1-mxErr;
e2e0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e  .        aOp[2].
e2f0: 70 34 74 79 70 65 20 3d 20 50 34 5f 53 54 41 54  p4type = P4_STAT
e300: 49 43 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  IC;.        aOp[
e310: 32 5d 2e 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a  2].p4.z = "ok";.
e320: 20 20 20 20 20 20 20 20 61 4f 70 5b 35 5d 2e 70          aOp[5].p
e330: 34 74 79 70 65 20 3d 20 50 34 5f 53 54 41 54 49  4type = P4_STATI
e340: 43 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 35  C;.        aOp[5
e350: 5d 2e 70 34 2e 7a 20 3d 20 28 63 68 61 72 2a 29  ].p4.z = (char*)
e360: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
e370: 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 3b 0a 20  LITE_CORRUPT);. 
e380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e390: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
e3a0: 28 76 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64  (v, 0, sqlite3Vd
e3b0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e3c0: 2d 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  -2);.    }.  }. 
e3d0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
e3e0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
e3f0: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
e400: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e410: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a  _OMIT_UTF16.  /*
e420: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65  .  **   PRAGMA e
e430: 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50  ncoding.  **   P
e440: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d  RAGMA encoding =
e450: 20 22 75 74 66 2d 38 22 7c 22 75 74 66 2d 31 36   "utf-8"|"utf-16
e460: 22 7c 22 75 74 66 2d 31 36 6c 65 22 7c 22 75 74  "|"utf-16le"|"ut
e470: 66 2d 31 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a  f-16be".  **.  *
e480: 2a 20 49 6e 20 69 74 73 20 66 69 72 73 74 20 66  * In its first f
e490: 6f 72 6d 2c 20 74 68 69 73 20 70 72 61 67 6d 61  orm, this pragma
e4a0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 65 6e 63   returns the enc
e4b0: 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 69  oding of the mai
e4c0: 6e 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  n.  ** database.
e4d0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
e4e0: 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   is not initiali
e4f0: 7a 65 64 2c 20 69 74 20 69 73 20 69 6e 69 74 69  zed, it is initi
e500: 61 6c 69 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a  alized now..  **
e510: 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
e520: 20 66 6f 72 6d 20 6f 66 20 74 68 69 73 20 70 72   form of this pr
e530: 61 67 6d 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20  agma is a no-op 
e540: 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  if the main data
e550: 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68  base file.  ** h
e560: 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
e570: 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  een initialized.
e580: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
e590: 20 73 65 74 73 20 74 68 65 20 64 65 66 61 75 6c   sets the defaul
e5a0: 74 0a 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  t.  ** encoding 
e5b0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
e5c0: 64 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  d for the main d
e5d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
e5e0: 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20  a new file.  ** 
e5f0: 69 73 20 63 72 65 61 74 65 64 2e 20 49 66 20 61  is created. If a
e600: 6e 20 65 78 69 73 74 69 6e 67 20 6d 61 69 6e 20  n existing main 
e610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
e620: 20 6f 70 65 6e 65 64 2c 20 74 68 65 6e 20 74 68   opened, then th
e630: 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 74  e.  ** default t
e640: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  ext encoding for
e650: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61   the existing da
e660: 74 61 62 61 73 65 20 69 73 20 75 73 65 64 2e 0a  tabase is used..
e670: 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c    ** .  ** In al
e680: 6c 20 63 61 73 65 73 20 6e 65 77 20 64 61 74 61  l cases new data
e690: 62 61 73 65 73 20 63 72 65 61 74 65 64 20 75 73  bases created us
e6a0: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
e6b0: 6f 6d 6d 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20  ommand are.  ** 
e6c0: 63 72 65 61 74 65 64 20 74 6f 20 75 73 65 20 74  created to use t
e6d0: 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20  he same default 
e6e0: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 73  text encoding as
e6f0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e700: 73 65 2e 20 49 66 0a 20 20 2a 2a 20 74 68 65 20  se. If.  ** the 
e710: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 68 61  main database ha
e720: 73 20 6e 6f 74 20 62 65 65 6e 20 69 6e 69 74 69  s not been initi
e730: 61 6c 69 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72  alized and/or cr
e740: 65 61 74 65 64 20 77 68 65 6e 20 41 54 54 41 43  eated when ATTAC
e750: 48 0a 20 20 2a 2a 20 69 73 20 65 78 65 63 75 74  H.  ** is execut
e760: 65 64 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65  ed, this is done
e770: 20 62 65 66 6f 72 65 20 74 68 65 20 41 54 54 41   before the ATTA
e780: 43 48 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  CH operation..  
e790: 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 73  **.  ** In the s
e7a0: 65 63 6f 6e 64 20 66 6f 72 6d 20 74 68 69 73 20  econd form this 
e7b0: 70 72 61 67 6d 61 20 73 65 74 73 20 74 68 65 20  pragma sets the 
e7c0: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f  text encoding to
e7d0: 20 62 65 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a   be used in.  **
e7e0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69   new database fi
e7f0: 6c 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  les created usin
e800: 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  g this database 
e810: 68 61 6e 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e  handle. It is on
e820: 6c 79 0a 20 20 2a 2a 20 75 73 65 66 75 6c 20 69  ly.  ** useful i
e830: 66 20 69 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69  f invoked immedi
e840: 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20  ately after the 
e850: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 0a  main database i.
e860: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
e870: 54 79 70 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a  Typ_ENCODING: {.
e880: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
e890: 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20   struct EncName 
e8a0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
e8b0: 61 6d 65 3b 0a 20 20 20 20 20 20 75 38 20 65 6e  ame;.      u8 en
e8c0: 63 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61 6d 65  c;.    } encname
e8d0: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  s[] = {.      { 
e8e0: 22 55 54 46 38 22 2c 20 20 20 20 20 53 51 4c 49  "UTF8",     SQLI
e8f0: 54 45 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d  TE_UTF8        }
e900: 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 38  ,.      { "UTF-8
e910: 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46  ",    SQLITE_UTF
e920: 38 20 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20  8        },  /* 
e930: 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20  Must be element 
e940: 5b 31 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22  [1] */.      { "
e950: 55 54 46 2d 31 36 6c 65 22 2c 20 53 51 4c 49 54  UTF-16le", SQLIT
e960: 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c  E_UTF16LE     },
e970: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65    /* Must be ele
e980: 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20 20 20  ment [2] */.    
e990: 20 20 7b 20 22 55 54 46 2d 31 36 62 65 22 2c 20    { "UTF-16be", 
e9a0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20  SQLITE_UTF16BE  
e9b0: 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62     },  /* Must b
e9c0: 65 20 65 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f  e element [3] */
e9d0: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 6c  .      { "UTF16l
e9e0: 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31  e",  SQLITE_UTF1
e9f0: 36 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  6LE     },.     
ea00: 20 7b 20 22 55 54 46 31 36 62 65 22 2c 20 20 53   { "UTF16be",  S
ea10: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20 20  QLITE_UTF16BE   
ea20: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54    },.      { "UT
ea30: 46 2d 31 36 22 2c 20 20 20 30 20 20 20 20 20 20  F-16",   0      
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f              }, /
ea50: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
ea60: 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20  TIVE */.      { 
ea70: 22 55 54 46 31 36 22 2c 20 20 20 20 30 20 20 20  "UTF16",    0   
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
ea90: 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31  , /* SQLITE_UTF1
eaa0: 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20  6NATIVE */.     
eab0: 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b   { 0, 0 }.    };
eac0: 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .    const struc
ead0: 74 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e 63 3b  t EncName *pEnc;
eae0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
eaf0: 20 29 7b 20 20 20 20 2f 2a 20 22 50 52 41 47 4d   ){    /* "PRAGM
eb00: 41 20 65 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20  A encoding" */. 
eb10: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
eb20: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
eb30: 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61  e) ) goto pragma
eb40: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 61 73 73 65  _out;.      asse
eb50: 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c  rt( encnames[SQL
eb60: 49 54 45 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53  ITE_UTF8].enc==S
eb70: 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20  QLITE_UTF8 );.  
eb80: 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e      assert( encn
eb90: 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31  ames[SQLITE_UTF1
eba0: 36 4c 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45  6LE].enc==SQLITE
ebb0: 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20 20 20 20  _UTF16LE );.    
ebc0: 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d    assert( encnam
ebd0: 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 42  es[SQLITE_UTF16B
ebe0: 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  E].enc==SQLITE_U
ebf0: 54 46 31 36 42 45 20 29 3b 0a 20 20 20 20 20 20  TF16BE );.      
ec00: 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74  returnSingleText
ec10: 28 76 2c 20 65 6e 63 6e 61 6d 65 73 5b 45 4e 43  (v, encnames[ENC
ec20: 28 70 50 61 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e  (pParse->db)].zN
ec30: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec50: 20 20 20 20 20 20 20 20 2f 2a 20 22 50 52 41 47          /* "PRAG
ec60: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58  MA encoding = XX
ec70: 58 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f  X" */.      /* O
ec80: 6e 6c 79 20 63 68 61 6e 67 65 20 74 68 65 20 76  nly change the v
ec90: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 2e 65  alue of sqlite.e
eca0: 6e 63 20 69 66 20 74 68 65 20 64 61 74 61 62 61  nc if the databa
ecb0: 73 65 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74  se handle is not
ecc0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  .      ** initia
ecd0: 6c 69 7a 65 64 2e 20 49 66 20 74 68 65 20 6d 61  lized. If the ma
ece0: 69 6e 20 64 61 74 61 62 61 73 65 20 65 78 69 73  in database exis
ecf0: 74 73 2c 20 74 68 65 20 6e 65 77 20 73 71 6c 69  ts, the new sqli
ed00: 74 65 2e 65 6e 63 20 76 61 6c 75 65 0a 20 20 20  te.enc value.   
ed10: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76     ** will be ov
ed20: 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 20 74  erwritten when t
ed30: 68 65 20 73 63 68 65 6d 61 20 69 73 20 6e 65 78  he schema is nex
ed40: 74 20 6c 6f 61 64 65 64 2e 20 49 66 20 69 74 20  t loaded. If it 
ed50: 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  does not.      *
ed60: 2a 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  * already exists
ed70: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 72 65  , it will be cre
ed80: 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  ated to use the 
ed90: 6e 65 77 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c  new encoding val
eda0: 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ue..      */.   
edb0: 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 20 20     if( .        
edc0: 21 28 44 62 48 61 73 50 72 6f 70 65 72 74 79 28  !(DbHasProperty(
edd0: 64 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61  db, 0, DB_Schema
ede0: 4c 6f 61 64 65 64 29 29 20 7c 7c 20 0a 20 20 20  Loaded)) || .   
edf0: 20 20 20 20 20 44 62 48 61 73 50 72 6f 70 65 72       DbHasProper
ee00: 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70  ty(db, 0, DB_Emp
ee10: 74 79 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  ty) .      ){.  
ee20: 20 20 20 20 20 20 66 6f 72 28 70 45 6e 63 3d 26        for(pEnc=&
ee30: 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e  encnames[0]; pEn
ee40: 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b  c->zName; pEnc++
ee50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
ee60: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
ee70: 6d 70 28 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d  mp(zRight, pEnc-
ee80: 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  >zName) ){.     
ee90: 20 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e         SCHEMA_EN
eea0: 43 28 64 62 29 20 3d 20 45 4e 43 28 64 62 29 20  C(db) = ENC(db) 
eeb0: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
eec0: 20 20 70 45 6e 63 2d 3e 65 6e 63 20 3f 20 70 45    pEnc->enc ? pE
eed0: 6e 63 2d 3e 65 6e 63 20 3a 20 53 51 4c 49 54 45  nc->enc : SQLITE
eee0: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
eef0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ef00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ef10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
ef20: 66 28 20 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20  f( !pEnc->zName 
ef30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
ef40: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ef50: 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65  rse, "unsupporte
ef60: 64 20 65 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c  d encoding: %s",
ef70: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   zRight);.      
ef80: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ef90: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
efa0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
efb0: 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
efc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
efd0: 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  IT_SCHEMA_VERSIO
efe0: 4e 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20  N_PRAGMAS.  /*. 
eff0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
f000: 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72  hema.]schema_ver
f010: 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47  sion.  **   PRAG
f020: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65  MA [schema.]sche
f030: 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e  ma_version = <in
f040: 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a  teger>.  **.  **
f050: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
f060: 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 0a  a.]user_version.
f070: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
f080: 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73  chema.]user_vers
f090: 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a  ion = <integer>.
f0a0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    **.  **   PRAG
f0b0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 66 72 65 65  MA [schema.]free
f0c0: 6c 69 73 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a  list_count.  **.
f0d0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
f0e0: 63 68 65 6d 61 2e 5d 64 61 74 61 5f 76 65 72 73  chema.]data_vers
f0f0: 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ion.  **.  **   
f100: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
f110: 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 0a 20  application_id. 
f120: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
f130: 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f  hema.]applicatio
f140: 6e 5f 69 64 20 3d 20 3c 69 6e 74 65 67 65 72 3e  n_id = <integer>
f150: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  **.  ** The p
f160: 72 61 67 6d 61 27 73 20 73 63 68 65 6d 61 5f 76  ragma's schema_v
f170: 65 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 5f  ersion and user_
f180: 76 65 72 73 69 6f 6e 20 61 72 65 20 75 73 65 64  version are used
f190: 20 74 6f 20 73 65 74 20 6f 72 20 67 65 74 0a 20   to set or get. 
f1a0: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
f1b0: 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73   the schema-vers
f1c0: 69 6f 6e 20 61 6e 64 20 75 73 65 72 2d 76 65 72  ion and user-ver
f1d0: 73 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65  sion, respective
f1e0: 6c 79 2e 20 42 6f 74 68 0a 20 20 2a 2a 20 74 68  ly. Both.  ** th
f1f0: 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e  e schema-version
f200: 20 61 6e 64 20 74 68 65 20 75 73 65 72 2d 76 65   and the user-ve
f210: 72 73 69 6f 6e 20 61 72 65 20 33 32 2d 62 69 74  rsion are 32-bit
f220: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73   signed integers
f230: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
f240: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
f250: 64 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  der..  **.  ** T
f260: 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  he schema-cookie
f270: 20 69 73 20 75 73 75 61 6c 6c 79 20 6f 6e 6c 79   is usually only
f280: 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 69 6e 74   manipulated int
f290: 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74  ernally by SQLit
f2a0: 65 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 69 6e  e. It.  ** is in
f2b0: 63 72 65 6d 65 6e 74 65 64 20 62 79 20 53 51 4c  cremented by SQL
f2c0: 69 74 65 20 77 68 65 6e 65 76 65 72 20 74 68 65  ite whenever the
f2d0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
f2e0: 20 69 73 20 6d 6f 64 69 66 69 65 64 20 28 62 79   is modified (by
f2f0: 0a 20 20 2a 2a 20 63 72 65 61 74 69 6e 67 20 6f  .  ** creating o
f300: 72 20 64 72 6f 70 70 69 6e 67 20 61 20 74 61 62  r dropping a tab
f310: 6c 65 20 6f 72 20 69 6e 64 65 78 29 2e 20 54 68  le or index). Th
f320: 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  e schema version
f330: 20 69 73 20 75 73 65 64 20 62 79 0a 20 20 2a 2a   is used by.  **
f340: 20 53 51 4c 69 74 65 20 65 61 63 68 20 74 69 6d   SQLite each tim
f350: 65 20 61 20 71 75 65 72 79 20 69 73 20 65 78 65  e a query is exe
f360: 63 75 74 65 64 20 74 6f 20 65 6e 73 75 72 65 20  cuted to ensure 
f370: 74 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61  that the interna
f380: 6c 20 63 61 63 68 65 0a 20 20 2a 2a 20 6f 66 20  l cache.  ** of 
f390: 74 68 65 20 73 63 68 65 6d 61 20 75 73 65 64 20  the schema used 
f3a0: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74  when compiling t
f3b0: 68 65 20 53 51 4c 20 71 75 65 72 79 20 6d 61 74  he SQL query mat
f3c0: 63 68 65 73 20 74 68 65 20 73 63 68 65 6d 61 20  ches the schema 
f3d0: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  of.  ** the data
f3e0: 62 61 73 65 20 61 67 61 69 6e 73 74 20 77 68 69  base against whi
f3f0: 63 68 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20  ch the compiled 
f400: 71 75 65 72 79 20 69 73 20 61 63 74 75 61 6c 6c  query is actuall
f410: 79 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a  y executed..  **
f420: 20 53 75 62 76 65 72 74 69 6e 67 20 74 68 69 73   Subverting this
f430: 20 6d 65 63 68 61 6e 69 73 6d 20 62 79 20 75 73   mechanism by us
f440: 69 6e 67 20 22 50 52 41 47 4d 41 20 73 63 68 65  ing "PRAGMA sche
f450: 6d 61 5f 76 65 72 73 69 6f 6e 22 20 74 6f 20 6d  ma_version" to m
f460: 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73  odify.  ** the s
f470: 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 69 73  chema-version is
f480: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 64 61 6e   potentially dan
f490: 67 65 72 6f 75 73 20 61 6e 64 20 6d 61 79 20 6c  gerous and may l
f4a0: 65 61 64 20 74 6f 20 70 72 6f 67 72 61 6d 0a 20  ead to program. 
f4b0: 20 2a 2a 20 63 72 61 73 68 65 73 20 6f 72 20 64   ** crashes or d
f4c0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
f4d0: 6f 6e 2e 20 55 73 65 20 77 69 74 68 20 63 61 75  on. Use with cau
f4e0: 74 69 6f 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion!.  **.  ** 
f4f0: 54 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e  The user-version
f500: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
f510: 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74  ernally by SQLit
f520: 65 2e 20 49 74 20 6d 61 79 20 62 65 20 75 73 65  e. It may be use
f530: 64 20 62 79 0a 20 20 2a 2a 20 61 70 70 6c 69 63  d by.  ** applic
f540: 61 74 69 6f 6e 73 20 66 6f 72 20 61 6e 79 20 70  ations for any p
f550: 75 72 70 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  urpose..  */.  c
f560: 61 73 65 20 50 72 61 67 54 79 70 5f 48 45 41 44  ase PragTyp_HEAD
f570: 45 52 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20  ER_VALUE: {.    
f580: 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 70 50  int iCookie = pP
f590: 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 2f 2a  ragma->iArg;  /*
f5a0: 20 57 68 69 63 68 20 63 6f 6f 6b 69 65 20 74 6f   Which cookie to
f5b0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 2a   read or write *
f5c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
f5d0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
f5e0: 62 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  b);.    if( zRig
f5f0: 68 74 20 26 26 20 28 70 50 72 61 67 6d 61 2d 3e  ht && (pPragma->
f600: 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
f610: 6c 67 5f 52 65 61 64 4f 6e 6c 79 29 3d 3d 30 20  lg_ReadOnly)==0 
f620: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ){.      /* Writ
f630: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
f640: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a  cookie value */.
f650: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
f660: 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65  st VdbeOpList se
f670: 74 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20  tCookie[] = {.  
f680: 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73        { OP_Trans
f690: 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31  action,    0,  1
f6a0: 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a  ,  0},    /* 0 *
f6b0: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53  /.        { OP_S
f6c0: 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30  etCookie,      0
f6d0: 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a  ,  0,  0},    /*
f6e0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20   1 */.      };. 
f6f0: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70       VdbeOp *aOp
f700: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f710: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
f720: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
f730: 61 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65  aySize(setCookie
f740: 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  ));.      aOp = 
f750: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f760: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
f770: 65 28 73 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65  e(setCookie), se
f780: 74 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  tCookie, 0);.   
f790: 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52     if( ONLY_IF_R
f7a0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f  EALLOC_STRESS(aO
f7b0: 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20  p==0) ) break;. 
f7c0: 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d       aOp[0].p1 =
f7d0: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
f7e0: 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20  1].p1 = iDb;.   
f7f0: 20 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69     aOp[1].p2 = i
f800: 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f  Cookie;.      aO
f810: 70 5b 31 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65  p[1].p3 = sqlite
f820: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20  3Atoi(zRight);. 
f830: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f840: 2f 2a 20 52 65 61 64 20 74 68 65 20 73 70 65 63  /* Read the spec
f850: 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c  ified cookie val
f860: 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74  ue */.      stat
f870: 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c  ic const VdbeOpL
f880: 69 73 74 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d  ist readCookie[]
f890: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f   = {.        { O
f8a0: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20  P_Transaction,  
f8b0: 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20     0,  0,  0},  
f8c0: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
f8d0: 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69    { OP_ReadCooki
f8e0: 65 2c 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20  e,      0,  1,  
f8f0: 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20  0},    /* 1 */. 
f900: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75         { OP_Resu
f910: 6c 74 52 6f 77 2c 20 20 20 20 20 20 20 31 2c 20  ltRow,       1, 
f920: 20 31 2c 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b   1,  0}.      };
f930: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61  .      VdbeOp *a
f940: 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Op;.      sqlite
f950: 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c  3VdbeVerifyNoMal
f960: 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41  locRequired(v, A
f970: 72 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f  rraySize(readCoo
f980: 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70  kie));.      aOp
f990: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f9a0: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
f9b0: 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29  Size(readCookie)
f9c0: 2c 72 65 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a  ,readCookie,0);.
f9d0: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
f9e0: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
f9f0: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
fa00: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70  ;.      aOp[0].p
fa10: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61  1 = iDb;.      a
fa20: 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[1].p1 = iDb;.
fa30: 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20        aOp[1].p3 
fa40: 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20  = iCookie;.     
fa50: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75 73   sqlite3VdbeReus
fa60: 61 62 6c 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  able(v);.    }. 
fa70: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
fa80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
fa90: 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e  T_SCHEMA_VERSION
faa0: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
fab0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fac0: 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
fad0: 49 41 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  IAGS.  /*.  **  
fae0: 20 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f   PRAGMA compile_
faf0: 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a  options.  **.  *
fb00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
fb10: 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c  es of all compil
fb20: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75  e-time options u
fb30: 73 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c  sed in this buil
fb40: 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69  d,.  ** one opti
fb50: 6f 6e 20 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f  on per row..  */
fb60: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
fb70: 43 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a  COMPILE_OPTIONS:
fb80: 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30   {.    int i = 0
fb90: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
fba0: 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 70 50 61 72   *zOpt;.    pPar
fbb0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20  se->nMem = 1;.  
fbc0: 20 20 77 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d    while( (zOpt =
fbd0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65   sqlite3_compile
fbe0: 6f 70 74 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29  option_get(i++))
fbf0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
fc00: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
fc10: 6e 67 28 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a  ng(v, 1, zOpt);.
fc20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fc30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
fc40: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a  sultRow, 1, 1);.
fc50: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fc60: 33 56 64 62 65 52 65 75 73 61 62 6c 65 28 76 29  3VdbeReusable(v)
fc70: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  ;.  }.  break;.#
fc80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
fc90: 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
fca0: 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66  ON_DIAGS */..#if
fcb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fcc0: 5f 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  _WAL.  /*.  **  
fcd0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
fce0: 5d 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  ]wal_checkpoint 
fcf0: 3d 20 70 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72  = passive|full|r
fd00: 65 73 74 61 72 74 7c 74 72 75 6e 63 61 74 65 0a  estart|truncate.
fd10: 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70    **.  ** Checkp
fd20: 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  oint the databas
fd30: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  e..  */.  case P
fd40: 72 61 67 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b  ragTyp_WAL_CHECK
fd50: 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74  POINT: {.    int
fd60: 20 69 42 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f   iBt = (pId2->z?
fd70: 69 44 62 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41  iDb:SQLITE_MAX_A
fd80: 54 54 41 43 48 45 44 29 3b 0a 20 20 20 20 69 6e  TTACHED);.    in
fd90: 74 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  t eMode = SQLITE
fda0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
fdb0: 49 56 45 3b 0a 20 20 20 20 69 66 28 20 7a 52 69  IVE;.    if( zRi
fdc0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ght ){.      if(
fdd0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
fde0: 7a 52 69 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d  zRight, "full")=
fdf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
fe00: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45  ode = SQLITE_CHE
fe10: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20  CKPOINT_FULL;.  
fe20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
fe30: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69  lite3StrICmp(zRi
fe40: 67 68 74 2c 20 22 72 65 73 74 61 72 74 22 29 3d  ght, "restart")=
fe50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
fe60: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45  ode = SQLITE_CHE
fe70: 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b  CKPOINT_RESTART;
fe80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
fe90: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
fea0: 7a 52 69 67 68 74 2c 20 22 74 72 75 6e 63 61 74  zRight, "truncat
feb0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
fec0: 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45    eMode = SQLITE
fed0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e  _CHECKPOINT_TRUN
fee0: 43 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CATE;.      }.  
fef0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
ff00: 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71  nMem = 3;.    sq
ff10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ff20: 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  v, OP_Checkpoint
ff30: 2c 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29  , iBt, eMode, 1)
ff40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ff50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
ff60: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a  sultRow, 1, 3);.
ff70: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20    }.  break;..  
ff80: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
ff90: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
ffa0: 69 6e 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  int.  **   PRAGM
ffb0: 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  A wal_autocheckp
ffc0: 6f 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20  oint = N.  **.  
ffd0: 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 20 64  ** Configure a d
ffe0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
fff0: 6f 6e 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  on to automatica
10000 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 20 61  lly checkpoint a
10010 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
10020 66 74 65 72 20 61 63 63 75 6d 75 6c 61 74 69 6e  fter accumulatin
10030 67 20 4e 20 66 72 61 6d 65 73 20 69 6e 20 74 68  g N frames in th
10040 65 20 6c 6f 67 2e 20 4f 72 20 71 75 65 72 79 20  e log. Or query 
10050 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
10060 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e  value.  ** of N.
10070 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
10080 67 54 79 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45  gTyp_WAL_AUTOCHE
10090 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69  CKPOINT: {.    i
100a0 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
100b0 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61     sqlite3_wal_a
100c0 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  utocheckpoint(db
100d0 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  , sqlite3Atoi(zR
100e0 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ight));.    }.  
100f0 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
10100 74 28 76 2c 20 0a 20 20 20 20 20 20 20 64 62 2d  t(v, .       db-
10110 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73  >xWalCallback==s
10120 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
10130 48 6f 6f 6b 20 3f 20 0a 20 20 20 20 20 20 20 20  Hook ? .        
10140 20 20 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f     SQLITE_PTR_TO
10150 5f 49 4e 54 28 64 62 2d 3e 70 57 61 6c 41 72 67  _INT(db->pWalArg
10160 29 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72  ) : 0);.  }.  br
10170 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  eak;.#endif..  /
10180 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73  *.  **  PRAGMA s
10190 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a  hrink_memory.  *
101a0 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  *.  ** IMPLEMENT
101b0 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34  ATION-OF: R-2344
101c0 35 2d 34 36 31 30 39 20 54 68 69 73 20 70 72 61  5-46109 This pra
101d0 67 6d 61 20 63 61 75 73 65 73 20 74 68 65 20 64  gma causes the d
101e0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e  atabase.  ** con
101f0 6e 65 63 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68  nection on which
10200 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 74   it is invoked t
10210 6f 20 66 72 65 65 20 75 70 20 61 73 20 6d 75 63  o free up as muc
10220 68 20 6d 65 6d 6f 72 79 20 61 73 20 69 74 0a 20  h memory as it. 
10230 20 2a 2a 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c   ** can, by call
10240 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  ing sqlite3_db_r
10250 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e  elease_memory().
10260 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
10270 67 54 79 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f  gTyp_SHRINK_MEMO
10280 52 59 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  RY: {.    sqlite
10290 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  3_db_release_mem
102a0 6f 72 79 28 64 62 29 3b 0a 20 20 20 20 62 72 65  ory(db);.    bre
102b0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
102c0 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70 74 69 6d  **  PRAGMA optim
102d0 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ize.  **  PRAGMA
102e0 20 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a   optimize(MASK).
102f0 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68    **  PRAGMA sch
10300 65 6d 61 2e 6f 70 74 69 6d 69 7a 65 0a 20 20 2a  ema.optimize.  *
10310 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61  *  PRAGMA schema
10320 2e 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a  .optimize(MASK).
10330 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 74 65 6d 70    **.  ** Attemp
10340 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68  t to optimize th
10350 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 6c 6c  e database.  All
10360 20 73 63 68 65 6d 61 73 20 61 72 65 20 6f 70 74   schemas are opt
10370 69 6d 69 7a 65 64 20 69 6e 20 74 68 65 20 66 69  imized in the fi
10380 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 66 6f 72  rst.  ** two for
10390 6d 73 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65  ms, and only the
103a0 20 73 70 65 63 69 66 69 65 64 20 73 63 68 65 6d   specified schem
103b0 61 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 69  a is optimized i
103c0 6e 20 74 68 65 20 6c 61 74 74 65 72 20 74 77 6f  n the latter two
103d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
103e0 64 65 74 61 69 6c 73 20 6f 66 20 6f 70 74 69 6d  details of optim
103f0 69 7a 61 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  izations perform
10400 65 64 20 62 79 20 74 68 69 73 20 70 72 61 67 6d  ed by this pragm
10410 61 20 61 72 65 20 65 78 70 65 63 74 65 64 0a 20  a are expected. 
10420 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 61 6e   ** to change an
10430 64 20 69 6d 70 72 6f 76 65 20 6f 76 65 72 20 74  d improve over t
10440 69 6d 65 2e 20 20 41 70 70 6c 69 63 61 74 69 6f  ime.  Applicatio
10450 6e 73 20 73 68 6f 75 6c 64 20 61 6e 74 69 63 69  ns should antici
10460 70 61 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74  pate that.  ** t
10470 68 69 73 20 70 72 61 67 6d 61 20 77 69 6c 6c 20  his pragma will 
10480 70 65 72 66 6f 72 6d 20 6e 65 77 20 6f 70 74 69  perform new opti
10490 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 66 75 74  mizations in fut
104a0 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20  ure releases..  
104b0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 70 74 69  **.  ** The opti
104c0 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 69 73  onal argument is
104d0 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70   a bitmask of op
104e0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 70  timizations to p
104f0 65 72 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  erform:.  **.  *
10500 2a 20 20 20 20 30 78 30 30 30 31 20 20 20 20 44  *    0x0001    D
10510 65 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20  ebugging mode.  
10520 44 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  Do not actually 
10530 70 65 72 66 6f 72 6d 20 61 6e 79 20 6f 70 74 69  perform any opti
10540 6d 69 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 20  mizations.  **  
10550 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74 20              but 
10560 69 6e 73 74 65 61 64 20 72 65 74 75 72 6e 20 6f  instead return o
10570 6e 65 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20  ne line of text 
10580 66 6f 72 20 65 61 63 68 20 6f 70 74 69 6d 69 7a  for each optimiz
10590 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 20  ation.  **      
105a0 20 20 20 20 20 20 20 20 74 68 61 74 20 77 6f 75          that wou
105b0 6c 64 20 68 61 76 65 20 62 65 65 6e 20 64 6f 6e  ld have been don
105c0 65 2e 20 20 4f 66 66 20 62 79 20 64 65 66 61 75  e.  Off by defau
105d0 6c 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  lt..  **.  **   
105e0 20 30 78 30 30 30 32 20 20 20 20 52 75 6e 20 41   0x0002    Run A
105f0 4e 41 4c 59 5a 45 20 6f 6e 20 74 61 62 6c 65 73  NALYZE on tables
10600 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 6e 65   that might bene
10610 66 69 74 2e 20 20 4f 6e 20 62 79 20 64 65 66 61  fit.  On by defa
10620 75 6c 74 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20  ult..  **       
10630 20 20 20 20 20 20 20 53 65 65 20 62 65 6c 6f 77         See below
10640 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
10650 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a  information..  *
10660 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 34  *.  **    0x0004
10670 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70      (Not yet imp
10680 6c 65 6d 65 6e 74 65 64 29 20 52 65 63 6f 72 64  lemented) Record
10690 20 75 73 61 67 65 20 61 6e 64 20 70 65 72 66 6f   usage and perfo
106a0 72 6d 61 6e 63 65 20 0a 20 20 2a 2a 20 20 20 20  rmance .  **    
106b0 20 20 20 20 20 20 20 20 20 20 69 6e 66 6f 72 6d            inform
106c0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63  ation from the c
106d0 75 72 72 65 6e 74 20 73 65 73 73 69 6f 6e 20 69  urrent session i
106e0 6e 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20  n the.  **      
106f0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
10700 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74   file so that it
10710 20 77 69 6c 6c 20 62 65 20 61 76 61 69 6c 61 62   will be availab
10720 6c 65 20 74 6f 20 22 6f 70 74 69 6d 69 7a 65 22  le to "optimize"
10730 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
10740 20 20 20 70 72 61 67 6d 61 73 20 72 75 6e 20 62     pragmas run b
10750 79 20 66 75 74 75 72 65 20 64 61 74 61 62 61 73  y future databas
10760 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  e connections.. 
10770 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30   **.  **    0x00
10780 30 38 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69  08    (Not yet i
10790 6d 70 6c 65 6d 65 6e 74 65 64 29 20 43 72 65 61  mplemented) Crea
107a0 74 65 20 69 6e 64 65 78 65 73 20 74 68 61 74 20  te indexes that 
107b0 6d 69 67 68 74 20 68 61 76 65 0a 20 20 2a 2a 20  might have.  ** 
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 65               bee
107d0 6e 20 68 65 6c 70 66 75 6c 20 74 6f 20 72 65 63  n helpful to rec
107e0 65 6e 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a  ent queries.  **
107f0 0a 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  .  ** The defaul
10800 74 20 4d 41 53 4b 20 69 73 20 61 6e 64 20 61 6c  t MASK is and al
10810 77 61 79 73 20 73 68 61 6c 6c 20 62 65 20 30 78  ways shall be 0x
10820 66 66 66 65 2e 20 20 30 78 66 66 66 65 20 6d 65  fffe.  0xfffe me
10830 61 6e 73 20 70 65 72 66 6f 72 6d 20 61 6c 6c 0a  ans perform all.
10840 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74 69    ** of the opti
10850 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 73 74 65 64  mizations listed
10860 20 61 62 6f 76 65 20 65 78 63 65 70 74 20 44 65   above except De
10870 62 75 67 20 4d 6f 64 65 2c 20 69 6e 63 6c 75 64  bug Mode, includ
10880 69 6e 67 20 6e 65 77 0a 20 20 2a 2a 20 6f 70 74  ing new.  ** opt
10890 69 6d 69 7a 61 74 69 6f 6e 73 20 74 68 61 74 20  imizations that 
108a0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
108b0 6e 20 69 6e 76 65 6e 74 65 64 2e 20 20 49 66 20  n invented.  If 
108c0 6e 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  new optimization
108d0 73 20 61 72 65 0a 20 20 2a 2a 20 65 76 65 72 20  s are.  ** ever 
108e0 61 64 64 65 64 20 74 68 61 74 20 73 68 6f 75 6c  added that shoul
108f0 64 20 62 65 20 6f 66 66 20 62 79 20 64 65 66 61  d be off by defa
10900 75 6c 74 2c 20 74 68 6f 73 65 20 6f 66 66 2d 62  ult, those off-b
10910 79 2d 64 65 66 61 75 6c 74 20 0a 20 20 2a 2a 20  y-default .  ** 
10920 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 69  optimizations wi
10930 6c 6c 20 68 61 76 65 20 62 69 74 6d 61 73 6b 73  ll have bitmasks
10940 20 6f 66 20 30 78 31 30 30 30 30 20 6f 72 20 6c   of 0x10000 or l
10950 61 72 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  arger..  **.  **
10960 20 44 45 54 45 52 4d 49 4e 41 54 49 4f 4e 20 4f   DETERMINATION O
10970 46 20 57 48 45 4e 20 54 4f 20 52 55 4e 20 41 4e  F WHEN TO RUN AN
10980 41 4c 59 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ALYZE.  **.  ** 
10990 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
109a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61  mplementation, a
109b0 20 74 61 62 6c 65 20 69 73 20 61 6e 61 6c 79 7a   table is analyz
109c0 65 64 20 69 66 20 6f 6e 6c 79 20 69 66 20 61 6c  ed if only if al
109d0 6c 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 6f  l of.  ** the fo
109e0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
109f0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 29 20  :.  **.  ** (1) 
10a00 4d 41 53 4b 20 62 69 74 20 30 78 30 32 20 69 73  MASK bit 0x02 is
10a10 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   set..  **.  ** 
10a20 28 32 29 20 54 68 65 20 71 75 65 72 79 20 70 6c  (2) The query pl
10a30 61 6e 6e 65 72 20 75 73 65 64 20 73 71 6c 69 74  anner used sqlit
10a40 65 5f 73 74 61 74 31 2d 73 74 79 6c 65 20 73 74  e_stat1-style st
10a50 61 74 69 73 74 69 63 73 20 66 6f 72 20 6f 6e 65  atistics for one
10a60 20 6f 72 0a 20 20 2a 2a 20 20 20 20 20 6d 6f 72   or.  **     mor
10a70 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 68 65  e indexes of the
10a80 20 74 61 62 6c 65 20 61 74 20 73 6f 6d 65 20 70   table at some p
10a90 6f 69 6e 74 20 64 75 72 69 6e 67 20 74 68 65 20  oint during the 
10aa0 6c 69 66 65 74 69 6d 65 20 6f 66 0a 20 20 2a 2a  lifetime of.  **
10ab0 20 20 20 20 20 74 68 65 20 63 75 72 72 65 6e 74       the current
10ac0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
10ad0 2a 0a 20 20 2a 2a 20 28 33 29 20 4f 6e 65 20 6f  *.  ** (3) One o
10ae0 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 6f  r more indexes o
10af0 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  f the table are 
10b00 63 75 72 72 65 6e 74 6c 79 20 75 6e 61 6e 61 6c  currently unanal
10b10 79 7a 65 64 20 4f 52 0a 20 20 2a 2a 20 20 20 20  yzed OR.  **    
10b20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
10b30 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
10b40 20 68 61 73 20 69 6e 63 72 65 61 73 65 64 20 62   has increased b
10b50 79 20 32 35 20 74 69 6d 65 73 20 6f 72 20 6d 6f  y 25 times or mo
10b60 72 65 0a 20 20 2a 2a 20 20 20 20 20 73 69 6e 63  re.  **     sinc
10b70 65 20 74 68 65 20 6c 61 73 74 20 74 69 6d 65 20  e the last time 
10b80 41 4e 41 4c 59 5a 45 20 77 61 73 20 72 75 6e 2e  ANALYZE was run.
10b90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
10ba0 75 6c 65 73 20 66 6f 72 20 77 68 65 6e 20 74 61  ules for when ta
10bb0 62 6c 65 73 20 61 72 65 20 61 6e 61 6c 79 7a 65  bles are analyze
10bc0 64 20 61 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20  d are likely to 
10bd0 63 68 61 6e 67 65 20 69 6e 0a 20 20 2a 2a 20 66  change in.  ** f
10be0 75 74 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a  uture releases..
10bf0 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
10c00 54 79 70 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b 0a  Typ_OPTIMIZE: {.
10c10 20 20 20 20 69 6e 74 20 69 44 62 4c 61 73 74 3b      int iDbLast;
10c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
10c30 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 70  op termination p
10c40 6f 69 6e 74 20 66 6f 72 20 74 68 65 20 73 63 68  oint for the sch
10c50 65 6d 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  ema loop */.    
10c60 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20  int iTabCur;    
10c70 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
10c80 20 66 6f 72 20 61 20 74 61 62 6c 65 20 77 68 6f   for a table who
10c90 73 65 20 73 69 7a 65 20 6e 65 65 64 73 20 63 68  se size needs ch
10ca0 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 48 61  ecking */.    Ha
10cb0 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
10cc0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65       /* Loop ove
10cd0 72 20 74 61 62 6c 65 73 20 6f 66 20 61 20 73 63  r tables of a sc
10ce0 68 65 6d 61 20 2a 2f 0a 20 20 20 20 53 63 68 65  hema */.    Sche
10cf0 6d 61 20 2a 70 53 63 68 65 6d 61 3b 20 20 20 20  ma *pSchema;    
10d00 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
10d10 74 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20  t schema */.    
10d20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
10d30 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
10d40 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  e in the schema 
10d50 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
10d60 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dx;           /*
10d70 20 41 6e 20 69 6e 64 65 78 20 6f 66 20 74 68 65   An index of the
10d80 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4c 6f   table */.    Lo
10d90 67 45 73 74 20 73 7a 54 68 72 65 73 68 6f 6c 64  gEst szThreshold
10da0 3b 20 20 20 20 2f 2a 20 53 69 7a 65 20 74 68 72  ;    /* Size thr
10db0 65 73 68 6f 6c 64 20 61 62 6f 76 65 20 77 68 69  eshold above whi
10dc0 63 68 20 72 65 61 6e 61 6c 79 73 69 73 20 69 73  ch reanalysis is
10dd0 20 6e 65 65 64 64 20 2a 2f 0a 20 20 20 20 63 68   needd */.    ch
10de0 61 72 20 2a 7a 53 75 62 53 71 6c 3b 20 20 20 20  ar *zSubSql;    
10df0 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74       /* SQL stat
10e00 65 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 4f 50  ement for the OP
10e10 5f 53 71 6c 45 78 65 63 20 6f 70 63 6f 64 65 20  _SqlExec opcode 
10e20 2a 2f 0a 20 20 20 20 75 33 32 20 6f 70 4d 61 73  */.    u32 opMas
10e30 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
10e40 20 4d 61 73 6b 20 6f 66 20 6f 70 65 72 61 74 69   Mask of operati
10e50 6f 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a  ons to perform *
10e60 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  /..    if( zRigh
10e70 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73  t ){.      opMas
10e80 6b 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33  k = (u32)sqlite3
10e90 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  Atoi(zRight);.  
10ea0 20 20 20 20 69 66 28 20 28 6f 70 4d 61 73 6b 20      if( (opMask 
10eb0 26 20 30 78 30 32 29 3d 3d 30 20 29 20 62 72 65  & 0x02)==0 ) bre
10ec0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
10ed0 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 30 78       opMask = 0x
10ee0 66 66 66 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fffe;.    }.    
10ef0 69 54 61 62 43 75 72 20 3d 20 70 50 61 72 73 65  iTabCur = pParse
10f00 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 66 6f  ->nTab++;.    fo
10f10 72 28 69 44 62 4c 61 73 74 20 3d 20 7a 44 62 3f  r(iDbLast = zDb?
10f20 69 44 62 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20 69  iDb:db->nDb-1; i
10f30 44 62 3c 3d 69 44 62 4c 61 73 74 3b 20 69 44 62  Db<=iDbLast; iDb
10f40 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ++){.      if( i
10f50 44 62 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65  Db==1 ) continue
10f60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
10f70 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
10f80 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
10f90 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 64 62      pSchema = db
10fa0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
10fb0 6d 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  ma;.      for(k=
10fc0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
10fd0 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
10fe0 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  h); k; k=sqliteH
10ff0 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
11000 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
11010 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
11020 74 61 28 6b 29 3b 0a 0a 20 20 20 20 20 20 20 20  ta(k);..        
11030 2f 2a 20 49 66 20 74 61 62 6c 65 20 70 54 61 62  /* If table pTab
11040 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 75 73   has not been us
11050 65 64 20 69 6e 20 61 20 77 61 79 20 74 68 61 74  ed in a way that
11060 20 77 6f 75 6c 64 20 62 65 6e 65 66 69 74 20 66   would benefit f
11070 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  rom.        ** h
11080 61 76 69 6e 67 20 61 6e 61 6c 79 73 69 73 20 73  aving analysis s
11090 74 61 74 69 73 74 69 63 73 20 64 75 72 69 6e 67  tatistics during
110a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 73   the current ses
110b0 73 69 6f 6e 2c 20 74 68 65 6e 20 73 6b 69 70 20  sion, then skip 
110c0 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  it..        ** T
110d0 68 69 73 20 61 6c 73 6f 20 68 61 73 20 74 68 65  his also has the
110e0 20 65 66 66 65 63 74 20 6f 66 20 73 6b 69 70 70   effect of skipp
110f0 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ing virtual tabl
11100 65 73 20 61 6e 64 20 76 69 65 77 73 20 2a 2f 0a  es and views */.
11110 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 61          if( (pTa
11120 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
11130 5f 53 74 61 74 73 55 73 65 64 29 3d 3d 30 20 29  _StatsUsed)==0 )
11140 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
11150 20 20 20 20 2f 2a 20 52 65 61 6e 61 6c 79 7a 65      /* Reanalyze
11160 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
11170 20 32 35 20 74 69 6d 65 73 20 6c 61 72 67 65 72   25 times larger
11180 20 74 68 61 6e 20 74 68 65 20 6c 61 73 74 20 61   than the last a
11190 6e 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20 20  nalysis */.     
111a0 20 20 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d     szThreshold =
111b0 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
111c0 74 20 2b 20 34 36 3b 20 61 73 73 65 72 74 28 20  t + 46; assert( 
111d0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35  sqlite3LogEst(25
111e0 29 3d 3d 34 36 20 29 3b 0a 20 20 20 20 20 20 20  )==46 );.       
111f0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
11200 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
11210 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
11220 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
11230 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29  pIdx->hasStat1 )
11240 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
11250 54 68 72 65 73 68 6f 6c 64 20 3d 20 30 3b 20 2f  Threshold = 0; /
11260 2a 20 41 6c 77 61 79 73 20 61 6e 61 6c 79 7a 65  * Always analyze
11270 20 69 66 20 61 6e 79 20 69 6e 64 65 78 20 6c 61   if any index la
11280 63 6b 73 20 73 74 61 74 69 73 74 69 63 73 20 2a  cks statistics *
11290 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  /.            br
112a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
112b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
112c0 20 20 20 69 66 28 20 73 7a 54 68 72 65 73 68 6f     if( szThresho
112d0 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ld ){.          
112e0 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
112f0 28 70 50 61 72 73 65 2c 20 69 54 61 62 43 75 72  (pParse, iTabCur
11300 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
11310 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
11320 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11330 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 53  AddOp3(v, OP_IfS
11340 6d 61 6c 6c 65 72 2c 20 69 54 61 62 43 75 72 2c  maller, iTabCur,
11350 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11360 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
11370 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
11380 72 28 76 29 2b 32 2b 28 6f 70 4d 61 73 6b 26 31  r(v)+2+(opMask&1
11390 29 2c 20 73 7a 54 68 72 65 73 68 6f 6c 64 29 3b  ), szThreshold);
113a0 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
113b0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
113c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53      }.        zS
113d0 75 62 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d  ubSql = sqlite3M
113e0 50 72 69 6e 74 66 28 64 62 2c 20 22 41 4e 41 4c  Printf(db, "ANAL
113f0 59 5a 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c  YZE \"%w\".\"%w\
11400 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "",.            
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
11430 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62  ].zDbSName, pTab
11440 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
11450 20 20 69 66 28 20 6f 70 4d 61 73 6b 20 26 20 30    if( opMask & 0
11460 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  x01 ){.         
11470 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
11480 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
11490 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
114a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
114b0 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
114c0 30 2c 20 72 31 2c 20 30 2c 20 7a 53 75 62 53 71  0, r1, 0, zSubSq
114d0 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  l, P4_DYNAMIC);.
114e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
114f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11500 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 31 2c  P_ResultRow, r1,
11510 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   1);.        }el
11520 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
11530 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
11540 76 2c 20 4f 50 5f 53 71 6c 45 78 65 63 2c 20 30  v, OP_SqlExec, 0
11550 2c 20 30 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c  , 0, 0, zSubSql,
11560 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
11570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11580 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11590 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
115a0 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20 62  P_Expire);.    b
115b0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
115c0 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75    **   PRAGMA bu
115d0 73 79 5f 74 69 6d 65 6f 75 74 0a 20 20 2a 2a 20  sy_timeout.  ** 
115e0 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f 74 69    PRAGMA busy_ti
115f0 6d 65 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20  meout = N.  **. 
11600 20 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33   ** Call sqlite3
11610 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62  _busy_timeout(db
11620 2c 20 4e 29 2e 20 20 52 65 74 75 72 6e 20 74 68  , N).  Return th
11630 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 6f 75  e current timeou
11640 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 66 20  t value.  ** if 
11650 6f 6e 65 20 69 73 20 73 65 74 2e 20 20 49 66 20  one is set.  If 
11660 6e 6f 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  no busy handler 
11670 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20 62  or a different b
11680 75 73 79 20 68 61 6e 64 6c 65 72 20 69 73 20 73  usy handler is s
11690 65 74 0a 20 20 2a 2a 20 74 68 65 6e 20 30 20 69  et.  ** then 0 i
116a0 73 20 72 65 74 75 72 6e 65 64 2e 20 20 53 65 74  s returned.  Set
116b0 74 69 6e 67 20 74 68 65 20 62 75 73 79 5f 74 69  ting the busy_ti
116c0 6d 65 6f 75 74 20 74 6f 20 30 20 6f 72 20 6e 65  meout to 0 or ne
116d0 67 61 74 69 76 65 0a 20 20 2a 2a 20 64 69 73 61  gative.  ** disa
116e0 62 6c 65 73 20 74 68 65 20 74 69 6d 65 6f 75 74  bles the timeout
116f0 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61 73 65 20  ..  */.  /*case 
11700 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d  PragTyp_BUSY_TIM
11710 45 4f 55 54 2a 2f 20 64 65 66 61 75 6c 74 3a 20  EOUT*/ default: 
11720 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
11730 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 3d  ragma->ePragTyp=
11740 3d 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49  =PragTyp_BUSY_TI
11750 4d 45 4f 55 54 20 29 3b 0a 20 20 20 20 69 66 28  MEOUT );.    if(
11760 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
11770 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
11780 6d 65 6f 75 74 28 64 62 2c 20 73 71 6c 69 74 65  meout(db, sqlite
11790 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a  3Atoi(zRight));.
117a0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
117b0 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d  SingleInt(v, db-
117c0 3e 62 75 73 79 54 69 6d 65 6f 75 74 29 3b 0a 20  >busyTimeout);. 
117d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
117e0 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
117f0 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  A soft_heap_limi
11800 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  t.  **   PRAGMA 
11810 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20  soft_heap_limit 
11820 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d  = N.  **.  ** IM
11830 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
11840 20 52 2d 32 36 33 34 33 2d 34 35 39 33 30 20 54   R-26343-45930 T
11850 68 69 73 20 70 72 61 67 6d 61 20 69 6e 76 6f 6b  his pragma invok
11860 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  es the.  ** sqli
11870 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  te3_soft_heap_li
11880 6d 69 74 36 34 28 29 20 69 6e 74 65 72 66 61 63  mit64() interfac
11890 65 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d  e with the argum
118a0 65 6e 74 20 4e 2c 20 69 66 20 4e 20 69 73 0a 20  ent N, if N is. 
118b0 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 6e   ** specified an
118c0 64 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  d is a non-negat
118d0 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a  ive integer..  *
118e0 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
118f0 2d 4f 46 3a 20 52 2d 36 34 34 35 31 2d 30 37 31  -OF: R-64451-071
11900 36 33 20 54 68 65 20 73 6f 66 74 5f 68 65 61 70  63 The soft_heap
11910 5f 6c 69 6d 69 74 20 70 72 61 67 6d 61 20 61 6c  _limit pragma al
11920 77 61 79 73 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ways.  ** return
11930 73 20 74 68 65 20 73 61 6d 65 20 69 6e 74 65 67  s the same integ
11940 65 72 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65  er that would be
11950 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
11960 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f  .  ** sqlite3_so
11970 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
11980 2d 31 29 20 43 2d 6c 61 6e 67 75 61 67 65 20 66  -1) C-language f
11990 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
119a0 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 4f 46  case PragTyp_SOF
119b0 54 5f 48 45 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a  T_HEAP_LIMIT: {.
119c0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
119d0 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52 69  4 N;.    if( zRi
119e0 67 68 74 20 26 26 20 73 71 6c 69 74 65 33 44 65  ght && sqlite3De
119f0 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67  cOrHexToI64(zRig
11a00 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f  ht, &N)==SQLITE_
11a10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
11a20 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  te3_soft_heap_li
11a30 6d 69 74 36 34 28 4e 29 3b 0a 20 20 20 20 7d 0a  mit64(N);.    }.
11a40 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
11a50 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 73  Int(v, sqlite3_s
11a60 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34  oft_heap_limit64
11a70 28 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  (-1));.    break
11a80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
11a90 20 20 20 50 52 41 47 4d 41 20 74 68 72 65 61 64     PRAGMA thread
11aa0 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  s.  **   PRAGMA 
11ab0 74 68 72 65 61 64 73 20 3d 20 4e 0a 20 20 2a 2a  threads = N.  **
11ac0 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  .  ** Configure 
11ad0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
11ae0 65 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72  er of worker thr
11af0 65 61 64 73 2e 20 20 52 65 74 75 72 6e 20 74 68  eads.  Return th
11b00 65 20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78 69 6d  e new.  ** maxim
11b10 75 6d 2c 20 77 68 69 63 68 20 6d 69 67 68 74 20  um, which might 
11b20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 72 65 71  be less than req
11b30 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  uested..  */.  c
11b40 61 73 65 20 50 72 61 67 54 79 70 5f 54 48 52 45  ase PragTyp_THRE
11b50 41 44 53 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  ADS: {.    sqlit
11b60 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20  e3_int64 N;.    
11b70 69 66 28 20 7a 52 69 67 68 74 0a 20 20 20 20 20  if( zRight.     
11b80 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48  && sqlite3DecOrH
11b90 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20  exToI64(zRight, 
11ba0 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  &N)==SQLITE_OK. 
11bb0 20 20 20 20 26 26 20 4e 3e 3d 30 0a 20 20 20 20      && N>=0.    
11bc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11bd0 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54  _limit(db, SQLIT
11be0 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
11bf0 48 52 45 41 44 53 2c 20 28 69 6e 74 29 28 4e 26  HREADS, (int)(N&
11c00 30 78 37 66 66 66 66 66 66 66 29 29 3b 0a 20 20  0x7fffffff));.  
11c10 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
11c20 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74  ngleInt(v, sqlit
11c30 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c  e3_limit(db, SQL
11c40 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
11c50 5f 54 48 52 45 41 44 53 2c 20 2d 31 29 29 3b 0a  _THREADS, -1));.
11c60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
11c70 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
11c80 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
11c90 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
11ca0 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f  ).  /*.  ** Repo
11cb0 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  rt the current s
11cc0 74 61 74 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67  tate of file log
11cd0 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  s for all databa
11ce0 73 65 73 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ses.  */.  case 
11cf0 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 53 54 41  PragTyp_LOCK_STA
11d00 54 55 53 3a 20 7b 0a 20 20 20 20 73 74 61 74 69  TUS: {.    stati
11d10 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
11d20 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d  nst azLockName[]
11d30 20 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e 6c 6f   = {.      "unlo
11d40 63 6b 65 64 22 2c 20 22 73 68 61 72 65 64 22 2c  cked", "shared",
11d50 20 22 72 65 73 65 72 76 65 64 22 2c 20 22 70 65   "reserved", "pe
11d60 6e 64 69 6e 67 22 2c 20 22 65 78 63 6c 75 73 69  nding", "exclusi
11d70 76 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69  ve".    };.    i
11d80 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65  nt i;.    pParse
11d90 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20  ->nMem = 2;.    
11da0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
11db0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
11dc0 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20  Btree *pBt;.    
11dd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
11de0 74 61 74 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  tate = "unknown"
11df0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
11e00 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62       if( db->aDb
11e10 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30 20  [i].zDbSName==0 
11e20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11e30 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b    pBt = db->aDb[
11e40 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
11e50 28 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  ( pBt==0 || sqli
11e60 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
11e70 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
11e80 20 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f 73 65   zState = "close
11e90 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  d";.      }else 
11ea0 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  if( sqlite3_file
11eb0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69 20 3f  _control(db, i ?
11ec0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53   db->aDb[i].zDbS
11ed0 4e 61 6d 65 20 3a 20 30 2c 20 0a 20 20 20 20 20  Name : 0, .     
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
11f10 4b 53 54 41 54 45 2c 20 26 6a 29 3d 3d 53 51 4c  KSTATE, &j)==SQL
11f20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11f30 20 20 20 7a 53 74 61 74 65 20 3d 20 61 7a 4c 6f     zState = azLo
11f40 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20  ckName[j];.     
11f50 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
11f60 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
11f70 20 31 2c 20 22 73 73 22 2c 20 64 62 2d 3e 61 44   1, "ss", db->aD
11f80 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a  b[i].zDbSName, z
11f90 53 74 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  State);.    }.  
11fa0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
11fb0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
11fc0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f  TE_HAS_CODEC.  /
11fd0 2a 20 50 72 61 67 6d 61 20 20 20 20 20 20 20 20  * Pragma        
11fe0 69 41 72 67 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d  iArg.  ** ------
11ff0 2d 2d 2d 2d 20 20 20 2d 2d 2d 2d 2d 2d 0a 20 20  ----   ------.  
12000 2a 2a 20 20 6b 65 79 20 20 20 20 20 20 20 20 20  **  key         
12010 20 20 30 0a 20 20 2a 2a 20 20 72 65 6b 65 79 20    0.  **  rekey 
12020 20 20 20 20 20 20 20 20 31 0a 20 20 2a 2a 20 20          1.  **  
12030 68 65 78 6b 65 79 20 20 20 20 20 20 20 20 32 0a  hexkey        2.
12040 20 20 2a 2a 20 20 68 65 78 72 65 6b 65 79 20 20    **  hexrekey  
12050 20 20 20 20 33 0a 20 20 2a 2a 20 20 74 65 78 74      3.  **  text
12060 6b 65 79 20 20 20 20 20 20 20 34 0a 20 20 2a 2a  key       4.  **
12070 20 20 74 65 78 74 72 65 6b 65 79 20 20 20 20 20    textrekey     
12080 35 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  5.  */.  case Pr
12090 61 67 54 79 70 5f 4b 45 59 3a 20 7b 0a 20 20 20  agTyp_KEY: {.   
120a0 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
120b0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72       int n = pPr
120c0 61 67 6d 61 2d 3e 69 41 72 67 3c 34 20 3f 20 73  agma->iArg<4 ? s
120d0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
120e0 52 69 67 68 74 29 20 3a 20 2d 31 3b 0a 20 20 20  Right) : -1;.   
120f0 20 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d     if( (pPragma-
12100 3e 69 41 72 67 20 26 20 31 29 3d 3d 30 20 29 7b  >iArg & 1)==0 ){
12110 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12120 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  _key_v2(db, zDb,
12130 20 7a 52 69 67 68 74 2c 20 6e 29 3b 0a 20 20 20   zRight, n);.   
12140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12150 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f    sqlite3_rekey_
12160 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67  v2(db, zDb, zRig
12170 68 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ht, n);.      }.
12180 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
12190 0a 20 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67  .  }.  case Prag
121a0 54 79 70 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20  Typ_HEXKEY: {.  
121b0 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
121c0 20 20 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a        u8 iByte;.
121d0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
121e0 20 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d     char zKey[40]
121f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
12200 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65   iByte=0; i<size
12210 6f 66 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71  of(zKey)*2 && sq
12220 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 52  lite3Isxdigit(zR
12230 69 67 68 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a  ight[i]); i++){.
12240 20 20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20          iByte = 
12250 28 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c  (iByte<<4) + sql
12260 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 52 69  ite3HexToInt(zRi
12270 67 68 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ght[i]);.       
12280 20 69 66 28 20 28 69 26 31 29 21 3d 30 20 29 20   if( (i&1)!=0 ) 
12290 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74  zKey[i/2] = iByt
122a0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
122b0 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 69   if( (pPragma->i
122c0 41 72 67 20 26 20 31 29 3d 3d 30 20 29 7b 0a 20  Arg & 1)==0 ){. 
122d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b         sqlite3_k
122e0 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
122f0 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20  Key, i/2);.     
12300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12310 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32  sqlite3_rekey_v2
12320 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20  (db, zDb, zKey, 
12330 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  i/2);.      }.  
12340 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
12350 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
12360 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
12370 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e  _CODEC) || defin
12380 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
12390 5f 43 45 52 4f 44 29 0a 20 20 63 61 73 65 20 50  _CEROD).  case P
123a0 72 61 67 54 79 70 5f 41 43 54 49 56 41 54 45 5f  ragTyp_ACTIVATE_
123b0 45 58 54 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20  EXTENSIONS: if( 
123c0 7a 52 69 67 68 74 20 29 7b 0a 23 69 66 64 65 66  zRight ){.#ifdef
123d0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
123e0 43 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  C.    if( sqlite
123f0 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74  3StrNICmp(zRight
12400 2c 20 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20  , "see-", 4)==0 
12410 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12420 5f 61 63 74 69 76 61 74 65 5f 73 65 65 28 26 7a  _activate_see(&z
12430 52 69 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d  Right[4]);.    }
12440 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
12450 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52  QLITE_ENABLE_CER
12460 4f 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  OD.    if( sqlit
12470 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68  e3StrNICmp(zRigh
12480 74 2c 20 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d  t, "cerod-", 6)=
12490 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
124a0 74 65 33 5f 61 63 74 69 76 61 74 65 5f 63 65 72  te3_activate_cer
124b0 6f 64 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a  od(&zRight[6]);.
124c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
124d0 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
124e0 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20  ..  } /* End of 
124f0 74 68 65 20 50 52 41 47 4d 41 20 73 77 69 74 63  the PRAGMA switc
12500 68 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66  h */..  /* The f
12510 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 69  ollowing block i
12520 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
12530 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
12540 20 64 65 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e   defined. Its on
12550 6c 79 0a 20 20 2a 2a 20 70 75 72 70 6f 73 65 20  ly.  ** purpose 
12560 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 61 73  is to execute as
12570 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
12580 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
12590 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 50 72 61   if the.  ** Pra
125a0 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 20  gFlg_NoColumns1 
125b0 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
125c0 74 68 65 20 63 61 6c 6c 65 72 20 73 70 65 63 69  the caller speci
125d0 66 69 65 64 20 61 6e 20 61 72 67 75 6d 65 6e 74  fied an argument
125e0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 50 52 41  .  ** to the PRA
125f0 47 4d 41 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65  GMA, the impleme
12600 6e 74 61 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20  ntation has not 
12610 61 64 64 65 64 20 61 6e 79 20 4f 50 5f 52 65 73  added any OP_Res
12620 75 6c 74 52 6f 77 20 0a 20 20 2a 2a 20 69 6e 73  ultRow .  ** ins
12630 74 72 75 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  tructions to the
12640 20 56 4d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28   VM.  */.  if( (
12650 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
12660 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f  g & PragFlg_NoCo
12670 6c 75 6d 6e 73 31 29 20 26 26 20 7a 52 69 67 68  lumns1) && zRigh
12680 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
12690 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75  VdbeVerifyNoResu
126a0 6c 74 52 6f 77 28 76 29 3b 0a 20 20 7d 0a 0a 70  ltRow(v);.  }..p
126b0 72 61 67 6d 61 5f 6f 75 74 3a 0a 20 20 73 71 6c  ragma_out:.  sql
126c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
126d0 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Left);.  sqlite3
126e0 44 62 46 72 65 65 28 64 62 2c 20 7a 52 69 67 68  DbFree(db, zRigh
126f0 74 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51  t);.}.#ifndef SQ
12700 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12710 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  LTABLE./********
12720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12760 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  *****.** Impleme
12770 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 70  ntation of an ep
12780 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20  onymous virtual 
12790 74 61 62 6c 65 20 74 68 61 74 20 72 75 6e 73 20  table that runs 
127a0 61 20 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f 0a  a pragma..**.*/.
127b0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
127c0 72 61 67 6d 61 56 74 61 62 20 50 72 61 67 6d 61  ragmaVtab Pragma
127d0 56 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74  Vtab;.typedef st
127e0 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 43  ruct PragmaVtabC
127f0 75 72 73 6f 72 20 50 72 61 67 6d 61 56 74 61 62  ursor PragmaVtab
12800 43 75 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 50  Cursor;.struct P
12810 72 61 67 6d 61 56 74 61 62 20 7b 0a 20 20 73 71  ragmaVtab {.  sq
12820 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b  lite3_vtab base;
12830 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
12840 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20  class.  Must be 
12850 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74  first */.  sqlit
12860 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
12870 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
12880 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12890 74 6f 20 77 68 69 63 68 20 69 74 20 62 65 6c 6f  to which it belo
128a0 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 50  ngs */.  const P
128b0 72 61 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65  ragmaName *pName
128c0 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
128d0 65 20 70 72 61 67 6d 61 20 2a 2f 0a 20 20 75 38  e pragma */.  u8
128e0 20 6e 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20   nHidden;       
128f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12900 72 20 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c 75  r of hidden colu
12910 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 48 69 64  mns */.  u8 iHid
12920 64 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  den;            
12930 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
12940 68 65 20 66 69 72 73 74 20 68 69 64 64 65 6e 20  he first hidden 
12950 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74 72  column */.};.str
12960 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 43 75  uct PragmaVtabCu
12970 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  rsor {.  sqlite3
12980 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73  _vtab_cursor bas
12990 65 3b 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73  e; /* Base class
129a0 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  .  Must be first
129b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
129c0 6d 74 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 20  mt *pPragma;    
129d0 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 73 74  /* The pragma st
129e0 61 74 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a  atement to run *
129f0 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
12a00 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a   iRowid;      /*
12a10 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a   Current rowid *
12a20 2f 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b  /.  char *azArg[
12a30 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2];           /*
12a40 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 61 72   Value of the ar
12a50 67 75 6d 65 6e 74 20 61 6e 64 20 73 63 68 65 6d  gument and schem
12a60 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  a */.};../* .** 
12a70 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  Pragma virtual t
12a80 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e  able module xCon
12a90 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  nect method..*/.
12aa0 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
12ab0 61 56 74 61 62 43 6f 6e 6e 65 63 74 28 0a 20 20  aVtabConnect(.  
12ac0 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
12ad0 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
12ae0 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
12af0 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
12b00 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
12b10 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVtab,.  char *
12b20 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 63 6f 6e 73  *pzErr.){.  cons
12b30 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50  t PragmaName *pP
12b40 72 61 67 6d 61 20 3d 20 28 63 6f 6e 73 74 20 50  ragma = (const P
12b50 72 61 67 6d 61 4e 61 6d 65 2a 29 70 41 75 78 3b  ragmaName*)pAux;
12b60 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70  .  PragmaVtab *p
12b70 54 61 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Tab = 0;.  int r
12b80 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  c;.  int i, j;. 
12b90 20 63 68 61 72 20 63 53 65 70 20 3d 20 27 28 27   char cSep = '('
12ba0 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63  ;.  StrAccum acc
12bb0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30  ;.  char zBuf[20
12bc0 30 5d 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  0];..  UNUSED_PA
12bd0 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
12be0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12bf0 52 28 61 72 67 76 29 3b 0a 20 20 73 71 6c 69 74  R(argv);.  sqlit
12c00 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
12c10 61 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69  acc, 0, zBuf, si
12c20 7a 65 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a  zeof(zBuf), 0);.
12c30 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
12c40 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 22 43  pendall(&acc, "C
12c50 52 45 41 54 45 20 54 41 42 4c 45 20 78 22 29 3b  REATE TABLE x");
12c60 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 50  .  for(i=0, j=pP
12c70 72 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e 61 6d  ragma->iPragCNam
12c80 65 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e 6e 50  e; i<pPragma->nP
12c90 72 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20 6a  ragCName; i++, j
12ca0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
12cb0 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63  _str_appendf(&ac
12cc0 63 2c 20 22 25 63 5c 22 25 73 5c 22 22 2c 20 63  c, "%c\"%s\"", c
12cd0 53 65 70 2c 20 70 72 61 67 43 4e 61 6d 65 5b 6a  Sep, pragCName[j
12ce0 5d 29 3b 0a 20 20 20 20 63 53 65 70 20 3d 20 27  ]);.    cSep = '
12cf0 2c 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d  ,';.  }.  if( i=
12d00 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
12d10 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61  3_str_appendf(&a
12d20 63 63 2c 20 22 28 5c 22 25 73 5c 22 22 2c 20 70  cc, "(\"%s\"", p
12d30 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b 0a  Pragma->zName);.
12d40 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6a      i++;.  }.  j
12d50 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 72 61   = 0;.  if( pPra
12d60 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
12d70 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 20  PragFlg_Result1 
12d80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
12d90 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63  tr_appendall(&ac
12da0 63 2c 20 22 2c 61 72 67 20 48 49 44 44 45 4e 22  c, ",arg HIDDEN"
12db0 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  );.    j++;.  }.
12dc0 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d    if( pPragma->m
12dd0 50 72 61 67 46 6c 67 20 26 20 28 50 72 61 67 46  PragFlg & (PragF
12de0 6c 67 5f 53 63 68 65 6d 61 4f 70 74 7c 50 72 61  lg_SchemaOpt|Pra
12df0 67 46 6c 67 5f 53 63 68 65 6d 61 52 65 71 29 20  gFlg_SchemaReq) 
12e00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
12e10 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63  tr_appendall(&ac
12e20 63 2c 20 22 2c 73 63 68 65 6d 61 20 48 49 44 44  c, ",schema HIDD
12e30 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20  EN");.    j++;. 
12e40 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72   }.  sqlite3_str
12e50 5f 61 70 70 65 6e 64 28 26 61 63 63 2c 20 22 29  _append(&acc, ")
12e60 22 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 1);.  sqlite3
12e70 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
12e80 61 63 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20  acc);.  assert( 
12e90 73 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20 73  strlen(zBuf) < s
12ea0 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b  izeof(zBuf)-1 );
12eb0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
12ec0 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c  declare_vtab(db,
12ed0 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63   zBuf);.  if( rc
12ee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12ef0 20 20 20 70 54 61 62 20 3d 20 28 50 72 61 67 6d     pTab = (Pragm
12f00 61 56 74 61 62 2a 29 73 71 6c 69 74 65 33 5f 6d  aVtab*)sqlite3_m
12f10 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72 61  alloc(sizeof(Pra
12f20 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20 69  gmaVtab));.    i
12f30 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
12f40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12f50 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
12f60 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
12f70 54 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  Tab, 0, sizeof(P
12f80 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20  ragmaVtab));.   
12f90 20 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20 3d     pTab->pName =
12fa0 20 70 50 72 61 67 6d 61 3b 0a 20 20 20 20 20 20   pPragma;.      
12fb0 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  pTab->db = db;. 
12fc0 20 20 20 20 20 70 54 61 62 2d 3e 69 48 69 64 64       pTab->iHidd
12fd0 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 54  en = i;.      pT
12fe0 61 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a 3b  ab->nHidden = j;
12ff0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
13000 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
13010 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
13020 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
13030 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2a  g(db));.  }..  *
13040 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65  ppVtab = (sqlite
13050 33 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20  3_vtab*)pTab;.  
13060 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13070 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74   .** Pragma virt
13080 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
13090 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74   xDisconnect met
130a0 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
130b0 6e 74 20 70 72 61 67 6d 61 56 74 61 62 44 69 73  nt pragmaVtabDis
130c0 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f  connect(sqlite3_
130d0 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
130e0 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62  PragmaVtab *pTab
130f0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29   = (PragmaVtab*)
13100 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  pVtab;.  sqlite3
13110 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20 72  _free(pTab);.  r
13120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13130 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f 75  .}../* Figure ou
13140 74 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  t the best index
13150 20 74 6f 20 75 73 65 20 74 6f 20 73 65 61 72 63   to use to searc
13160 68 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75  h a pragma virtu
13170 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
13180 54 68 65 72 65 20 61 72 65 20 6e 6f 74 20 72 65  There are not re
13190 61 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78 20 63  ally any index c
131a0 68 6f 69 63 65 73 2e 20 20 42 75 74 20 77 65 20  hoices.  But we 
131b0 77 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61 67  want to encourag
131c0 65 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70  e the.** query p
131d0 6c 61 6e 6e 65 72 20 74 6f 20 67 69 76 65 20 3d  lanner to give =
131e0 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  = constraints on
131f0 20 61 73 20 6d 61 6e 79 20 68 69 64 64 65 6e 20   as many hidden 
13200 70 61 72 61 6d 65 74 65 72 73 20 61 73 0a 2a 2a  parameters as.**
13210 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 65   possible, and e
13220 73 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68 65  specially on the
13230 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 70 61   first hidden pa
13240 72 61 6d 65 74 65 72 2e 20 20 53 6f 20 72 65 74  rameter.  So ret
13250 75 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63 6f  urn a.** high co
13260 73 74 20 69 66 20 68 69 64 64 65 6e 20 70 61 72  st if hidden par
13270 61 6d 65 74 65 72 73 20 61 72 65 20 75 6e 63 6f  ameters are unco
13280 6e 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73 74  nstrained..*/.st
13290 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
132a0 74 61 62 42 65 73 74 49 6e 64 65 78 28 73 71 6c  tabBestIndex(sql
132b0 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20  ite3_vtab *tab, 
132c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
132d0 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20  fo *pIdxInfo){. 
132e0 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61   PragmaVtab *pTa
132f0 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a  b = (PragmaVtab*
13300 29 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 74  )tab;.  const st
13310 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
13320 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
13330 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e  Constraint;.  in
13340 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73 65  t i, j;.  int se
13350 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49 6e  en[2];..  pIdxIn
13360 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
13370 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  t = (double)1;. 
13380 20 69 66 28 20 70 54 61 62 2d 3e 6e 48 69 64 64   if( pTab->nHidd
13390 65 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20  en==0 ){ return 
133a0 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 70  SQLITE_OK; }.  p
133b0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
133c0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
133d0 6e 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d 20  nt;.  seen[0] = 
133e0 30 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20 30  0;.  seen[1] = 0
133f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
13400 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
13410 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73  aint; i++, pCons
13420 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69  traint++){.    i
13430 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  f( pConstraint->
13440 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74  usable==0 ) cont
13450 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
13460 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53  onstraint->op!=S
13470 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
13480 54 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74  TRAINT_EQ ) cont
13490 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
134a0 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
134b0 6d 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69 64 64  mn < pTab->iHidd
134c0 65 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  en ) continue;. 
134d0 20 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61 69     j = pConstrai
134e0 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 54  nt->iColumn - pT
134f0 61 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20 20  ab->iHidden;.   
13500 20 61 73 73 65 72 74 28 20 6a 20 3c 20 32 20 29   assert( j < 2 )
13510 3b 0a 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d 20  ;.    seen[j] = 
13520 69 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  i+1;.  }.  if( s
13530 65 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  een[0]==0 ){.   
13540 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
13550 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62  atedCost = (doub
13560 6c 65 29 32 31 34 37 34 38 33 36 34 37 3b 0a 20  le)2147483647;. 
13570 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
13580 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 31 34  imatedRows = 214
13590 37 34 38 33 36 34 37 3b 0a 20 20 20 20 72 65 74  7483647;.    ret
135a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
135b0 20 7d 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30 5d   }.  j = seen[0]
135c0 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  -1;.  pIdxInfo->
135d0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
135e0 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  [j].argvIndex = 
135f0 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  1;.  pIdxInfo->a
13600 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
13610 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 69  j].omit = 1;.  i
13620 66 28 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29 20  f( seen[1]==0 ) 
13630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13640 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
13650 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64  timatedCost = (d
13660 6f 75 62 6c 65 29 32 30 3b 0a 20 20 70 49 64 78  ouble)20;.  pIdx
13670 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
13680 6f 77 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d 20  ows = 20;.  j = 
13690 73 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49 64  seen[1]-1;.  pId
136a0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
136b0 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49  ntUsage[j].argvI
136c0 6e 64 65 78 20 3d 20 32 3b 0a 20 20 70 49 64 78  ndex = 2;.  pIdx
136d0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
136e0 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d  tUsage[j].omit =
136f0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
13700 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72  ITE_OK;.}../* Cr
13710 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
13720 72 20 66 6f 72 20 74 68 65 20 70 72 61 67 6d 61  r for the pragma
13730 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
13740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
13750 67 6d 61 56 74 61 62 4f 70 65 6e 28 73 71 6c 69  gmaVtabOpen(sqli
13760 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
13770 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
13780 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29  rsor **ppCursor)
13790 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
137a0 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70 43  rsor *pCsr;.  pC
137b0 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
137c0 43 75 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f  Cursor*)sqlite3_
137d0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
137e0 43 73 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73  Csr));.  if( pCs
137f0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
13800 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
13810 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69  mset(pCsr, 0, si
13820 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 43  zeof(PragmaVtabC
13830 75 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d  ursor));.  pCsr-
13840 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20 70 56  >base.pVtab = pV
13850 74 61 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72  tab;.  *ppCursor
13860 20 3d 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a   = &pCsr->base;.
13870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13880 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20  OK;.}../* Clear 
13890 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  all content from
138a0 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   pragma virtual 
138b0 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a 2f  table cursor. */
138c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 61  .static void pra
138d0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65  gmaVtabCursorCle
138e0 61 72 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  ar(PragmaVtabCur
138f0 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e  sor *pCsr){.  in
13900 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  t i;.  sqlite3_f
13910 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50  inalize(pCsr->pP
13920 72 61 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d 3e  ragma);.  pCsr->
13930 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 66  pPragma = 0;.  f
13940 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
13950 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29  ize(pCsr->azArg)
13960 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
13970 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61  te3_free(pCsr->a
13980 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70 43  zArg[i]);.    pC
13990 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20 30  sr->azArg[i] = 0
139a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73  ;.  }.}../* Clos
139b0 65 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75  e a pragma virtu
139c0 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  al table cursor 
139d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
139e0 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 28 73 71  agmaVtabClose(sq
139f0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
13a00 72 20 2a 63 75 72 29 7b 0a 20 20 50 72 61 67 6d  r *cur){.  Pragm
13a10 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13a20 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
13a30 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 72  ursor*)cur;.  pr
13a40 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c  agmaVtabCursorCl
13a50 65 61 72 28 70 43 73 72 29 3b 0a 20 20 73 71 6c  ear(pCsr);.  sql
13a60 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b  ite3_free(pCsr);
13a70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13a80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e  _OK;.}../* Advan
13a90 63 65 20 74 68 65 20 70 72 61 67 6d 61 20 76 69  ce the pragma vi
13aa0 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
13ab0 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  or to the next r
13ac0 6f 77 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ow */.static int
13ad0 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74 28   pragmaVtabNext(
13ae0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
13af0 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
13b00 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
13b10 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
13b20 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
13b30 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
13b40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13b50 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  OK;..  /* Increm
13b60 65 6e 74 20 74 68 65 20 78 52 6f 77 69 64 20 76  ent the xRowid v
13b70 61 6c 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d 3e  alue */.  pCsr->
13b80 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73 65  iRowid++;.  asse
13b90 72 74 28 20 70 43 73 72 2d 3e 70 50 72 61 67 6d  rt( pCsr->pPragm
13ba0 61 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  a );.  if( SQLIT
13bb0 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73  E_ROW!=sqlite3_s
13bc0 74 65 70 28 70 43 73 72 2d 3e 70 50 72 61 67 6d  tep(pCsr->pPragm
13bd0 61 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  a) ){.    rc = s
13be0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
13bf0 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a  pCsr->pPragma);.
13c00 20 20 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d      pCsr->pPragm
13c10 61 20 3d 20 30 3b 0a 20 20 20 20 70 72 61 67 6d  a = 0;.    pragm
13c20 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72  aVtabCursorClear
13c30 28 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72 65  (pCsr);.  }.  re
13c40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
13c50 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61  ** Pragma virtua
13c60 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
13c70 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a  Filter method..*
13c80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
13c90 67 6d 61 56 74 61 62 46 69 6c 74 65 72 28 0a 20  gmaVtabFilter(. 
13ca0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
13cb0 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
13cc0 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d  r, .  int idxNum
13cd0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64  , const char *id
13ce0 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63  xStr,.  int argc
13cf0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
13d00 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72 61 67  **argv.){.  Prag
13d10 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
13d20 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
13d30 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
13d40 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  sor;.  PragmaVta
13d50 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
13d60 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72  aVtab*)(pVtabCur
13d70 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69  sor->pVtab);.  i
13d80 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
13d90 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63  j;.  StrAccum ac
13da0 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  c;.  char *zSql;
13db0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
13dc0 45 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20 20  ETER(idxNum);.  
13dd0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13de0 28 69 64 78 53 74 72 29 3b 0a 20 20 70 72 61 67  (idxStr);.  prag
13df0 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
13e00 72 28 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20 28  r(pCsr);.  j = (
13e10 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50 72  pTab->pName->mPr
13e20 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
13e30 52 65 73 75 6c 74 31 29 21 3d 30 20 3f 20 30 20  Result1)!=0 ? 0 
13e40 3a 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  : 1;.  for(i=0; 
13e50 69 3c 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b 2b  i<argc; i++, j++
13e60 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
13e70 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73  r *zText = (cons
13e80 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
13e90 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
13ea0 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  i]);.    assert(
13eb0 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73   j<ArraySize(pCs
13ec0 72 2d 3e 61 7a 41 72 67 29 20 29 3b 0a 20 20 20  r->azArg) );.   
13ed0 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61   assert( pCsr->a
13ee0 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 3b 0a 20 20  zArg[j]==0 );.  
13ef0 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20    if( zText ){. 
13f00 20 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67       pCsr->azArg
13f10 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  [j] = sqlite3_mp
13f20 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 54 65 78  rintf("%s", zTex
13f30 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  t);.      if( pC
13f40 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20  sr->azArg[j]==0 
13f50 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
13f60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
13f70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13f80 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
13f90 63 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c  cumInit(&acc, 0,
13fa0 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 64 62 2d   0, 0, pTab->db-
13fb0 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
13fc0 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
13fd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72  );.  sqlite3_str
13fe0 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c  _appendall(&acc,
13ff0 20 22 50 52 41 47 4d 41 20 22 29 3b 0a 20 20 69   "PRAGMA ");.  i
14000 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31  f( pCsr->azArg[1
14010 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
14020 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63  _str_appendf(&ac
14030 63 2c 20 22 25 51 2e 22 2c 20 70 43 73 72 2d 3e  c, "%Q.", pCsr->
14040 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a 20  azArg[1]);.  }. 
14050 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
14060 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 70 54 61  endall(&acc, pTa
14070 62 2d 3e 70 4e 61 6d 65 2d 3e 7a 4e 61 6d 65 29  b->pName->zName)
14080 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a  ;.  if( pCsr->az
14090 41 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 73 71  Arg[0] ){.    sq
140a0 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
140b0 66 28 26 61 63 63 2c 20 22 3d 25 51 22 2c 20 70  f(&acc, "=%Q", p
140c0 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b 0a  Csr->azArg[0]);.
140d0 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c    }.  zSql = sql
140e0 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
140f0 73 68 28 26 61 63 63 29 3b 0a 20 20 69 66 28 20  sh(&acc);.  if( 
14100 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
14110 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
14130 65 70 61 72 65 5f 76 32 28 70 54 61 62 2d 3e 64  epare_v2(pTab->d
14140 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43  b, zSql, -1, &pC
14150 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29 3b  sr->pPragma, 0);
14160 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
14170 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  zSql);.  if( rc!
14180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14190 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72    pTab->base.zEr
141a0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
141b0 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
141c0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 54 61 62  ite3_errmsg(pTab
141d0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 72 65 74 75  ->db));.    retu
141e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74  rn rc;.  }.  ret
141f0 75 72 6e 20 70 72 61 67 6d 61 56 74 61 62 4e 65  urn pragmaVtabNe
14200 78 74 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  xt(pVtabCursor);
14210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d 61  .}../*.** Pragma
14220 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
14230 6f 64 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f  odule xEof metho
14240 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14250 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 28 73   pragmaVtabEof(s
14260 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
14270 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29  or *pVtabCursor)
14280 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
14290 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
142a0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
142b0 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72  pVtabCursor;.  r
142c0 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 70 50 72  eturn (pCsr->pPr
142d0 61 67 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20  agma==0);.}../* 
142e0 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68  The xColumn meth
142f0 6f 64 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  od simply return
14300 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
14310 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  ing column from.
14320 2a 2a 20 74 68 65 20 50 52 41 47 4d 41 2e 20 20  ** the PRAGMA.  
14330 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14340 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 28  ragmaVtabColumn(
14350 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
14360 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
14370 73 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  sor, .  sqlite3_
14380 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20  context *ctx, . 
14390 20 69 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61 67   int i.){.  Prag
143a0 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
143b0 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
143c0 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
143d0 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  sor;.  PragmaVta
143e0 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
143f0 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72  aVtab*)(pVtabCur
14400 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69  sor->pVtab);.  i
14410 66 28 20 69 3c 70 54 61 62 2d 3e 69 48 69 64 64  f( i<pTab->iHidd
14420 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
14430 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
14440 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  tx, sqlite3_colu
14450 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70  mn_value(pCsr->p
14460 50 72 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20 7d  Pragma, i));.  }
14470 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
14480 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
14490 78 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69  x, pCsr->azArg[i
144a0 2d 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d 2c  -pTab->iHidden],
144b0 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  -1,SQLITE_TRANSI
144c0 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ENT);.  }.  retu
144d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
144e0 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ./* .** Pragma v
144f0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
14500 75 6c 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f  ule xRowid metho
14510 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14520 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77 69 64   pragmaVtabRowid
14530 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
14540 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
14550 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  r, sqlite_int64 
14560 2a 70 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  *p){.  PragmaVta
14570 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  bCursor *pCsr = 
14580 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
14590 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r*)pVtabCursor;.
145a0 20 20 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52 6f    *p = pCsr->iRo
145b0 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  wid;.  return SQ
145c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54  LITE_OK;.}../* T
145d0 68 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61  he pragma virtua
145e0 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a  l table object *
145f0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
14600 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70 72  qlite3_module pr
14610 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20 3d  agmaVtabModule =
14620 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20   {.  0,         
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
14650 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 63 72 65  /* xCreate - cre
14680 61 74 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20  ate a table */. 
14690 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65   pragmaVtabConne
146a0 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
146b0 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e   xConnect - conn
146c0 65 63 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69  ect to an existi
146d0 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72  ng table */.  pr
146e0 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65  agmaVtabBestInde
146f0 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42  x,         /* xB
14700 65 73 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72  estIndex - Deter
14710 6d 69 6e 65 20 73 65 61 72 63 68 20 73 74 72 61  mine search stra
14720 74 65 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d 61  tegy */.  pragma
14730 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c 20  VtabDisconnect, 
14740 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f         /* xDisco
14750 6e 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65  nnect - Disconne
14760 63 74 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  ct from a table 
14770 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20    /* xDestroy - 
147a0 44 72 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a  Drop a table */.
147b0 20 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e    pragmaVtabOpen
147c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
147d0 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61  * xOpen - open a
147e0 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61   cursor */.  pra
147f0 67 6d 61 56 74 61 62 43 6c 6f 73 65 2c 20 20 20  gmaVtabClose,   
14800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
14810 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75  ose - close a cu
14820 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61  rsor */.  pragma
14830 56 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20  VtabFilter,     
14840 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
14850 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63  r - configure sc
14860 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  an constraints *
14870 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4e 65  /.  pragmaVtabNe
14880 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
14890 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61   /* xNext - adva
148a0 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  nce a cursor */.
148b0 20 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 2c    pragmaVtabEof,
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
148d0 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61 67  * xEof */.  prag
148e0 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20  maVtabColumn,   
148f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
14900 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
14910 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 52  */.  pragmaVtabR
14920 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
14930 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65    /* xRowid - re
14940 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20  ad data */.  0, 
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70            /* xUp
14970 64 61 74 65 20 2d 20 77 72 69 74 65 20 64 61 74  date - write dat
14980 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  a */.  0,       
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149a0 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20      /* xBegin - 
149b0 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
149c0 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149e0 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73      /* xSync - s
149f0 79 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ync transaction 
14a00 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63    /* xCommit - c
14a30 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f  ommit transactio
14a40 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
14a70 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e   - rollback tran
14a80 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
14ab0 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e  ndFunction - fun
14ac0 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
14ad0 67 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  g */.  0,       
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14af0 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d      /* xRename -
14b00 20 72 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c   rename the tabl
14b10 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b30 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e      /* xSavepoin
14b40 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20      /* xRelease 
14b70 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b90 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f    /* xRollbackTo
14ba0 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 20 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e 61 6d     /* xShadowNam
14bd0 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  e */.};../*.** C
14be0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 7a  heck to see if z
14bf0 54 61 62 4e 61 6d 65 20 69 73 20 72 65 61 6c 6c  TabName is reall
14c00 79 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  y the name of a 
14c10 70 72 61 67 6d 61 2e 20 20 49 66 20 69 74 20 69  pragma.  If it i
14c20 73 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 67 69 73  s,.** then regis
14c30 74 65 72 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73  ter an eponymous
14c40 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66   virtual table f
14c50 6f 72 20 74 68 61 74 20 70 72 61 67 6d 61 20 61  or that pragma a
14c60 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70  nd return.** a p
14c70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 6f  ointer to the Mo
14c80 64 75 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  dule object for 
14c90 74 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20  the new virtual 
14ca0 74 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65  table..*/.Module
14cb0 20 2a 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56   *sqlite3PragmaV
14cc0 74 61 62 52 65 67 69 73 74 65 72 28 73 71 6c 69  tabRegister(sqli
14cd0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
14ce0 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63  har *zName){.  c
14cf0 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
14d00 2a 70 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  *pName;.  assert
14d10 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
14d20 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d  mp(zName, "pragm
14d30 61 5f 22 2c 20 37 29 3d 3d 30 20 29 3b 0a 20 20  a_", 7)==0 );.  
14d40 70 4e 61 6d 65 20 3d 20 70 72 61 67 6d 61 4c 6f  pName = pragmaLo
14d50 63 61 74 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a 20  cate(zName+7);. 
14d60 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 20   if( pName==0 ) 
14d70 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
14d80 28 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67  (pName->mPragFlg
14d90 20 26 20 28 50 72 61 67 46 6c 67 5f 52 65 73 75   & (PragFlg_Resu
14da0 6c 74 30 7c 50 72 61 67 46 6c 67 5f 52 65 73 75  lt0|PragFlg_Resu
14db0 6c 74 31 29 29 3d 3d 30 20 29 20 72 65 74 75 72  lt1))==0 ) retur
14dc0 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  n 0;.  assert( s
14dd0 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
14de0 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61  db->aModule, zNa
14df0 6d 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  me)==0 );.  retu
14e00 72 6e 20 73 71 6c 69 74 65 33 56 74 61 62 43 72  rn sqlite3VtabCr
14e10 65 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a  eateModule(db, z
14e20 4e 61 6d 65 2c 20 26 70 72 61 67 6d 61 56 74 61  Name, &pragmaVta
14e30 62 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64 2a 29  bModule, (void*)
14e40 70 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65  pName, 0);.}..#e
14e50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
14e60 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
14e70 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
14e80 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d  QLITE_OMIT_PRAGM
14e90 41 20 2a 2f 0a                                   A */.