/ Hex Artifact Content
Login

Artifact 13e40651f965e9ac6d4fd44d6c48c4152185209b677b253dc2141c32c14c8dd6:


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 49 73 53 68 61 72 65 64 53 63 68 65 6d 61  ( IsSharedSchema
34f0: 28 64 62 29 20 26 26 20 28 7a 44 62 20 7c 7c 20  (db) && (zDb || 
3500: 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46  (pPragma->mPragF
3510: 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4f 6e 65  lg & PragFlg_One
3520: 53 63 68 65 6d 61 29 29 20 29 7b 0a 20 20 20 20  Schema)) ){.    
3530: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
3540: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
3550: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
3560: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 53 63 68  >rc = sqlite3Sch
3570: 65 6d 61 4c 6f 61 64 28 64 62 2c 20 69 44 62 2c  emaLoad(db, iDb,
3580: 20 30 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72   0, &pParse->zEr
3590: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28  rMsg);.      if(
35a0: 20 70 50 61 72 73 65 2d 3e 72 63 20 29 20 67 6f   pParse->rc ) go
35b0: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
35c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35d0: 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53  if( sqlite3ReadS
35e0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
35f0: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
3600: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3610: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 72 65   Register the re
3620: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
3630: 73 20 66 6f 72 20 70 72 61 67 6d 61 73 20 74 68  s for pragmas th
3640: 61 74 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74  at return result
3650: 73 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61  s */.  if( (pPra
3660: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
3670: 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e  PragFlg_NoColumn
3680: 73 29 3d 3d 30 20 0a 20 20 20 26 26 20 28 28 70  s)==0 .   && ((p
3690: 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67  Pragma->mPragFlg
36a0: 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c   & PragFlg_NoCol
36b0: 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c 20 7a 52 69  umns1)==0 || zRi
36c0: 67 68 74 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  ght==0).  ){.   
36d0: 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74   setPragmaResult
36e0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70  ColumnNames(v, p
36f0: 50 72 61 67 6d 61 29 3b 0a 20 20 7d 0a 0a 20 20  Pragma);.  }..  
3700: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 61  /* Jump to the a
3710: 70 70 72 6f 70 72 69 61 74 65 20 70 72 61 67 6d  ppropriate pragm
3720: 61 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 73  a handler */.  s
3730: 77 69 74 63 68 28 20 70 50 72 61 67 6d 61 2d 3e  witch( pPragma->
3740: 65 50 72 61 67 54 79 70 20 29 7b 0a 20 20 0a 23  ePragTyp ){.  .#
3750: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
3760: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
3770: 41 47 4d 41 53 29 20 26 26 20 21 64 65 66 69 6e  AGMAS) && !defin
3780: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
3790: 45 50 52 45 43 41 54 45 44 29 0a 20 20 2f 2a 0a  EPRECATED).  /*.
37a0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
37b0: 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61  hema.]default_ca
37c0: 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50  che_size.  **  P
37d0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64  RAGMA [schema.]d
37e0: 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a  efault_cache_siz
37f0: 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e=N.  **.  ** Th
3800: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70  e first form rep
3810: 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  orts the current
3820: 20 70 65 72 73 69 73 74 65 6e 74 20 73 65 74 74   persistent sett
3830: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
3840: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
3850: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  .  The value ret
3860: 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78  urned is the max
3870: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
3880: 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65   ** pages in the
3890: 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 54 68   page cache.  Th
38a0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
38b0: 74 73 20 62 6f 74 68 20 74 68 65 20 63 75 72 72  ts both the curr
38c0: 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  ent.  ** page ca
38d0: 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 20 61  che size value a
38e0: 6e 64 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  nd the persisten
38f0: 74 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  t page cache siz
3900: 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74 6f  e value.  ** sto
3910: 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
3920: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20  ase file..  **. 
3930: 20 2a 2a 20 4f 6c 64 65 72 20 76 65 72 73 69 6f   ** Older versio
3940: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 6f 75  ns of SQLite wou
3950: 6c 64 20 73 65 74 20 74 68 65 20 64 65 66 61 75  ld set the defau
3960: 6c 74 20 63 61 63 68 65 20 73 69 7a 65 20 74 6f  lt cache size to
3970: 20 61 0a 20 20 2a 2a 20 6e 65 67 61 74 69 76 65   a.  ** negative
3980: 20 6e 75 6d 62 65 72 20 74 6f 20 69 6e 64 69 63   number to indic
3990: 61 74 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ate synchronous=
39a0: 4f 46 46 2e 20 20 54 68 65 73 65 20 64 61 79 73  OFF.  These days
39b0: 2c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  , synchronous.  
39c0: 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 20  ** is always on 
39d0: 62 79 20 64 65 66 61 75 6c 74 20 72 65 67 61 72  by default regar
39e0: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73 69 67  dless of the sig
39f0: 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  n of the default
3a00: 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65   cache.  ** size
3a10: 2e 20 20 42 75 74 20 63 6f 6e 74 69 6e 75 65 20  .  But continue 
3a20: 74 6f 20 74 61 6b 65 20 74 68 65 20 61 62 73 6f  to take the abso
3a30: 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68  lute value of th
3a40: 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a  e default cache.
3a50: 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 68 69 73    ** size of his
3a60: 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62  torical compatib
3a70: 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a 20 20 63 61  ility..  */.  ca
3a80: 73 65 20 50 72 61 67 54 79 70 5f 44 45 46 41 55  se PragTyp_DEFAU
3a90: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b  LT_CACHE_SIZE: {
3aa0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
3ab0: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
3ac0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
3ad0: 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  );.    static co
3ae0: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 67  nst VdbeOpList g
3af0: 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20  etCacheSize[] = 
3b00: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61  {.      { OP_Tra
3b10: 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  nsaction, 0, 0, 
3b20: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 20 20         0},      
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20     /* 0 */.     
3b50: 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65   { OP_ReadCookie
3b60: 2c 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20  ,  0, 1,        
3b70: 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41  BTREE_DEFAULT_CA
3b80: 43 48 45 5f 53 49 5a 45 7d 2c 20 20 2f 2a 20 31  CHE_SIZE},  /* 1
3b90: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49   */.      { OP_I
3ba0: 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38  fPos,       1, 8
3bb0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3bc0: 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
3bd0: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
3be0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
3bf0: 5f 53 75 62 74 72 61 63 74 2c 20 20 20 20 31 2c  _Subtract,    1,
3c00: 20 32 2c 20 20 20 20 20 20 20 20 31 7d 2c 0a 20   2,        1},. 
3c10: 20 20 20 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c       { OP_IfPos,
3c20: 20 20 20 20 20 20 20 31 2c 20 38 2c 20 20 20 20         1, 8,    
3c30: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
3c40: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20  OP_Integer,     
3c50: 30 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 1,        0},
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 36 20 2a 2f           /* 6 */
3c80: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 6f 6f 70  .      { OP_Noop
3c90: 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20  ,        0, 0,  
3ca0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3cb0: 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  { OP_ResultRow, 
3cc0: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30    1, 1,        0
3cd0: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64  },.    };.    Vd
3ce0: 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 73  beOp *aOp;.    s
3cf0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
3d00: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
3d10: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
3d20: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
3d30: 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 73  em += 2;.      s
3d40: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
3d50: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64  NoMallocRequired
3d60: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65  (v, ArraySize(ge
3d70: 74 43 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  tCacheSize));.  
3d80: 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65      aOp = sqlite
3d90: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
3da0: 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 43  , ArraySize(getC
3db0: 61 63 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61  acheSize), getCa
3dc0: 63 68 65 53 69 7a 65 2c 20 69 4c 6e 29 3b 0a 20  cheSize, iLn);. 
3dd0: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
3de0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
3df0: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
3e00: 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31  .      aOp[0].p1
3e10: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
3e20: 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[1].p1 = iDb;. 
3e30: 20 20 20 20 20 61 4f 70 5b 36 5d 2e 70 31 20 3d       aOp[6].p1 =
3e40: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
3e50: 43 41 43 48 45 5f 53 49 5a 45 3b 0a 20 20 20 20  CACHE_SIZE;.    
3e60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
3e70: 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41   size = sqlite3A
3e80: 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41  bsInt32(sqlite3A
3e90: 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20  toi(zRight));.  
3ea0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
3eb0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
3ec0: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
3ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3ee0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
3ef0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
3f00: 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  REE_DEFAULT_CACH
3f10: 45 5f 53 49 5a 45 2c 20 73 69 7a 65 29 3b 0a 20  E_SIZE, size);. 
3f20: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
3f30: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
3f40: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
3f50: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 53  );.      pDb->pS
3f60: 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a  chema->cache_siz
3f70: 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e = size;.      
3f80: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
3f90: 61 63 68 65 53 69 7a 65 28 70 44 62 2d 3e 70 42  acheSize(pDb->pB
3fa0: 74 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t, pDb->pSchema-
3fb0: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
3fc0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
3fd0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51   }.#endif /* !SQ
3fe0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
3ff0: 50 52 41 47 4d 41 53 20 26 26 20 21 53 51 4c 49  PRAGMAS && !SQLI
4000: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
4010: 45 44 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ED */..#if !defi
4020: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4030: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 0a 20  PAGER_PRAGMAS). 
4040: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
4050: 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f 73   [schema.]page_s
4060: 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ize.  **  PRAGMA
4070: 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f 73   [schema.]page_s
4080: 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ize=N.  **.  ** 
4090: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
40a0: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
40b0: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
40c0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
40d0: 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 62 79   page size in by
40e0: 74 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  tes.  The second
40f0: 20 66 6f 72 6d 20 73 65 74 73 20 74 68 65 0a 20   form sets the. 
4100: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
4110: 65 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 54  e size value.  T
4120: 68 65 20 76 61 6c 75 65 20 63 61 6e 20 6f 6e 6c  he value can onl
4130: 79 20 62 65 20 73 65 74 20 69 66 0a 20 20 2a 2a  y be set if.  **
4140: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
4150: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  s not yet been c
4160: 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  reated..  */.  c
4170: 61 73 65 20 50 72 61 67 54 79 70 5f 50 41 47 45  ase PragTyp_PAGE
4180: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 42 74 72  _SIZE: {.    Btr
4190: 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70  ee *pBt = pDb->p
41a0: 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
41b0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  pBt!=0 );.    if
41c0: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
41d0: 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 41 4c     int size = AL
41e0: 57 41 59 53 28 70 42 74 29 20 3f 20 73 71 6c 69  WAYS(pBt) ? sqli
41f0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
4200: 69 7a 65 28 70 42 74 29 20 3a 20 30 3b 0a 20 20  ize(pBt) : 0;.  
4210: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
4220: 49 6e 74 28 76 2c 20 73 69 7a 65 29 3b 0a 20 20  Int(v, size);.  
4230: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
4240: 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79 20 66 61 69  * Malloc may fai
4250: 6c 20 77 68 65 6e 20 73 65 74 74 69 6e 67 20 74  l when setting t
4260: 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 73  he page-size, as
4270: 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 74   there is an int
4280: 65 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 62  ernal.      ** b
4290: 75 66 66 65 72 20 74 68 61 74 20 74 68 65 20 70  uffer that the p
42a0: 61 67 65 72 20 6d 6f 64 75 6c 65 20 72 65 73 69  ager module resi
42b0: 7a 65 73 20 75 73 69 6e 67 20 73 71 6c 69 74 65  zes using sqlite
42c0: 33 5f 72 65 61 6c 6c 6f 63 28 29 2e 0a 20 20 20  3_realloc()..   
42d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e     */.      db->
42e0: 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 73  nextPagesize = s
42f0: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
4300: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  t);.      if( SQ
4310: 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
4320: 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
4330: 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
4340: 74 50 61 67 65 73 69 7a 65 2c 2d 31 2c 30 29 20  tPagesize,-1,0) 
4350: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4360: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
4370: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4380: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
4390: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
43a0: 5b 73 63 68 65 6d 61 2e 5d 73 65 63 75 72 65 5f  [schema.]secure_
43b0: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 20 50 52 41  delete.  **  PRA
43c0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63  GMA [schema.]sec
43d0: 75 72 65 5f 64 65 6c 65 74 65 3d 4f 4e 2f 4f 46  ure_delete=ON/OF
43e0: 46 2f 46 41 53 54 0a 20 20 2a 2a 0a 20 20 2a 2a  F/FAST.  **.  **
43f0: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
4400: 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72  reports the curr
4410: 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ent setting for 
4420: 74 68 65 0a 20 20 2a 2a 20 73 65 63 75 72 65 5f  the.  ** secure_
4430: 64 65 6c 65 74 65 20 66 6c 61 67 2e 20 20 54 68  delete flag.  Th
4440: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 68  e second form ch
4450: 61 6e 67 65 73 20 74 68 65 20 73 65 63 75 72 65  anges the secure
4460: 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 66 6c 61  _delete.  ** fla
4470: 67 20 73 65 74 74 69 6e 67 20 61 6e 64 20 72 65  g setting and re
4480: 70 6f 72 74 73 20 74 68 65 20 6e 65 77 20 76 61  ports the new va
4490: 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  lue..  */.  case
44a0: 20 50 72 61 67 54 79 70 5f 53 45 43 55 52 45 5f   PragTyp_SECURE_
44b0: 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20 42 74  DELETE: {.    Bt
44c0: 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e  ree *pBt = pDb->
44d0: 70 42 74 3b 0a 20 20 20 20 69 6e 74 20 62 20 3d  pBt;.    int b =
44e0: 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
44f0: 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69   pBt!=0 );.    i
4500: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
4510: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
4520: 74 72 69 63 6d 70 28 7a 52 69 67 68 74 2c 20 22  tricmp(zRight, "
4530: 66 61 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  fast")==0 ){.   
4540: 20 20 20 20 20 62 20 3d 20 32 3b 0a 20 20 20 20       b = 2;.    
4550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4560: 20 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 42   b = sqlite3GetB
4570: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
4580: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4590: 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e  .    if( pId2->n
45a0: 3d 3d 30 20 26 26 20 62 3e 3d 30 20 29 7b 0a 20  ==0 && b>=0 ){. 
45b0: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
45c0: 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
45d0: 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a  db->nDb; ii++){.
45e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
45f0: 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
4600: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4610: 2c 20 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , b);.      }.  
4620: 20 20 7d 0a 20 20 20 20 62 20 3d 20 73 71 6c 69    }.    b = sqli
4630: 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
4640: 6c 65 74 65 28 70 42 74 2c 20 62 29 3b 0a 20 20  lete(pBt, b);.  
4650: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
4660: 74 28 76 2c 20 62 29 3b 0a 20 20 20 20 62 72 65  t(v, b);.    bre
4670: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
4680: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4690: 6d 61 2e 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75  ma.]max_page_cou
46a0: 6e 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  nt.  **  PRAGMA 
46b0: 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61 67  [schema.]max_pag
46c0: 65 5f 63 6f 75 6e 74 3d 4e 0a 20 20 2a 2a 0a 20  e_count=N.  **. 
46d0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
46e0: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
46f0: 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66  urrent setting f
4700: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 78 69  or the.  ** maxi
4710: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
4720: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
4730: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 0a  ase file.  The .
4740: 20 20 2a 2a 20 73 65 63 6f 6e 64 20 66 6f 72 6d    ** second form
4750: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 68 61   attempts to cha
4760: 6e 67 65 20 74 68 69 73 20 73 65 74 74 69 6e 67  nge this setting
4770: 2e 20 20 42 6f 74 68 0a 20 20 2a 2a 20 66 6f 72  .  Both.  ** for
4780: 6d 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  ms return the cu
4790: 72 72 65 6e 74 20 73 65 74 74 69 6e 67 2e 0a 20  rrent setting.. 
47a0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 62 73   **.  ** The abs
47b0: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 4e  olute value of N
47c0: 20 69 73 20 75 73 65 64 2e 20 20 54 68 69 73 20   is used.  This 
47d0: 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20  is undocumented 
47e0: 61 6e 64 20 6d 69 67 68 74 0a 20 20 2a 2a 20 63  and might.  ** c
47f0: 68 61 6e 67 65 2e 20 20 54 68 65 20 6f 6e 6c 79  hange.  The only
4800: 20 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20 70   purpose is to p
4810: 72 6f 76 69 64 65 20 61 6e 20 65 61 73 79 20 77  rovide an easy w
4820: 61 79 20 74 6f 20 74 65 73 74 0a 20 20 2a 2a 20  ay to test.  ** 
4830: 74 68 65 20 73 71 6c 69 74 65 33 41 62 73 49 6e  the sqlite3AbsIn
4840: 74 33 32 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  t32() function..
4850: 20 20 2a 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    **.  **  PRAGM
4860: 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f  A [schema.]page_
4870: 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  count.  **.  ** 
4880: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
4890: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
48a0: 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61  e specified data
48b0: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
48c0: 65 20 50 72 61 67 54 79 70 5f 50 41 47 45 5f 43  e PragTyp_PAGE_C
48d0: 4f 55 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  OUNT: {.    int 
48e0: 69 52 65 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  iReg;.    sqlite
48f0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
4900: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
4910: 20 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50 61      iReg = ++pPa
4920: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
4930: 66 28 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65  f( sqlite3Tolowe
4940: 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 70 27  r(zLeft[0])=='p'
4950: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4960: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4970: 50 5f 50 61 67 65 63 6f 75 6e 74 2c 20 69 44 62  P_Pagecount, iDb
4980: 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c  , iReg);.    }el
4990: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
49a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
49b0: 50 5f 4d 61 78 50 67 63 6e 74 2c 20 69 44 62 2c  P_MaxPgcnt, iDb,
49c0: 20 69 52 65 67 2c 20 0a 20 20 20 20 20 20 20 20   iReg, .        
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49e0: 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
49f0: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
4a00: 68 74 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ht)));.    }.   
4a10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4a20: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
4a30: 6f 77 2c 20 69 52 65 67 2c 20 31 29 3b 0a 20 20  ow, iReg, 1);.  
4a40: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
4a50: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
4a60: 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 69 6e 67  [schema.]locking
4a70: 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20 50 52 41 47  _mode.  **  PRAG
4a80: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b  MA [schema.]lock
4a90: 69 6e 67 5f 6d 6f 64 65 20 3d 20 28 6e 6f 72 6d  ing_mode = (norm
4aa0: 61 6c 7c 65 78 63 6c 75 73 69 76 65 29 0a 20 20  al|exclusive).  
4ab0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
4ac0: 70 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3a 20  p_LOCKING_MODE: 
4ad0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
4ae0: 20 2a 7a 52 65 74 20 3d 20 22 6e 6f 72 6d 61 6c   *zRet = "normal
4af0: 22 3b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65  ";.    int eMode
4b00: 20 3d 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64   = getLockingMod
4b10: 65 28 7a 52 69 67 68 74 29 3b 0a 0a 20 20 20 20  e(zRight);..    
4b20: 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26  if( pId2->n==0 &
4b30: 26 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  & eMode==PAGER_L
4b40: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
4b50: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6d   ){.      /* Sim
4b60: 70 6c 65 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b  ple "PRAGMA lock
4b70: 69 6e 67 5f 6d 6f 64 65 3b 22 20 73 74 61 74 65  ing_mode;" state
4b80: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20  ment. This is a 
4b90: 71 75 65 72 79 20 66 6f 72 0a 20 20 20 20 20 20  query for.      
4ba0: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  ** the current d
4bb0: 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 6d  efault locking m
4bc0: 6f 64 65 20 28 77 68 69 63 68 20 6d 61 79 20 62  ode (which may b
4bd0: 65 20 64 69 66 66 65 72 65 6e 74 20 74 6f 0a 20  e different to. 
4be0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b       ** the lock
4bf0: 69 6e 67 2d 6d 6f 64 65 20 6f 66 20 74 68 65 20  ing-mode of the 
4c00: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 29 2e 0a  main database)..
4c10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 65        */.      e
4c20: 4d 6f 64 65 20 3d 20 64 62 2d 3e 64 66 6c 74 4c  Mode = db->dfltL
4c30: 6f 63 6b 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c  ockMode;.    }el
4c40: 73 65 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20  se{.      Pager 
4c50: 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 69  *pPager;.      i
4c60: 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b  f( pId2->n==0 ){
4c70: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
4c80: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
4c90: 6e 6f 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  no database name
4ca0: 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 61   was specified a
4cb0: 73 20 70 61 72 74 0a 20 20 20 20 20 20 20 20 2a  s part.        *
4cc0: 2a 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  * of the PRAGMA 
4cd0: 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20 74 68 69 73  command. In this
4ce0: 20 63 61 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e   case the lockin
4cf0: 67 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 0a 20  g-mode must be. 
4d00: 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e         ** set on
4d10: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
4d20: 74 61 62 61 73 65 73 2c 20 61 73 20 77 65 6c 6c  tabases, as well
4d30: 20 61 73 20 74 68 65 20 6d 61 69 6e 20 64 62 20   as the main db 
4d40: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  file..        **
4d50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f  .        ** Also
4d60: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 2e 64 66  , the sqlite3.df
4d70: 6c 74 4c 6f 63 6b 4d 6f 64 65 20 76 61 72 69 61  ltLockMode varia
4d80: 62 6c 65 20 69 73 20 73 65 74 20 73 6f 20 74 68  ble is set so th
4d90: 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  at.        ** an
4da0: 79 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 61  y subsequently a
4db0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
4dc0: 73 20 61 6c 73 6f 20 75 73 65 20 74 68 65 20 73  s also use the s
4dd0: 70 65 63 69 66 69 65 64 0a 20 20 20 20 20 20 20  pecified.       
4de0: 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65   ** locking mode
4df0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
4e00: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
4e10: 20 20 20 20 20 61 73 73 65 72 74 28 70 44 62 3d       assert(pDb=
4e20: 3d 26 64 62 2d 3e 61 44 62 5b 30 5d 29 3b 0a 20  =&db->aDb[0]);. 
4e30: 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 32 3b         for(ii=2;
4e40: 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b   ii<db->nDb; ii+
4e50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50  +){.          pP
4e60: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
4e70: 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
4e80: 5b 69 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20  [ii].pBt);.     
4e90: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
4ea0: 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61  rLockingMode(pPa
4eb0: 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ger, eMode);.   
4ec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
4ed0: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
4ee0: 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 20  = (u8)eMode;.   
4ef0: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
4f00: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
4f10: 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Pager(pDb->pBt);
4f20: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 73  .      eMode = s
4f30: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
4f40: 6e 67 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65  ngMode(pPager, e
4f50: 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Mode);.    }..  
4f60: 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
4f70: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4f80: 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  DE_NORMAL.      
4f90: 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
4fa0: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
4fb0: 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
4fc0: 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41     if( eMode==PA
4fd0: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
4fe0: 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
4ff0: 20 20 20 7a 52 65 74 20 3d 20 22 65 78 63 6c 75     zRet = "exclu
5000: 73 69 76 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20  sive";.    }.   
5010: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
5020: 74 28 76 2c 20 7a 52 65 74 29 3b 0a 20 20 20 20  t(v, zRet);.    
5030: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
5040: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
5050: 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d  chema.]journal_m
5060: 6f 64 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ode.  **  PRAGMA
5070: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5080: 6c 5f 6d 6f 64 65 20 3d 0a 20 20 2a 2a 20 20 20  l_mode =.  **   
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 28 64 65 6c 65 74 65 7c 70 65 72 73 69     (delete|persi
50b0: 73 74 7c 6f 66 66 7c 74 72 75 6e 63 61 74 65 7c  st|off|truncate|
50c0: 6d 65 6d 6f 72 79 7c 77 61 6c 7c 6f 66 66 29 0a  memory|wal|off).
50d0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
50e0: 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f 4d 4f 44 45  Typ_JOURNAL_MODE
50f0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64  : {.    int eMod
5100: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  e;        /* One
5110: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
5120: 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 73 79  URNALMODE_XXX sy
5130: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74  mbols */.    int
5140: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 2f   ii;           /
5150: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
5160: 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  /..    if( zRigh
5170: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
5180: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
5190: 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 6f 66 20  "=MODE" part of 
51a0: 74 68 65 20 70 72 61 67 6d 61 2c 20 64 6f 20 61  the pragma, do a
51b0: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20   query for the. 
51c0: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
51d0: 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 65 4d  mode */.      eM
51e0: 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
51f0: 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20  NALMODE_QUERY;. 
5200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64  const char *zMod
5220: 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  e;.      int n =
5230: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
5240: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
5250: 66 6f 72 28 65 4d 6f 64 65 3d 30 3b 20 28 7a 4d  for(eMode=0; (zM
5260: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75  ode = sqlite3Jou
5270: 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28 65 4d 6f  rnalModename(eMo
5280: 64 65 29 29 21 3d 30 3b 20 65 4d 6f 64 65 2b 2b  de))!=0; eMode++
5290: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
52a0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
52b0: 52 69 67 68 74 2c 20 7a 4d 6f 64 65 2c 20 6e 29  Right, zMode, n)
52c0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
52d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
52e0: 7a 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  zMode ){.       
52f0: 20 2f 2a 20 49 66 20 74 68 65 20 22 3d 4d 4f 44   /* If the "=MOD
5300: 45 22 20 70 61 72 74 20 64 6f 65 73 20 6e 6f 74  E" part does not
5310: 20 6d 61 74 63 68 20 61 6e 79 20 6b 6e 6f 77 6e   match any known
5320: 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 0a 20   journal mode,. 
5330: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64         ** then d
5340: 6f 20 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  o a query */.   
5350: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
5360: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
5370: 55 45 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UERY;.      }.  
5380: 20 20 7d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64    }.    if( eMod
5390: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
53a0: 4d 4f 44 45 5f 51 55 45 52 59 20 26 26 20 70 49  MODE_QUERY && pI
53b0: 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  d2->n==0 ){.    
53c0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 50 52    /* Convert "PR
53d0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
53e0: 65 22 20 69 6e 74 6f 20 22 50 52 41 47 4d 41 20  e" into "PRAGMA 
53f0: 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  main.journal_mod
5400: 65 22 20 2a 2f 0a 20 20 20 20 20 20 69 44 62 20  e" */.      iDb 
5410: 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 64 32 2d  = 0;.      pId2-
5420: 3e 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  >n = 1;.    }.  
5430: 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62    for(ii=db->nDb
5440: 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29  -1; ii>=0; ii--)
5450: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
5460: 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26 20 28  aDb[ii].pBt && (
5470: 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32 2d  ii==iDb || pId2-
5480: 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  >n==0) ){.      
5490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
54a0: 73 42 74 72 65 65 28 76 2c 20 69 69 29 3b 0a 20  sBtree(v, ii);. 
54b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
54c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
54d0: 6f 75 72 6e 61 6c 4d 6f 64 65 2c 20 69 69 2c 20  ournalMode, ii, 
54e0: 31 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  1, eMode);.     
54f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
5500: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5510: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
5520: 31 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b  1, 1);.    break
5530: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
5540: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
5550: 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c  .]journal_size_l
5560: 69 6d 69 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d  imit.  **  PRAGM
5570: 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e  A [schema.]journ
5580: 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 3d 4e 0a  al_size_limit=N.
5590: 20 20 2a 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72    **.  ** Get or
55a0: 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6c 69   set the size li
55b0: 6d 69 74 20 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  mit on rollback 
55c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 20  journal files.. 
55d0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
55e0: 79 70 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  yp_JOURNAL_SIZE_
55f0: 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 50 61 67  LIMIT: {.    Pag
5600: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
5610: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
5620: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 69 36  Db->pBt);.    i6
5630: 34 20 69 4c 69 6d 69 74 20 3d 20 2d 32 3b 0a 20  4 iLimit = -2;. 
5640: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
5650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
5660: 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67  cOrHexToI64(zRig
5670: 68 74 2c 20 26 69 4c 69 6d 69 74 29 3b 0a 20 20  ht, &iLimit);.  
5680: 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 2d      if( iLimit<-
5690: 31 20 29 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  1 ) iLimit = -1;
56a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 69 6d 69  .    }.    iLimi
56b0: 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  t = sqlite3Pager
56c0: 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  JournalSizeLimit
56d0: 28 70 50 61 67 65 72 2c 20 69 4c 69 6d 69 74 29  (pPager, iLimit)
56e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  ;.    returnSing
56f0: 6c 65 49 6e 74 28 76 2c 20 69 4c 69 6d 69 74 29  leInt(v, iLimit)
5700: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
5710: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
5720: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
5730: 41 47 4d 41 53 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  AGMAS */..  /*. 
5740: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
5750: 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75 75 6d  ema.]auto_vacuum
5760: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
5770: 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75  chema.]auto_vacu
5780: 75 6d 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47  um=N.  **.  ** G
5790: 65 74 20 6f 72 20 73 65 74 20 74 68 65 20 76 61  et or set the va
57a0: 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  lue of the datab
57b0: 61 73 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  ase 'auto-vacuum
57c0: 27 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a  ' parameter..  *
57d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 6f  * The value is o
57e0: 6e 65 20 6f 66 3a 20 20 30 20 4e 4f 4e 45 20 31  ne of:  0 NONE 1
57f0: 20 46 55 4c 4c 20 32 20 49 4e 43 52 45 4d 45 4e   FULL 2 INCREMEN
5800: 54 41 4c 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  TAL.  */.#ifndef
5810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5820: 4f 56 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50  OVACUUM.  case P
5830: 72 61 67 54 79 70 5f 41 55 54 4f 5f 56 41 43 55  ragTyp_AUTO_VACU
5840: 55 4d 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20  UM: {.    Btree 
5850: 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b  *pBt = pDb->pBt;
5860: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
5870: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21  !=0 );.    if( !
5880: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
5890: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
58a0: 76 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  v, sqlite3BtreeG
58b0: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74  etAutoVacuum(pBt
58c0: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
58d0: 20 20 20 20 20 69 6e 74 20 65 41 75 74 6f 20 3d       int eAuto =
58e0: 20 67 65 74 41 75 74 6f 56 61 63 75 75 6d 28 7a   getAutoVacuum(z
58f0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
5900: 73 65 72 74 28 20 65 41 75 74 6f 3e 3d 30 20 26  sert( eAuto>=0 &
5910: 26 20 65 41 75 74 6f 3c 3d 32 20 29 3b 0a 20 20  & eAuto<=2 );.  
5920: 20 20 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f      db->nextAuto
5930: 76 61 63 20 3d 20 28 75 38 29 65 41 75 74 6f 3b  vac = (u8)eAuto;
5940: 0a 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 53  .      /* Call S
5950: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 29 20 74  etAutoVacuum() t
5960: 6f 20 73 65 74 20 69 6e 69 74 69 61 6c 69 7a 65  o set initialize
5970: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 61 75   the internal au
5980: 74 6f 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  to and.      ** 
5990: 69 6e 63 72 2d 76 61 63 75 75 6d 20 66 6c 61 67  incr-vacuum flag
59a0: 73 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  s. This is requi
59b0: 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73  red in case this
59c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
59d0: 20 20 2a 2a 20 63 72 65 61 74 65 73 20 74 68 65    ** creates the
59e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
59f0: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
5a00: 74 68 61 74 20 69 74 20 69 73 20 63 72 65 61 74  that it is creat
5a10: 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 61  ed.      ** as a
5a20: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  n auto-vacuum ca
5a30: 70 61 62 6c 65 20 64 62 2e 0a 20 20 20 20 20 20  pable db..      
5a40: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
5a50: 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
5a60: 6f 56 61 63 75 75 6d 28 70 42 74 2c 20 65 41 75  oVacuum(pBt, eAu
5a70: 74 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  to);.      if( r
5a80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
5a90: 28 65 41 75 74 6f 3d 3d 31 20 7c 7c 20 65 41 75  (eAuto==1 || eAu
5aa0: 74 6f 3d 3d 32 29 20 29 7b 0a 20 20 20 20 20 20  to==2) ){.      
5ab0: 20 20 2f 2a 20 57 68 65 6e 20 73 65 74 74 69 6e    /* When settin
5ac0: 67 20 74 68 65 20 61 75 74 6f 5f 76 61 63 75 75  g the auto_vacuu
5ad0: 6d 20 6d 6f 64 65 20 74 6f 20 65 69 74 68 65 72  m mode to either
5ae0: 20 22 66 75 6c 6c 22 20 6f 72 20 0a 20 20 20 20   "full" or .    
5af0: 20 20 20 20 2a 2a 20 22 69 6e 63 72 65 6d 65 6e      ** "incremen
5b00: 74 61 6c 22 2c 20 77 72 69 74 65 20 74 68 65 20  tal", write the 
5b10: 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 36 5d  value of meta[6]
5b20: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
5b30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
5b40: 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
5b50: 20 74 6f 20 6d 65 74 61 5b 36 5d 2c 20 63 68 65   to meta[6], che
5b60: 63 6b 20 74 68 61 74 20 6d 65 74 61 5b 33 5d 20  ck that meta[3] 
5b70: 69 6e 64 69 63 61 74 65 73 0a 20 20 20 20 20 20  indicates.      
5b80: 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
5b90: 65 61 6c 6c 79 20 69 73 20 61 6e 20 61 75 74 6f  eally is an auto
5ba0: 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
5bb0: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
5bc0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 61    */.        sta
5bd0: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c  tic const int iL
5be0: 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f  n = VDBE_OFFSET_
5bf0: 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20  LINENO(2);.     
5c00: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
5c10: 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74 4d 65  VdbeOpList setMe
5c20: 74 61 36 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ta6[] = {.      
5c30: 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63      { OP_Transac
5c40: 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 20 20 20  tion,    0,     
5c50: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20      1,          
5c60: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
5c70: 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   0 */.          
5c80: 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
5c90: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
5ca0: 31 2c 20 20 20 20 20 20 20 20 20 42 54 52 45 45  1,         BTREE
5cb0: 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41  _LARGEST_ROOT_PA
5cc0: 47 45 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 7b  GE},.          {
5cd0: 20 4f 50 5f 49 66 2c 20 20 20 20 20 20 20 20 20   OP_If,         
5ce0: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 30      1,         0
5cf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5d00: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f    0},    /* 2 */
5d10: 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  .          { OP_
5d20: 48 61 6c 74 2c 20 20 20 20 20 20 20 20 20 20 20  Halt,           
5d30: 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 41 62  SQLITE_OK, OE_Ab
5d40: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 30 7d  ort,          0}
5d50: 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20  ,    /* 3 */.   
5d60: 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43         { OP_SetC
5d70: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20  ookie,      0,  
5d80: 20 20 20 20 20 20 20 42 54 52 45 45 5f 49 4e 43         BTREE_INC
5d90: 52 5f 56 41 43 55 55 4d 2c 20 30 7d 2c 20 20 20  R_VACUUM, 0},   
5da0: 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20   /* 4 */.       
5db0: 20 7d 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65   };.        Vdbe
5dc0: 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 20  Op *aOp;.       
5dd0: 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
5de0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5df0: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
5e00: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
5e10: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
5e20: 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  d(v, ArraySize(s
5e30: 65 74 4d 65 74 61 36 29 29 3b 0a 20 20 20 20 20  etMeta6));.     
5e40: 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33     aOp = sqlite3
5e50: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
5e60: 20 41 72 72 61 79 53 69 7a 65 28 73 65 74 4d 65   ArraySize(setMe
5e70: 74 61 36 29 2c 20 73 65 74 4d 65 74 61 36 2c 20  ta6), setMeta6, 
5e80: 69 4c 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  iLn);.        if
5e90: 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f  ( ONLY_IF_REALLO
5ea0: 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29  C_STRESS(aOp==0)
5eb0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5ec0: 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44    aOp[0].p1 = iD
5ed0: 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 31  b;.        aOp[1
5ee0: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
5ef0: 20 20 20 20 61 4f 70 5b 32 5d 2e 70 32 20 3d 20      aOp[2].p2 = 
5f00: 69 41 64 64 72 2b 34 3b 0a 20 20 20 20 20 20 20  iAddr+4;.       
5f10: 20 61 4f 70 5b 34 5d 2e 70 31 20 3d 20 69 44 62   aOp[4].p1 = iDb
5f20: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d  ;.        aOp[4]
5f30: 2e 70 33 20 3d 20 65 41 75 74 6f 20 2d 20 31 3b  .p3 = eAuto - 1;
5f40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5f50: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
5f60: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
5f70: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
5f80: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
5f90: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
5fa0: 63 68 65 6d 61 2e 5d 69 6e 63 72 65 6d 65 6e 74  chema.]increment
5fb0: 61 6c 5f 76 61 63 75 75 6d 28 4e 29 0a 20 20 2a  al_vacuum(N).  *
5fc0: 2a 0a 20 20 2a 2a 20 44 6f 20 4e 20 73 74 65 70  *.  ** Do N step
5fd0: 73 20 6f 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s of incremental
5fe0: 20 76 61 63 75 75 6d 69 6e 67 20 6f 6e 20 61 20   vacuuming on a 
5ff0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23  database..  */.#
6000: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6010: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
6020: 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 43  case PragTyp_INC
6030: 52 45 4d 45 4e 54 41 4c 5f 56 41 43 55 55 4d 3a  REMENTAL_VACUUM:
6040: 20 7b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69   {.    int iLimi
6050: 74 2c 20 61 64 64 72 3b 0a 20 20 20 20 69 66 28  t, addr;.    if(
6060: 20 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 21 73   zRight==0 || !s
6070: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
6080: 52 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 20  Right, &iLimit) 
6090: 7c 7c 20 69 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a  || iLimit<=0 ){.
60a0: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 30        iLimit = 0
60b0: 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 7d  x7fffffff;.    }
60c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
60d0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
60e0: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
60f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6100: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
6110: 65 67 65 72 2c 20 69 4c 69 6d 69 74 2c 20 31 29  eger, iLimit, 1)
6120: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
6130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
6140: 2c 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 2c  , OP_IncrVacuum,
6150: 20 69 44 62 29 3b 20 56 64 62 65 43 6f 76 65 72   iDb); VdbeCover
6160: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
6170: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6180: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
6190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
61a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
61b0: 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 0a 20  ddImm, 1, -1);. 
61c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
61d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
61e0: 2c 20 31 2c 20 61 64 64 72 29 3b 20 56 64 62 65  , 1, addr); Vdbe
61f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
6200: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6210: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
6220: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
6230: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
6240: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
6250: 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a  PRAGMAS.  /*.  *
6260: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
6270: 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65 0a 20 20  a.]cache_size.  
6280: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
6290: 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65 3d 4e  ma.]cache_size=N
62a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
62b0: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
62c0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  s the current lo
62d0: 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f 72 20  cal setting for 
62e0: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
62f0: 63 68 65 20 73 69 7a 65 2e 20 54 68 65 20 73 65  che size. The se
6300: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
6310: 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61  he local.  ** pa
6320: 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  ge cache size va
6330: 6c 75 65 2e 20 20 49 66 20 4e 20 69 73 20 70 6f  lue.  If N is po
6340: 73 69 74 69 76 65 20 74 68 65 6e 20 74 68 61 74  sitive then that
6350: 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d   is the.  ** num
6360: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
6370: 74 68 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e  the cache.  If N
6380: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
6390: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62  en the.  ** numb
63a0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 73 20 61  er of pages is a
63b0: 64 6a 75 73 74 65 64 20 73 6f 20 74 68 61 74 20  djusted so that 
63c0: 74 68 65 20 63 61 63 68 65 20 75 73 65 73 20 2d  the cache uses -
63d0: 4e 20 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a  N kibibytes.  **
63e0: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f   of memory..  */
63f0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
6400: 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b 0a 20 20  CACHE_SIZE: {.  
6410: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6420: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
6430: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
6440: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
6450: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
6460: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d  ingleInt(v, pDb-
6470: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
6480: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  size);.    }else
6490: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
64a0: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
64b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 44  Right);.      pD
64c0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68  b->pSchema->cach
64d0: 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20  e_size = size;. 
64e0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
64f0: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44  eSetCacheSize(pD
6500: 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63  b->pBt, pDb->pSc
6510: 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65  hema->cache_size
6520: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
6530: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
6540: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
6550: 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69 6c 6c 0a  ma.]cache_spill.
6560: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63    **  PRAGMA cac
6570: 68 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e  he_spill=BOOLEAN
6580: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
6590: 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69  chema.]cache_spi
65a0: 6c 6c 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ll=N.  **.  ** T
65b0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
65c0: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
65d0: 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20  t local setting 
65e0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
65f0: 65 20 63 61 63 68 65 20 73 70 69 6c 6c 20 73 69  e cache spill si
6600: 7a 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66  ze. The second f
6610: 6f 72 6d 20 74 75 72 6e 73 20 63 61 63 68 65 20  orm turns cache 
6620: 73 70 69 6c 6c 20 6f 6e 0a 20 20 2a 2a 20 6f 72  spill on.  ** or
6630: 20 6f 66 66 2e 20 20 57 68 65 6e 20 74 75 72 6e   off.  When turn
6640: 6e 69 6e 67 20 63 61 63 68 65 20 73 70 69 6c 6c  ning cache spill
6650: 20 6f 6e 2c 20 74 68 65 20 73 69 7a 65 20 69 73   on, the size is
6660: 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a   set to the.  **
6670: 20 63 75 72 72 65 6e 74 20 63 61 63 68 65 5f 73   current cache_s
6680: 69 7a 65 2e 20 20 54 68 65 20 74 68 69 72 64 20  ize.  The third 
6690: 66 6f 72 6d 20 73 65 74 73 20 61 20 73 70 69 6c  form sets a spil
66a0: 6c 20 73 69 7a 65 20 74 68 61 74 0a 20 20 2a 2a  l size that.  **
66b0: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
66c0: 74 20 66 6f 72 6d 20 74 68 65 20 63 61 63 68 65  t form the cache
66d0: 20 73 69 7a 65 2e 0a 20 20 2a 2a 20 49 66 20 4e   size..  ** If N
66e0: 20 69 73 20 70 6f 73 69 74 69 76 65 20 74 68 65   is positive the
66f0: 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  n that is the.  
6700: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
6710: 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
6720: 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69    If N is negati
6730: 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ve, then the.  *
6740: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
6750: 73 20 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f  s is adjusted so
6760: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
6770: 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65  uses -N kibibyte
6780: 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  s.  ** of memory
6790: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
67a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  he number of cac
67b0: 68 65 5f 73 70 69 6c 6c 20 70 61 67 65 73 20 69  he_spill pages i
67c0: 73 20 6c 65 73 73 20 74 68 65 6e 20 74 68 65 20  s less then the 
67d0: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63  number of.  ** c
67e0: 61 63 68 65 5f 73 69 7a 65 20 70 61 67 65 73 2c  ache_size pages,
67f0: 20 6e 6f 20 73 70 69 6c 6c 69 6e 67 20 6f 63 63   no spilling occ
6800: 75 72 73 20 75 6e 74 69 6c 20 74 68 65 20 70 61  urs until the pa
6810: 67 65 20 63 6f 75 6e 74 20 65 78 63 65 65 64 73  ge count exceeds
6820: 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  .  ** the number
6830: 20 6f 66 20 63 61 63 68 65 5f 73 69 7a 65 20 70   of cache_size p
6840: 61 67 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ages..  **.  ** 
6850: 54 68 65 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d  The cache_spill=
6860: 42 4f 4f 4c 45 41 4e 20 73 65 74 74 69 6e 67 20  BOOLEAN setting 
6870: 61 70 70 6c 69 65 73 20 74 6f 20 61 6c 6c 20 61  applies to all a
6880: 74 74 61 63 68 65 64 20 73 63 68 65 6d 61 73 2c  ttached schemas,
6890: 0a 20 20 2a 2a 20 6e 6f 74 20 6a 75 73 74 20 74  .  ** not just t
68a0: 68 65 20 73 63 68 65 6d 61 20 73 70 65 63 69 66  he schema specif
68b0: 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ied..  */.  case
68c0: 20 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53   PragTyp_CACHE_S
68d0: 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 61 73 73 65  PILL: {.    asse
68e0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
68f0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
6900: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66  Db, 0) );.    if
6910: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
6920: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
6930: 6e 74 28 76 2c 0a 20 20 20 20 20 20 20 20 20 28  nt(v,.         (
6940: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
6950: 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 29 3d 3d  TE_CacheSpill)==
6960: 30 20 3f 20 30 20 3a 20 0a 20 20 20 20 20 20 20  0 ? 0 : .       
6970: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
6980: 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44  eSetSpillSize(pD
6990: 62 2d 3e 70 42 74 2c 30 29 29 3b 0a 20 20 20 20  b->pBt,0));.    
69a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
69b0: 20 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 20   size = 1;.     
69c0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49   if( sqlite3GetI
69d0: 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 73 69  nt32(zRight, &si
69e0: 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ze) ){.        s
69f0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70  qlite3BtreeSetSp
6a00: 69 6c 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74  illSize(pDb->pBt
6a10: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  , size);.      }
6a20: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6a30: 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  e3GetBoolean(zRi
6a40: 67 68 74 2c 20 73 69 7a 65 21 3d 30 29 20 29 7b  ght, size!=0) ){
6a50: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  .        db->fla
6a60: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 61 63  gs |= SQLITE_Cac
6a70: 68 65 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d  heSpill;.      }
6a80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62  else{.        db
6a90: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34  ->flags &= ~(u64
6aa0: 29 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69  )SQLITE_CacheSpi
6ab0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
6ac0: 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61    setAllPagerFla
6ad0: 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  gs(db);.    }.  
6ae0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
6af0: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
6b00: 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73 69  [schema.]mmap_si
6b10: 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ze(N).  **.  ** 
6b20: 55 73 65 64 20 74 6f 20 73 65 74 20 6d 61 70 70  Used to set mapp
6b30: 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20  ing size limit. 
6b40: 54 68 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  The mapping size
6b50: 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a 20 75   limit is.  ** u
6b60: 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65  sed to limit the
6b70: 20 61 67 67 72 65 67 61 74 65 20 73 69 7a 65 20   aggregate size 
6b80: 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d 61  of all memory ma
6b90: 70 70 65 64 20 72 65 67 69 6f 6e 73 20 6f 66 20  pped regions of 
6ba0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
6bb0: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20  e file. If this 
6bc0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
6bd0: 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6d   to zero, then m
6be0: 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a 20 20  emory mapping.  
6bf0: 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 20 61  ** is not used a
6c00: 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69 73 20  t all.  If N is 
6c10: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
6c20: 68 65 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72  he default memor
6c30: 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d 69 74  y map.  ** limit
6c40: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 73   determined by s
6c50: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
6c60: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50  LITE_CONFIG_MMAP
6c70: 5f 53 49 5a 45 29 20 69 73 20 73 65 74 2e 0a 20  _SIZE) is set.. 
6c80: 20 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65   ** The paramete
6c90: 72 20 4e 20 69 73 20 6d 65 61 73 75 72 65 64 20  r N is measured 
6ca0: 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a 0a 20  in bytes..  **. 
6cb0: 20 2a 2a 20 54 68 69 73 20 76 61 6c 75 65 20 69   ** This value i
6cc0: 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68 65  s advisory.  The
6cd0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20   underlying VFS 
6ce0: 69 73 20 66 72 65 65 20 74 6f 20 6d 65 6d 6f 72  is free to memor
6cf0: 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20 6c 69  y map.  ** as li
6d00: 74 74 6c 65 20 6f 72 20 61 73 20 6d 75 63 68 20  ttle or as much 
6d10: 61 73 20 69 74 20 77 61 6e 74 73 2e 20 20 45 78  as it wants.  Ex
6d20: 63 65 70 74 2c 20 69 66 20 4e 20 69 73 20 73 65  cept, if N is se
6d30: 74 20 74 6f 20 30 20 74 68 65 6e 20 74 68 65 0a  t to 0 then the.
6d40: 20 20 2a 2a 20 75 70 70 65 72 20 6c 61 79 65 72    ** upper layer
6d50: 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 69 6e 76  s will never inv
6d60: 6f 6b 65 20 74 68 65 20 78 46 65 74 63 68 20 69  oke the xFetch i
6d70: 6e 74 65 72 66 61 63 65 73 20 74 6f 20 74 68 65  nterfaces to the
6d80: 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   VFS..  */.  cas
6d90: 65 20 50 72 61 67 54 79 70 5f 4d 4d 41 50 5f 53  e PragTyp_MMAP_S
6da0: 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  IZE: {.    sqlit
6db0: 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23 69 66  e3_int64 sz;.#if
6dc0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
6dd0: 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61 73 73 65  _SIZE>0.    asse
6de0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
6df0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
6e00: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66  Db, 0) );.    if
6e10: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
6e20: 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
6e30: 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
6e40: 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 73 7a  oI64(zRight, &sz
6e50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c  );.      if( sz<
6e60: 30 20 29 20 73 7a 20 3d 20 73 71 6c 69 74 65 33  0 ) sz = sqlite3
6e70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
6e80: 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  map;.      if( p
6e90: 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e  Id2->n==0 ) db->
6ea0: 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20 20 20  szMmap = sz;.   
6eb0: 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44     for(ii=db->nD
6ec0: 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d  b-1; ii>=0; ii--
6ed0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  ){.        if( d
6ee0: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20 26  b->aDb[ii].pBt &
6ef0: 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49  & (ii==iDb || pI
6f00: 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20  d2->n==0) ){.   
6f10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
6f20: 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
6f30: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c  db->aDb[ii].pBt,
6f40: 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   sz);.        }.
6f50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6f60: 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 72    sz = -1;.    r
6f70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
6f80: 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
6f90: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  , SQLITE_FCNTL_M
6fa0: 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a  MAP_SIZE, &sz);.
6fb0: 23 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d 20 30  #else.    sz = 0
6fc0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
6fd0: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  E_OK;.#endif.   
6fe0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6ff0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
7000: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73  rnSingleInt(v, s
7010: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  z);.    }else if
7020: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc!=SQLITE_NOT
7030: 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 70  FOUND ){.      p
7040: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7050: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
7060: 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = rc;.    }.    
7070: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
7080: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
7090: 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a 20 20  emp_store.  **  
70a0: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
70b0: 72 65 20 3d 20 22 64 65 66 61 75 6c 74 22 7c 22  re = "default"|"
70c0: 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22 0a 20  memory"|"file". 
70d0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
70e0: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
70f0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65   value of the te
7100: 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e 20 20  mp_store flag.  
7110: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
7120: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f  e local value do
7130: 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e  es not make chan
7140: 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ges to the disk 
7150: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 65 66  file and the def
7160: 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20  ault.  ** value 
7170: 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64  will be restored
7180: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
7190: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  he database is o
71a0: 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pened..  **.  **
71b0: 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73   Note that it is
71c0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
71d0: 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70 69 6c  e library compil
71e0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74  e-time options t
71f0: 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64 65 20  o.  ** override 
7200: 74 68 69 73 20 73 65 74 74 69 6e 67 0a 20 20 2a  this setting.  *
7210: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
7220: 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a 20  _TEMP_STORE: {. 
7230: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
7240: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
7250: 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 74  ngleInt(v, db->t
7260: 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20 20 20  emp_store);.    
7270: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
7280: 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70  ngeTempStorage(p
7290: 50 61 72 73 65 2c 20 7a 52 69 67 68 74 29 3b 0a  Parse, zRight);.
72a0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
72b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
72c0: 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74    PRAGMA temp_st
72d0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20  ore_directory.  
72e0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
72f0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
7300: 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79   = ""|"directory
7310: 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a  _name".  **.  **
7320: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
7330: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f  he local value o
7340: 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65  f the temp_store
7350: 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e  _directory flag.
7360: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
7370: 74 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61  the value sets a
7380: 20 73 70 65 63 69 66 69 63 20 64 69 72 65 63 74   specific direct
7390: 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64 20 66  ory to be used f
73a0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
73b0: 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69 6e 67  es..  ** Setting
73c0: 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e   to a null strin
73d0: 67 20 72 65 76 65 72 74 73 20 74 6f 20 74 68 65  g reverts to the
73e0: 20 64 65 66 61 75 6c 74 20 74 65 6d 70 6f 72 61   default tempora
73f0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 65 61  ry directory sea
7400: 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74 65 6d  rch..  ** If tem
7410: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
7420: 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
7430: 6e 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70  n invalidateTemp
7440: 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a 20 20  Storage..  **.  
7450: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
7460: 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44 49 52  p_TEMP_STORE_DIR
7470: 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66  ECTORY: {.    if
7480: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
7490: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54     returnSingleT
74a0: 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 74  ext(v, sqlite3_t
74b0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
74c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64      }else{.#ifnd
74d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
74e0: 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  SD.      if( zRi
74f0: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
7500: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
7510: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7520: 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73  sAccess(db->pVfs
7530: 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45  , zRight, SQLITE
7540: 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
7550: 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  E, &res);.      
7560: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7570: 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b  _OK || res==0 ){
7580: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7590: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
75a0: 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62  e, "not a writab
75b0: 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a  le directory");.
75c0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
75d0: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20  ragma_out;.     
75e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
75f0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 45     if( SQLITE_TE
7600: 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20  MP_STORE==0.    
7610: 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45     || (SQLITE_TE
7620: 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20 64  MP_STORE==1 && d
7630: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31  b->temp_store<=1
7640: 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51 4c  ).       || (SQL
7650: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
7660: 32 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74  2 && db->temp_st
7670: 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b  ore==1).      ){
7680: 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
7690: 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70  ateTempStorage(p
76a0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
76b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
76c0: 65 65 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ee(sqlite3_temp_
76d0: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
76e0: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
76f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7700: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7710: 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
7720: 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74  ntf("%s", zRight
7730: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7740: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7750: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
7760: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
7770: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7780: 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20  T_WSD */.    }. 
7790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23     break;.  }..#
77a0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
77b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
77c0: 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  GMA data_store_d
77d0: 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20  irectory.  **   
77e0: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
77f0: 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22  e_directory = ""
7800: 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65  |"directory_name
7810: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
7820: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
7830: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
7840: 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
7850: 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61  ctory flag.  Cha
7860: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76  nging.  ** the v
7870: 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63  alue sets a spec
7880: 69 66 69 63 20 64 69 72 65 63 74 6f 72 79 20 74  ific directory t
7890: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61  o be used for da
78a0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 74 68 61  tabase files tha
78b0: 74 0a 20 20 2a 2a 20 77 65 72 65 20 73 70 65 63  t.  ** were spec
78c0: 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65 6c  ified with a rel
78d0: 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20  ative pathname. 
78e0: 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75   Setting to a nu
78f0: 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74  ll string revert
7900: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 65  s.  ** to the de
7910: 66 61 75 6c 74 20 64 61 74 61 62 61 73 65 20 64  fault database d
7920: 69 72 65 63 74 6f 72 79 2c 20 77 68 69 63 68 20  irectory, which 
7930: 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  for database fil
7940: 65 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74  es specified wit
7950: 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74 69 76  h.  ** a relativ
7960: 65 20 70 61 74 68 20 77 69 6c 6c 20 70 72 6f 62  e path will prob
7970: 61 62 6c 79 20 62 65 20 62 61 73 65 64 20 6f 6e  ably be based on
7980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72   the current dir
7990: 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a 20  ectory for the. 
79a0: 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20 44 61   ** process.  Da
79b0: 74 61 62 61 73 65 20 66 69 6c 65 20 73 70 65 63  tabase file spec
79c0: 69 66 69 65 64 20 77 69 74 68 20 61 6e 20 61 62  ified with an ab
79d0: 73 6f 6c 75 74 65 20 70 61 74 68 20 61 72 65 20  solute path are 
79e0: 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a 20 20 2a  not impacted.  *
79f0: 2a 20 62 79 20 74 68 69 73 20 73 65 74 74 69 6e  * by this settin
7a00: 67 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  g, regardless of
7a10: 20 69 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a   its value..  **
7a20: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
7a30: 67 54 79 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f  gTyp_DATA_STORE_
7a40: 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20  DIRECTORY: {.   
7a50: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7a60: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
7a70: 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65  leText(v, sqlite
7a80: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7a90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
7aa0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7ab0: 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20  T_WSD.      if( 
7ac0: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
7ad0: 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
7ae0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7af0: 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70  e3OsAccess(db->p
7b00: 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c  Vfs, zRight, SQL
7b10: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
7b20: 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20  RITE, &res);.   
7b30: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
7b40: 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30  ITE_OK || res==0
7b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7b60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7b70: 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69  arse, "not a wri
7b80: 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22  table directory"
7b90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
7ba0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
7bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7bc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
7bd0: 65 65 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  ee(sqlite3_data_
7be0: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
7bf0: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
7c00: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7c10: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7c20: 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
7c30: 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74  ntf("%s", zRight
7c40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7c50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7c60: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
7c70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
7c80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7c90: 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20  T_WSD */.    }. 
7ca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
7cb0: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
7cc0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
7cd0: 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  STYLE.  /*.  ** 
7ce0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
7cf0: 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
7d00: 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  e.  **   PRAGMA 
7d10: 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72  [schema.]lock_pr
7d20: 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61 75 74  oxy_file = ":aut
7d30: 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f 70  o:"|"lock_file_p
7d40: 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ath".  **.  ** R
7d50: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
7d60: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
7d70: 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20 66 6c  ck_proxy_file fl
7d80: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7d90: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7da0: 73 20 61 20 73 70 65 63 69 66 69 63 20 66 69 6c  s a specific fil
7db0: 65 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  e to be used for
7dc0: 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
7dd0: 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20 2a   locks..  **.  *
7de0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
7df0: 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49 4c 45  _LOCK_PROXY_FILE
7e00: 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  : {.    if( !zRi
7e10: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67  ght ){.      Pag
7e20: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
7e30: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
7e40: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
7e50: 63 68 61 72 20 2a 70 72 6f 78 79 5f 66 69 6c 65  char *proxy_file
7e60: 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  _path = NULL;.  
7e70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
7e80: 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *pFile = sqlite
7e90: 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
7ea0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7eb0: 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
7ec0: 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  nt(pFile, SQLITE
7ed0: 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
7ee0: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68  &proxy_file_path
7f10: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  );.      returnS
7f20: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 70 72 6f  ingleText(v, pro
7f30: 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20  xy_file_path);. 
7f40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7f50: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
7f60: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
7f70: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  r(pDb->pBt);.   
7f80: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
7f90: 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *pFile = sqlite3
7fa0: 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
7fb0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  );.      int res
7fc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  ;.      if( zRig
7fd0: 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ht[0] ){.       
7fe0: 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69   res=sqlite3OsFi
7ff0: 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c  leControl(pFile,
8000: 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
8010: 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20  PROXYFILE, .    
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   zRight);.      
8050: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
8060: 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69   res=sqlite3OsFi
8070: 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c  leControl(pFile,
8080: 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
8090: 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20  PROXYFILE, .    
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80c0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a   NULL);.      }.
80d0: 20 20 20 20 20 20 69 66 28 20 72 65 73 21 3d 53        if( res!=S
80e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
80f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8100: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 61 69  Msg(pParse, "fai
8110: 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20  led to set lock 
8120: 70 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a 20 20  proxy file");.  
8130: 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d        goto pragm
8140: 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  a_out;.      }. 
8150: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
8160: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
8170: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
8180: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20  ING_STYLE */    
8190: 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a    .    .  /*.  *
81a0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
81b0: 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a  ma.]synchronous.
81c0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
81d0: 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f  chema.]synchrono
81e0: 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c  us=OFF|ON|NORMAL
81f0: 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20 2a 2a  |FULL|EXTRA.  **
8200: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20  .  ** Return or 
8210: 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61  set the local va
8220: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68  lue of the synch
8230: 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68  ronous flag.  Ch
8240: 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anging.  ** the 
8250: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73  local value does
8260: 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65   not make change
8270: 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69  s to the disk fi
8280: 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20  le and the.  ** 
8290: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
82a0: 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ll be restored t
82b0: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
82c0: 20 64 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a   database is.  *
82d0: 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  * opened..  */. 
82e0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 59   case PragTyp_SY
82f0: 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20 20  NCHRONOUS: {.   
8300: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
8310: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
8320: 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e 73 61  leInt(v, pDb->sa
8330: 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a 20  fety_level-1);. 
8340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8350: 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d  if( !db->autoCom
8360: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mit ){.        s
8370: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8380: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
8390: 20 20 20 20 22 53 61 66 65 74 79 20 6c 65 76 65      "Safety leve
83a0: 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61  l may not be cha
83b0: 6e 67 65 64 20 69 6e 73 69 64 65 20 61 20 74 72  nged inside a tr
83c0: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
83d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 44 62     }else if( iDb
83e0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=1 ){.        i
83f0: 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28 67 65 74  nt iLevel = (get
8400: 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67  SafetyLevel(zRig
8410: 68 74 2c 30 2c 31 29 2b 31 29 20 26 20 50 41 47  ht,0,1)+1) & PAG
8420: 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
8430: 41 53 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ASK;.        if(
8440: 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20 69 4c 65   iLevel==0 ) iLe
8450: 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  vel = 1;.       
8460: 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
8470: 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20  el = iLevel;.   
8480: 20 20 20 20 20 70 44 62 2d 3e 62 53 79 6e 63 53       pDb->bSyncS
8490: 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
84a0: 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73  setAllPagerFlags
84b0: 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (db);.      }.  
84c0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
84d0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
84e0: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
84f0: 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64  RAGMAS */..#ifnd
8500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
8510: 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20 20 63 61  LAG_PRAGMAS.  ca
8520: 73 65 20 50 72 61 67 54 79 70 5f 46 4c 41 47 3a  se PragTyp_FLAG:
8530: 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
8540: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 65  t==0 ){.      se
8550: 74 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c  tPragmaResultCol
8560: 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50 72 61  umnNames(v, pPra
8570: 67 6d 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  gma);.      retu
8580: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 28  rnSingleInt(v, (
8590: 64 62 2d 3e 66 6c 61 67 73 20 26 20 70 50 72 61  db->flags & pPra
85a0: 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20 29 3b  gma->iArg)!=0 );
85b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
85c0: 20 20 75 36 34 20 6d 61 73 6b 20 3d 20 70 50 72    u64 mask = pPr
85d0: 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20 20 2f  agma->iArg;    /
85e0: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
85f0: 6f 20 73 65 74 20 6f 72 20 63 6c 65 61 72 2e 20  o set or clear. 
8600: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  */.      if( db-
8610: 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  >autoCommit==0 )
8620: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
8630: 65 69 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74  eign key support
8640: 20 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e 61 62   may not be enab
8650: 6c 65 64 20 6f 72 20 64 69 73 61 62 6c 65 64 20  led or disabled 
8660: 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20  while not.      
8670: 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63 6f 6d    ** in auto-com
8680: 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20  mit mode.  */.  
8690: 20 20 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28        mask &= ~(
86a0: 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
86b0: 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ys);.      }.#if
86c0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
86d0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
86e0: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61    if( db->auth.a
86f0: 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f  uthLevel==UAUTH_
8700: 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  User ){.        
8710: 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
8720: 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72 73 20  non-admin users 
8730: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63  to modify the sc
8740: 68 65 6d 61 20 61 72 62 69 74 72 61 72 69 6c 79  hema arbitrarily
8750: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b   */.        mask
8760: 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57 72 69   &= ~(SQLITE_Wri
8770: 74 65 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  teSchema);.     
8780: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
8790: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 42   if( sqlite3GetB
87a0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
87b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  ) ){.        db-
87c0: 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  >flags |= mask;.
87d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
87e0: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
87f0: 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  = ~mask;.       
8800: 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c 49 54   if( mask==SQLIT
8810: 45 5f 44 65 66 65 72 46 4b 73 20 29 20 64 62 2d  E_DeferFKs ) db-
8820: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
8830: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  s = 0;.      }..
8840: 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20 6f 66        /* Many of
8850: 20 74 68 65 20 66 6c 61 67 2d 70 72 61 67 6d 61   the flag-pragma
8860: 73 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 64  s modify the cod
8870: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  e generated by t
8880: 68 65 20 53 51 4c 20 0a 20 20 20 20 20 20 2a 2a  he SQL .      **
8890: 20 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e 20 63   compiler (eg. c
88a0: 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e 20 53  ount_changes). S
88b0: 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  o add an opcode 
88c0: 74 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a 20 20  to expire all.  
88d0: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20      ** compiled 
88e0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61  SQL statements a
88f0: 66 74 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  fter modifying a
8900: 20 70 72 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20   pragma value.. 
8910: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
8920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
8930: 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20  v, OP_Expire);. 
8940: 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72       setAllPager
8950: 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d  Flags(db);.    }
8960: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8970: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8980: 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d  _OMIT_FLAG_PRAGM
8990: 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  AS */..#ifndef S
89a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
89b0: 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20  A_PRAGMAS.  /*. 
89c0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 61 62   **   PRAGMA tab
89d0: 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c 65 3e 29  le_info(<table>)
89e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
89f0: 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66  n a single row f
8a00: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
8a10: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
8a20: 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  e. The columns o
8a30: 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 74 75 72  f.  ** the retur
8a40: 6e 65 64 20 64 61 74 61 20 73 65 74 20 61 72 65  ned data set are
8a50: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a  :.  **.  ** cid:
8a60: 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 69          Column i
8a70: 64 20 28 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d  d (numbered from
8a80: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
8a90: 73 74 61 72 74 69 6e 67 20 61 74 20 30 29 0a 20  starting at 0). 
8aa0: 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20 20 20   ** name:       
8ab0: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a  Column name.  **
8ac0: 20 74 79 70 65 3a 20 20 20 20 20 20 20 43 6f 6c   type:       Col
8ad0: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  umn declaration 
8ae0: 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75  type..  ** notnu
8af0: 6c 6c 3a 20 20 20 20 54 72 75 65 20 69 66 20 27  ll:    True if '
8b00: 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20 70 61 72  NOT NULL' is par
8b10: 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  t of column decl
8b20: 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c  aration.  ** dfl
8b30: 74 5f 76 61 6c 75 65 3a 20 54 68 65 20 64 65 66  t_value: The def
8b40: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
8b50: 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e  he column, if an
8b60: 79 2e 0a 20 20 2a 2a 20 70 6b 3a 20 20 20 20 20  y..  ** pk:     
8b70: 20 20 20 20 4e 6f 6e 2d 7a 65 72 6f 20 66 6f 72      Non-zero for
8b80: 20 50 4b 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f   PK fields..  */
8b90: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
8ba0: 54 41 42 4c 45 5f 49 4e 46 4f 3a 20 69 66 28 20  TABLE_INFO: if( 
8bb0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 54 61  zRight ){.    Ta
8bc0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
8bd0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
8be0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
8bf0: 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 2c 20 7a   LOCATE_NOERR, z
8c00: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
8c10: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
8c20: 20 20 20 69 6e 74 20 69 54 61 62 44 62 20 3d 20     int iTabDb = 
8c30: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
8c40: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
8c50: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 69  Schema);.      i
8c60: 6e 74 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69  nt i, k;.      i
8c70: 6e 74 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a  nt nHidden = 0;.
8c80: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43        Column *pC
8c90: 6f 6c 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  ol;.      Index 
8ca0: 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
8cb0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
8cc0: 61 62 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ab);.      pPars
8cd0: 65 2d 3e 6e 4d 65 6d 20 3d 20 37 3b 0a 20 20 20  e->nMem = 7;.   
8ce0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
8cf0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
8d00: 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20  e, iTabDb);.    
8d10: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
8d20: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
8d30: 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  se, pTab);.     
8d40: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70   for(i=0, pCol=p
8d50: 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61  Tab->aCol; i<pTa
8d60: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  b->nCol; i++, pC
8d70: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ol++){.        i
8d80: 6e 74 20 69 73 48 69 64 64 65 6e 20 3d 20 49 73  nt isHidden = Is
8d90: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f  HiddenColumn(pCo
8da0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
8db0: 69 73 48 69 64 64 65 6e 20 26 26 20 70 50 72 61  isHidden && pPra
8dc0: 67 6d 61 2d 3e 69 41 72 67 3d 3d 30 20 29 7b 0a  gma->iArg==0 ){.
8dd0: 20 20 20 20 20 20 20 20 20 20 6e 48 69 64 64 65            nHidde
8de0: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  n++;.          c
8df0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8e00: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
8e10: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
8e20: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
8e30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8e40: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    k = 0;.       
8e50: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 3d 3d   }else if( pPk==
8e60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6b  0 ){.          k
8e70: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
8e80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
8e90: 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61 62 2d  or(k=1; k<=pTab-
8ea0: 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e 61 69  >nCol && pPk->ai
8eb0: 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69 3b 20  Column[k-1]!=i; 
8ec0: 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 7d  k++){}.        }
8ed0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8ee0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 20   pCol->pDflt==0 
8ef0: 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e  || pCol->pDflt->
8f00: 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a 20  op==TK_SPAN );. 
8f10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8f20: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
8f30: 2c 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20  , pPragma->iArg 
8f40: 3f 20 22 69 73 73 69 73 69 69 22 20 3a 20 22 69  ? "issisii" : "i
8f50: 73 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20 20  ssisi",.        
8f60: 20 20 20 20 20 20 20 69 2d 6e 48 69 64 64 65 6e         i-nHidden
8f70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8f80: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pCol->zName,.  
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
8fa0: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70  ite3ColumnType(p
8fb0: 43 6f 6c 2c 22 22 29 2c 0a 20 20 20 20 20 20 20  Col,""),.       
8fc0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 6e 6f          pCol->no
8fd0: 74 4e 75 6c 6c 20 3f 20 31 20 3a 20 30 2c 0a 20  tNull ? 1 : 0,. 
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
8ff0: 6f 6c 2d 3e 70 44 66 6c 74 20 3f 20 70 43 6f 6c  ol->pDflt ? pCol
9000: 2d 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pDflt->u.zToke
9010: 6e 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  n : 0,.         
9020: 20 20 20 20 20 20 6b 2c 0a 20 20 20 20 20 20 20        k,.       
9030: 20 20 20 20 20 20 20 20 69 73 48 69 64 64 65 6e          isHidden
9040: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9050: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23  .  }.  break;..#
9060: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9070: 55 47 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  UG.  case PragTy
9080: 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20 20 20 49  p_STATS: {.    I
9090: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
90a0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 20  HashElem *i;.   
90b0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
90c0: 35 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  5;.    sqlite3Co
90d0: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
90e0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
90f0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9100: 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
9110: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
9120: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
9130: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 20 20 54  ext(i)){.      T
9140: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
9150: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
9160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9170: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9180: 20 22 73 73 69 69 69 22 2c 0a 20 20 20 20 20 20   "ssiii",.      
9190: 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
91a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a  ,.           0,.
91b0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
91c0: 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20 20 20 20  >szTabRow,.     
91d0: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
91e0: 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20 20 20 20  LogEst,.        
91f0: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
9200: 73 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  s);.      for(pI
9210: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
9220: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
9230: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
9240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9250: 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20 22 73 69  tiLoad(v, 2, "si
9260: 69 69 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  iiX",.          
9270: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pIdx->zName,.  
9280: 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 73           pIdx->s
9290: 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20 20 20  zIdxRow,.       
92a0: 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c      pIdx->aiRowL
92b0: 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20 20 20 20  ogEst[0],.      
92c0: 20 20 20 20 20 70 49 64 78 2d 3e 68 61 73 53 74       pIdx->hasSt
92d0: 61 74 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  at1);.        sq
92e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
92f0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
9300: 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 5);.      }.
9310: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9320: 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73  k;.#endif..  cas
9330: 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f  e PragTyp_INDEX_
9340: 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74  INFO: if( zRight
9350: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
9360: 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Idx;.    Table *
9370: 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78 20 3d  pTab;.    pIdx =
9380: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
9390: 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  x(db, zRight, zD
93a0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  b);.    if( pIdx
93b0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49   ){.      int iI
93c0: 64 78 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63  dxDb = sqlite3Sc
93d0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
93e0: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pIdx->pSchema);.
93f0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
9400: 20 20 20 69 6e 74 20 6d 78 3b 0a 20 20 20 20 20     int mx;.     
9410: 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41   if( pPragma->iA
9420: 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rg ){.        /*
9430: 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69   PRAGMA index_xi
9440: 6e 66 6f 20 28 6e 65 77 65 72 20 76 65 72 73 69  nfo (newer versi
9450: 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20 72 6f 77  on with more row
9460: 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 29 20 2a  s and columns) *
9470: 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20 70  /.        mx = p
9480: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
9490: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
94a0: 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 7d 65  em = 6;.      }e
94b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
94c0: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 69 6e 66  PRAGMA index_inf
94d0: 6f 20 28 6c 65 67 61 63 79 20 76 65 72 73 69 6f  o (legacy versio
94e0: 6e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78  n) */.        mx
94f0: 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
9500: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
9510: 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20  ->nMem = 3;.    
9520: 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 20 3d    }.      pTab =
9530: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20   pIdx->pTable;. 
9540: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
9550: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
9560: 72 73 65 2c 20 69 49 64 78 44 62 29 3b 0a 20 20  rse, iIdxDb);.  
9570: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
9580: 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61 67 6d  se->nMem<=pPragm
9590: 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 20 29 3b  a->nPragCName );
95a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
95b0: 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<mx; i++){.    
95c0: 20 20 20 20 69 31 36 20 63 6e 75 6d 20 3d 20 70      i16 cnum = p
95d0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
95e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
95f0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9600: 2c 20 31 2c 20 22 69 69 73 58 22 2c 20 69 2c 20  , 1, "iisX", i, 
9610: 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  cnum,.          
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9630: 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20 3a 20     cnum<0 ? 0 : 
9640: 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d  pTab->aCol[cnum]
9650: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
9660: 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41   if( pPragma->iA
9670: 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
9680: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9690: 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73 69 58  Load(v, 4, "isiX
96a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
96b0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
96c0: 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i],.            
96d0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c  pIdx->azColl[i],
96e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 3c 70  .            i<p
96f0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  Idx->nKeyCol);. 
9700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9710: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9720: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
9730: 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 6e  ow, 1, pParse->n
9740: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mem);.      }.  
9750: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9760: 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  ..  case PragTyp
9770: 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66 28  _INDEX_LIST: if(
9780: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 49   zRight ){.    I
9790: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
97a0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
97b0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54 61 62   int i;.    pTab
97c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
97d0: 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  ble(db, zRight, 
97e0: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
97f0: 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab ){.      int 
9800: 69 54 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33  iTabDb = sqlite3
9810: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
9820: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
9830: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
9840: 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20 20 20  nMem = 5;.      
9850: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
9860: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
9870: 69 54 61 62 44 62 29 3b 0a 20 20 20 20 20 20 66  iTabDb);.      f
9880: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
9890: 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49 64 78 3b  ndex, i=0; pIdx;
98a0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
98b0: 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t, i++){.       
98c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f   const char *azO
98d0: 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c  rigin[] = { "c",
98e0: 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a 20 20   "u", "pk" };.  
98f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9900: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9910: 20 22 69 73 69 73 69 22 2c 0a 20 20 20 20 20 20   "isisi",.      
9920: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20       i,.        
9930: 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a     pIdx->zName,.
9940: 20 20 20 20 20 20 20 20 20 20 20 49 73 55 6e 69             IsUni
9950: 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 2c 0a  queIndex(pIdx),.
9960: 20 20 20 20 20 20 20 20 20 20 20 61 7a 4f 72 69             azOri
9970: 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54 79 70  gin[pIdx->idxTyp
9980: 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e],.           p
9990: 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
99a0: 72 65 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  re!=0);.      }.
99b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
99c0: 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  k;..  case PragT
99d0: 79 70 5f 44 41 54 41 42 41 53 45 5f 4c 49 53 54  yp_DATABASE_LIST
99e0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  : {.    int i;. 
99f0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9a00: 3d 20 33 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 3;.    for(i=0
9a10: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
9a20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  ){.      if( db-
9a30: 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[i].pBt==0 )
9a40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9a50: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
9a60: 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d 30 20  [i].zDbSName!=0 
9a70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9a80: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9a90: 20 31 2c 20 22 69 73 73 22 2c 0a 20 20 20 20 20   1, "iss",.     
9aa0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20      i,.         
9ab0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
9ac0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 73 71  ame,.         sq
9ad0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
9ae0: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d  ename(db->aDb[i]
9af0: 2e 70 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  .pBt));.    }.  
9b00: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61  }.  break;..  ca
9b10: 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4c 4c 41  se PragTyp_COLLA
9b20: 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20  TION_LIST: {.   
9b30: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
9b40: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
9b50: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9b60: 32 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  2;.    for(p=sql
9b70: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9b80: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 70 3b 20  ->aCollSeq); p; 
9b90: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
9ba0: 28 70 29 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  (p)){.      Coll
9bb0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f  Seq *pColl = (Co
9bc0: 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61  llSeq *)sqliteHa
9bd0: 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20  shData(p);.     
9be0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
9bf0: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 22  iLoad(v, 1, "is"
9c00: 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  , i++, pColl->zN
9c10: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
9c20: 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66    break;..#ifdef
9c30: 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45   SQLITE_INTROSPE
9c40: 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20  CTION_PRAGMAS.  
9c50: 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 55 4e  case PragTyp_FUN
9c60: 43 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20  CTION_LIST: {.  
9c70: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 48 61 73    int i;.    Has
9c80: 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 46 75  hElem *j;.    Fu
9c90: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 20 20 70 50  ncDef *p;.    pP
9ca0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a  arse->nMem = 2;.
9cb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
9cc0: 51 4c 49 54 45 5f 46 55 4e 43 5f 48 41 53 48 5f  QLITE_FUNC_HASH_
9cd0: 53 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  SZ; i++){.      
9ce0: 66 6f 72 28 70 3d 73 71 6c 69 74 65 33 42 75 69  for(p=sqlite3Bui
9cf0: 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 2e 61 5b  ltinFunctions.a[
9d00: 69 5d 3b 20 70 3b 20 70 3d 70 2d 3e 75 2e 70 48  i]; p; p=p->u.pH
9d10: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ash ){.        i
9d20: 66 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  f( p->funcFlags 
9d30: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 49 4e  & SQLITE_FUNC_IN
9d40: 54 45 52 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75  TERNAL ) continu
9d50: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
9d60: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
9d70: 76 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d 3e 7a  v, 1, "si", p->z
9d80: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  Name, 1);.      
9d90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
9da0: 6a 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  j=sqliteHashFirs
9db0: 74 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20 6a  t(&db->aFunc); j
9dc0: 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; j=sqliteHashNe
9dd0: 78 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 70 20  xt(j)){.      p 
9de0: 3d 20 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69  = (FuncDef*)sqli
9df0: 74 65 48 61 73 68 44 61 74 61 28 6a 29 3b 0a 20  teHashData(j);. 
9e00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9e10: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
9e20: 22 73 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  "si", p->zName, 
9e30: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
9e40: 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64 65 66 20  break;..#ifndef 
9e50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9e60: 55 41 4c 54 41 42 4c 45 0a 20 20 63 61 73 65 20  UALTABLE.  case 
9e70: 50 72 61 67 54 79 70 5f 4d 4f 44 55 4c 45 5f 4c  PragTyp_MODULE_L
9e80: 49 53 54 3a 20 7b 0a 20 20 20 20 48 61 73 68 45  IST: {.    HashE
9e90: 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 70 50 61 72  lem *j;.    pPar
9ea0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20  se->nMem = 1;.  
9eb0: 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65 48 61    for(j=sqliteHa
9ec0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
9ed0: 64 75 6c 65 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69  dule); j; j=sqli
9ee0: 74 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a  teHashNext(j)){.
9ef0: 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d        Module *pM
9f00: 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71  od = (Module*)sq
9f10: 6c 69 74 65 48 61 73 68 44 61 74 61 28 6a 29 3b  liteHashData(j);
9f20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9f30: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
9f40: 2c 20 22 73 22 2c 20 70 4d 6f 64 2d 3e 7a 4e 61  , "s", pMod->zNa
9f50: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
9f60: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
9f70: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
9f80: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
9f90: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 52   case PragTyp_PR
9fa0: 41 47 4d 41 5f 4c 49 53 54 3a 20 7b 0a 20 20 20  AGMA_LIST: {.   
9fb0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
9fc0: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
9fd0: 28 61 50 72 61 67 6d 61 4e 61 6d 65 29 3b 20 69  (aPragmaName); i
9fe0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
9ff0: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
a000: 76 2c 20 31 2c 20 22 73 22 2c 20 61 50 72 61 67  v, 1, "s", aPrag
a010: 6d 61 4e 61 6d 65 5b 69 5d 2e 7a 4e 61 6d 65 29  maName[i].zName)
a020: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
a030: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  eak;.#endif /* S
a040: 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54  QLITE_INTROSPECT
a050: 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  ION_PRAGMAS */..
a060: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a070: 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52 41  _OMIT_SCHEMA_PRA
a080: 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GMAS */..#ifndef
a090: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
a0a0: 45 49 47 4e 5f 4b 45 59 0a 20 20 63 61 73 65 20  EIGN_KEY.  case 
a0b0: 50 72 61 67 54 79 70 5f 46 4f 52 45 49 47 4e 5f  PragTyp_FOREIGN_
a0c0: 4b 45 59 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52  KEY_LIST: if( zR
a0d0: 69 67 68 74 20 29 7b 0a 20 20 20 20 46 4b 65 79  ight ){.    FKey
a0e0: 20 2a 70 46 4b 3b 0a 20 20 20 20 54 61 62 6c 65   *pFK;.    Table
a0f0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 54 61 62   *pTab;.    pTab
a100: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
a110: 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  ble(db, zRight, 
a120: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
a130: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 46 4b 20  ab ){.      pFK 
a140: 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 3b 0a 20  = pTab->pFKey;. 
a150: 20 20 20 20 20 69 66 28 20 70 46 4b 20 29 7b 0a       if( pFK ){.
a160: 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 61 62          int iTab
a170: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
a180: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
a190: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
a1a0: 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b        int i = 0;
a1b0: 20 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65   .        pParse
a1c0: 2d 3e 6e 4d 65 6d 20 3d 20 38 3b 0a 20 20 20 20  ->nMem = 8;.    
a1d0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
a1e0: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
a1f0: 73 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20  se, iTabDb);.   
a200: 20 20 20 20 20 77 68 69 6c 65 28 70 46 4b 29 7b       while(pFK){
a210: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a  .          int j
a220: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
a230: 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c  j=0; j<pFK->nCol
a240: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
a250: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
a260: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
a270: 69 69 73 73 73 73 73 73 22 2c 0a 20 20 20 20 20  iissssss",.     
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2c                i,
a290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a2a0: 20 20 20 20 6a 2c 0a 20 20 20 20 20 20 20 20 20      j,.         
a2b0: 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 7a            pFK->z
a2c0: 54 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  To,.            
a2d0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
a2e0: 6c 5b 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69  l[pFK->aCol[j].i
a2f0: 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20  From].zName,.   
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  pFK->aCol[j].zCo
a320: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
a330: 20 20 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65        actionName
a340: 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d  (pFK->aAction[1]
a350: 29 2c 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45  ),  /* ON UPDATE
a360: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
a370: 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d         actionNam
a380: 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 30  e(pFK->aAction[0
a390: 5d 29 2c 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54  ]),  /* ON DELET
a3a0: 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  E */.           
a3b0: 20 20 20 20 20 20 20 20 22 4e 4f 4e 45 22 29 3b          "NONE");
a3c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a3d0: 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20         ++i;.    
a3e0: 20 20 20 20 20 20 70 46 4b 20 3d 20 70 46 4b 2d        pFK = pFK-
a3f0: 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20  >pNextFrom;.    
a400: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a410: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
a420: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
a430: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a440: 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
a450: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a460: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
a470: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a480: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 63  OMIT_TRIGGER.  c
a490: 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45  ase PragTyp_FORE
a4a0: 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a 20 7b  IGN_KEY_CHECK: {
a4b0: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 20  .    FKey *pFK; 
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a4d0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
a4e0: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 54  straint */.    T
a4f0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
a500: 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 74        /* Child t
a510: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22 52 45  able contain "RE
a520: 46 45 52 45 4e 43 45 53 22 20 6b 65 79 77 6f 72  FERENCES" keywor
a530: 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  d */.    Table *
a540: 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
a550: 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20  /* Parent table 
a560: 74 68 61 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  that child point
a570: 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e 64 65  s to */.    Inde
a580: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
a590: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 74     /* Index in t
a5a0: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
a5b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  */.    int i;   
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a5d0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20   Loop counter:  
a5e0: 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75 6d 62  Foreign key numb
a5f0: 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  er for pTab */. 
a600: 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20     int j;       
a610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
a620: 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 69 65 6c  p counter:  Fiel
a630: 64 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e  d of the foreign
a640: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61 73 68   key */.    Hash
a650: 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
a660: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
a670: 65 72 3a 20 20 4e 65 78 74 20 74 61 62 6c 65 20  er:  Next table 
a680: 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  in schema */.   
a690: 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20   int x;         
a6a0: 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73 75 6c          /* resul
a6b0: 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  t variable */.  
a6c0: 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b    int regResult;
a6d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 72 65           /* 3 re
a6e0: 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
a6f0: 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
a700: 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79 3b 20      int regKey; 
a710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
a720: 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6b  gister to hold k
a730: 65 79 20 66 6f 72 20 63 68 65 63 6b 69 6e 67 20  ey for checking 
a740: 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20 69 6e  the FK */.    in
a750: 74 20 72 65 67 52 6f 77 3b 20 20 20 20 20 20 20  t regRow;       
a760: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
a770: 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f 77 20  s to hold a row 
a780: 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20 20 20  from pTab */.   
a790: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
a7a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
a7b0: 66 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b 69 6e  f a loop checkin
a7c0: 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 2a  g foreign keys *
a7d0: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 6b  /.    int addrOk
a7e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a7f0: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
a800: 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a 20 20   key is OK */.  
a810: 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b 20 20    int *aiCols;  
a820: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 69 6c           /* chil
a830: 64 20 74 6f 20 70 61 72 65 6e 74 20 63 6f 6c 75  d to parent colu
a840: 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 0a 20  mn mapping */.. 
a850: 20 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70     regResult = p
a860: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
a870: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
a880: 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b 65 79  += 4;.    regKey
a890: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
a8a0: 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  m;.    regRow = 
a8b0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
a8c0: 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61      k = sqliteHa
a8d0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
a8e0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [iDb].pSchema->t
a8f0: 62 6c 48 61 73 68 29 3b 0a 20 20 20 20 77 68 69  blHash);.    whi
a900: 6c 65 28 20 6b 20 29 7b 0a 20 20 20 20 20 20 69  le( k ){.      i
a910: 6e 74 20 69 54 61 62 44 62 3b 0a 20 20 20 20 20  nt iTabDb;.     
a920: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
a930: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71         pTab = sq
a940: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
a950: 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 52 69 67  (pParse, 0, zRig
a960: 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  ht, zDb);.      
a970: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    k = 0;.      }
a980: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
a990: 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
a9a0: 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
a9b0: 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69          k = sqli
a9c0: 74 65 48 61 73 68 4e 65 78 74 28 6b 29 3b 0a 20  teHashNext(k);. 
a9d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a9e0: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 54 61 62   pTab==0 || pTab
a9f0: 2d 3e 70 46 4b 65 79 3d 3d 30 20 29 20 63 6f 6e  ->pFKey==0 ) con
aa00: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 54 61  tinue;.      iTa
aa10: 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  bDb = sqlite3Sch
aa20: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
aa30: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
aa40: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
aa50: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
aa60: 72 73 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20  rse, iTabDb);.  
aa70: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
aa80: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 54 61  Lock(pParse, iTa
aa90: 62 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  bDb, pTab->tnum,
aaa0: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
aab0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
aac0: 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50  ->nCol+regRow>pP
aad0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61  arse->nMem ) pPa
aae0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62  rse->nMem = pTab
aaf0: 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b  ->nCol + regRow;
ab00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
ab10: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
ab20: 30 2c 20 69 54 61 62 44 62 2c 20 70 54 61 62 2c  0, iTabDb, pTab,
ab30: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
ab40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ab50: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 72 65  LoadString(v, re
ab60: 67 52 65 73 75 6c 74 2c 20 70 54 61 62 2d 3e 7a  gResult, pTab->z
ab70: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  Name);.      for
ab80: 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e  (i=1, pFK=pTab->
ab90: 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c  pFKey; pFK; i++,
aba0: 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46   pFK=pFK->pNextF
abb0: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50  rom){.        pP
abc0: 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46  arent = sqlite3F
abd0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b  indTable(db, pFK
abe0: 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20  ->zTo, zDb);.   
abf0: 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74       if( pParent
ac00: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
ac10: 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30          pIdx = 0
ac20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ac30: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
ac40: 65 2c 20 69 54 61 62 44 62 2c 20 70 50 61 72 65  e, iTabDb, pPare
ac50: 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 50 61  nt->tnum, 0, pPa
ac60: 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  rent->zName);.  
ac70: 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
ac80: 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70  3FkLocateIndex(p
ac90: 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
aca0: 70 46 4b 2c 20 26 70 49 64 78 2c 20 30 29 3b 0a  pFK, &pIdx, 0);.
acb0: 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30          if( x==0
acc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
acd0: 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
ace0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
acf0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
ad00: 2c 20 69 2c 20 69 54 61 62 44 62 2c 20 70 50 61  , i, iTabDb, pPa
ad10: 72 65 6e 74 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  rent, OP_OpenRea
ad20: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  d);.          }e
ad30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
ad40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ad50: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
ad60: 64 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  d, i, pIdx->tnum
ad70: 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20 20  , iTabDb);.     
ad80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ad90: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
ada0: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
adb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
adc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
add0: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20     k = 0;.      
ade0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
adf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ae00: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
ae10: 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 46 4b  e->nErr>0 || pFK
ae20: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
ae30: 20 70 46 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20   pFK ) break;.  
ae40: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
ae50: 6e 54 61 62 3c 69 20 29 20 70 50 61 72 73 65 2d  nTab<i ) pParse-
ae60: 3e 6e 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20  >nTab = i;.     
ae70: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
ae80: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ae90: 4f 50 5f 52 65 77 69 6e 64 2c 20 30 29 3b 20 56  OP_Rewind, 0); V
aea0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
aeb0: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70        for(i=1, p
aec0: 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20  FK=pTab->pFKey; 
aed0: 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46  pFK; i++, pFK=pF
aee0: 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  K->pNextFrom){. 
aef0: 20 20 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d         pParent =
af00: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
af10: 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20  e(db, pFK->zTo, 
af20: 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70 49  zDb);.        pI
af30: 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
af40: 61 69 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20  aiCols = 0;.    
af50: 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 20      if( pParent 
af60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d  ){.          x =
af70: 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65   sqlite3FkLocate
af80: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 50  Index(pParse, pP
af90: 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64  arent, pFK, &pId
afa0: 78 2c 20 26 61 69 43 6f 6c 73 29 3b 0a 20 20 20  x, &aiCols);.   
afb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78         assert( x
afc0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  ==0 );.        }
afd0: 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f 6b 20  .        addrOk 
afe0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
aff0: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
b000: 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  .        /* Gene
b010: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 61  rate code to rea
b020: 64 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20  d the child key 
b030: 76 61 6c 75 65 73 20 69 6e 74 6f 20 72 65 67 69  values into regi
b040: 73 74 65 72 73 0a 20 20 20 20 20 20 20 20 2a 2a  sters.        **
b050: 20 72 65 67 52 6f 77 2e 2e 72 65 67 52 6f 77 2b   regRow..regRow+
b060: 6e 2e 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  n. If any of the
b070: 20 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65   child key value
b080: 73 20 61 72 65 20 4e 55 4c 4c 2c 20 74 68 69 73  s are NULL, this
b090: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77   .        ** row
b0a0: 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20 61 6e   cannot cause an
b0b0: 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e 20 4a   FK violation. J
b0c0: 75 6d 70 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ump directly to 
b0d0: 61 64 64 72 4f 6b 20 69 6e 20 0a 20 20 20 20 20  addrOk in .     
b0e0: 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 2e     ** this case.
b0f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
b100: 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c  j=0; j<pFK->nCol
b110: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
b120: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 61 69 43    int iCol = aiC
b130: 6f 6c 73 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d 20  ols ? aiCols[j] 
b140: 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69  : pFK->aCol[j].i
b150: 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  From;.          
b160: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
b170: 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
b180: 76 2c 20 70 54 61 62 2c 20 30 2c 20 69 43 6f 6c  v, pTab, 0, iCol
b190: 2c 20 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20 20  , regRow+j);.   
b1a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b1b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b1c0: 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a 2c  sNull, regRow+j,
b1d0: 20 61 64 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f   addrOk); VdbeCo
b1e0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b1f0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
b200: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b210: 6f 20 71 75 65 72 79 20 74 68 65 20 70 61 72 65  o query the pare
b220: 6e 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20 6d  nt index for a m
b230: 61 74 63 68 69 6e 67 20 70 61 72 65 6e 74 0a 20  atching parent. 
b240: 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 2e 20 49         ** key. I
b250: 66 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75  f a match is fou
b260: 6e 64 2c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  nd, jump to addr
b270: 4f 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  Ok. */.        i
b280: 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
b290: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b2a0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
b2b0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
b2c0: 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b   pFK->nCol, regK
b2d0: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
b2e0: 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66    sqlite3IndexAf
b2f0: 66 69 6e 69 74 79 53 74 72 28 64 62 2c 70 49 64  finityStr(db,pId
b300: 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a  x), pFK->nCol);.
b310: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b320: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
b330: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c 20 61  , OP_Found, i, a
b340: 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79 2c 20 30  ddrOk, regKey, 0
b350: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
b360: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b370: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b380: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20  pParent ){.     
b390: 20 20 20 20 20 69 6e 74 20 6a 6d 70 20 3d 20 73       int jmp = s
b3a0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
b3b0: 74 41 64 64 72 28 76 29 2b 32 3b 0a 20 20 20 20  tAddr(v)+2;.    
b3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b3d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
b3e0: 65 6b 52 6f 77 69 64 2c 20 69 2c 20 6a 6d 70 2c  ekRowid, i, jmp,
b3f0: 20 72 65 67 52 6f 77 29 3b 20 56 64 62 65 43 6f   regRow); VdbeCo
b400: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b420: 47 6f 74 6f 28 76 2c 20 61 64 64 72 4f 6b 29 3b  Goto(v, addrOk);
b430: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
b440: 74 28 20 70 46 4b 2d 3e 6e 43 6f 6c 3d 3d 31 20  t( pFK->nCol==1 
b450: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
b460: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
b470: 65 20 63 6f 64 65 20 74 6f 20 72 65 70 6f 72 74  e code to report
b480: 20 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e   an FK violation
b490: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
b4a0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 48  */.        if( H
b4b0: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
b4c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b4d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b4e0: 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65 67  OP_Rowid, 0, reg
b4f0: 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20  Result+1);.     
b500: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b510: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b520: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
b530: 2c 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31  , 0, regResult+1
b540: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b550: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b560: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 72 65 67  MultiLoad(v, reg
b570: 52 65 73 75 6c 74 2b 32 2c 20 22 73 69 58 22 2c  Result+2, "siX",
b580: 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29 3b   pFK->zTo, i-1);
b590: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b5a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b5b0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
b5c0: 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20 20 20 20  esult, 4);.     
b5d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
b5e0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
b5f0: 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  drOk);.        s
b600: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b610: 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20   aiCols);.      
b620: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
b630: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b640: 4e 65 78 74 2c 20 30 2c 20 61 64 64 72 54 6f 70  Next, 0, addrTop
b650: 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
b660: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
b670: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
b680: 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  v, addrTop);.   
b690: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
b6a0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
b6b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
b6c0: 52 49 47 47 45 52 29 20 2a 2f 0a 23 65 6e 64 69  RIGGER) */.#endi
b6d0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
b6e0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
b6f0: 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 20 20 2f 2a 20  N_KEY) */..  /* 
b700: 52 65 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49  Reinstall the LI
b710: 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63  KE and GLOB func
b720: 74 69 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69  tions.  The vari
b730: 61 6e 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a  ant of LIKE.  **
b740: 20 75 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61   used will be ca
b750: 73 65 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20  se sensitive or 
b760: 6e 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  not depending on
b770: 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
b780: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41   case PragTyp_CA
b790: 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b  SE_SENSITIVE_LIK
b7a0: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  E: {.    if( zRi
b7b0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ght ){.      sql
b7c0: 69 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65  ite3RegisterLike
b7d0: 46 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71  Functions(db, sq
b7e0: 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
b7f0: 7a 52 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20  zRight, 0));.   
b800: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
b810: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b820: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f  INTEGRITY_CHECK_
b830: 45 52 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69  ERROR_MAX.# defi
b840: 6e 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52  ne SQLITE_INTEGR
b850: 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f  ITY_CHECK_ERROR_
b860: 4d 41 58 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a  MAX 100.#endif..
b870: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b880: 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
b890: 45 43 4b 0a 20 20 2f 2a 20 20 20 20 50 52 41 47  ECK.  /*    PRAG
b8a0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
b8b0: 63 6b 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d  ck.  **    PRAGM
b8c0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
b8d0: 6b 28 4e 29 0a 20 20 2a 2a 20 20 20 20 50 52 41  k(N).  **    PRA
b8e0: 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 0a  GMA quick_check.
b8f0: 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71    **    PRAGMA q
b900: 75 69 63 6b 5f 63 68 65 63 6b 28 4e 29 0a 20 20  uick_check(N).  
b910: 2a 2a 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  **.  ** Verify t
b920: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
b930: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
b940: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 71 75 69  **.  ** The "qui
b950: 63 6b 5f 63 68 65 63 6b 22 20 69 73 20 72 65 64  ck_check" is red
b960: 75 63 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  uced version of 
b970: 0a 20 20 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f  .  ** integrity_
b980: 63 68 65 63 6b 20 64 65 73 69 67 6e 65 64 20 74  check designed t
b990: 6f 20 64 65 74 65 63 74 20 6d 6f 73 74 20 64 61  o detect most da
b9a0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
b9b0: 6e 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 74  n.  ** without t
b9c0: 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 63  he overhead of c
b9d0: 72 6f 73 73 2d 63 68 65 63 6b 69 6e 67 20 69 6e  ross-checking in
b9e0: 64 65 78 65 73 2e 20 20 51 75 69 63 6b 5f 63 68  dexes.  Quick_ch
b9f0: 65 63 6b 0a 20 20 2a 2a 20 69 73 20 6c 69 6e 65  eck.  ** is line
ba00: 61 72 20 74 69 6d 65 20 77 68 65 72 65 61 73 65  ar time wherease
ba10: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
ba20: 20 69 73 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20 20   is O(NlogN)..  
ba30: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
ba40: 70 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  p_INTEGRITY_CHEC
ba50: 4b 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  K: {.    int i, 
ba60: 6a 2c 20 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a  j, addr, mxErr;.
ba70: 0a 20 20 20 20 69 6e 74 20 69 73 51 75 69 63 6b  .    int isQuick
ba80: 20 3d 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77   = (sqlite3Tolow
ba90: 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71  er(zLeft[0])=='q
baa0: 27 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ');..    /* If t
bab0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
bac0: 64 20 77 61 73 20 6f 66 20 74 68 65 20 66 6f 72  d was of the for
bad0: 6d 20 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69  m "PRAGMA <db>.i
bae0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 2c  ntegrity_check",
baf0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 69 44 62  .    ** then iDb
bb00: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
bb10: 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
bb20: 62 61 73 65 20 69 64 65 6e 74 69 66 69 65 64 20  base identified 
bb30: 62 79 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20  by <db>..    ** 
bb40: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
bb50: 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 64  e integrity of d
bb60: 61 74 61 62 61 73 65 20 69 44 62 20 6f 6e 6c 79  atabase iDb only
bb70: 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79 0a   is verified by.
bb80: 20 20 20 20 2a 2a 20 74 68 65 20 56 44 42 45 20      ** the VDBE 
bb90: 63 72 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20  created below.. 
bba0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68     **.    ** Oth
bbb0: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63  erwise, if the c
bbc0: 6f 6d 6d 61 6e 64 20 77 61 73 20 73 69 6d 70 6c  ommand was simpl
bbd0: 79 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72  y "PRAGMA integr
bbe0: 69 74 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20  ity_check" (or. 
bbf0: 20 20 20 2a 2a 20 22 50 52 41 47 4d 41 20 71 75     ** "PRAGMA qu
bc00: 69 63 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68 65  ick_check"), the
bc10: 6e 20 69 44 62 20 69 73 20 73 65 74 20 74 6f 20  n iDb is set to 
bc20: 30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  0. In this case,
bc30: 20 73 65 74 20 69 44 62 0a 20 20 20 20 2a 2a 20   set iDb.    ** 
bc40: 74 6f 20 2d 31 20 68 65 72 65 2c 20 74 6f 20 69  to -1 here, to i
bc50: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
bc60: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 76 65 72   VDBE should ver
bc70: 69 66 79 20 74 68 65 20 69 6e 74 65 67 72 69 74  ify the integrit
bc80: 79 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  y.    ** of all 
bc90: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
bca0: 65 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  es.  */.    asse
bcb0: 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20  rt( iDb>=0 );.  
bcc0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30    assert( iDb==0
bcd0: 20 7c 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20   || pId2->z );. 
bce0: 20 20 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d     if( pId2->z==
bcf0: 30 20 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20  0 ) iDb = -1;.. 
bd00: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
bd10: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
bd20: 6d 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d  m */.    pParse-
bd30: 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20  >nMem = 6;..    
bd40: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d  /* Set the maxim
bd50: 75 6d 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a  um error count *
bd60: 2f 0a 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51  /.    mxErr = SQ
bd70: 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43  LITE_INTEGRITY_C
bd80: 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a  HECK_ERROR_MAX;.
bd90: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
bda0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
bdb0: 65 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20  etInt32(zRight, 
bdc0: 26 6d 78 45 72 72 29 3b 0a 20 20 20 20 20 20 69  &mxErr);.      i
bdd0: 66 28 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20  f( mxErr<=0 ){. 
bde0: 20 20 20 20 20 20 20 6d 78 45 72 72 20 3d 20 53         mxErr = S
bdf0: 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f  QLITE_INTEGRITY_
be00: 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b  CHECK_ERROR_MAX;
be10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
be20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
be30: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
be40: 65 72 2c 20 6d 78 45 72 72 2d 31 2c 20 31 29 3b  er, mxErr-1, 1);
be50: 20 2f 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73   /* reg[1] holds
be60: 20 65 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a   errors left */.
be70: 0a 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e  .    /* Do an in
be80: 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6e  tegrity check on
be90: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
bea0: 69 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ile */.    for(i
beb0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
bec0: 2b 2b 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45  ++){.      HashE
bed0: 6c 65 6d 20 2a 78 3b 20 20 20 20 20 2f 2a 20 46  lem *x;     /* F
bee0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
bef0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73 63  tables in the sc
bf00: 68 65 6d 61 20 2a 2f 0a 20 20 20 20 20 20 48 61  hema */.      Ha
bf10: 73 68 20 2a 70 54 62 6c 73 3b 20 20 20 20 20 2f  sh *pTbls;     /
bf20: 2a 20 53 65 74 20 6f 66 20 61 6c 6c 20 74 61 62  * Set of all tab
bf30: 6c 65 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  les in the schem
bf40: 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a  a */.      int *
bf50: 61 52 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20 41  aRoot;      /* A
bf60: 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67  rray of root pag
bf70: 65 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c  e numbers of all
bf80: 20 62 74 72 65 65 73 20 2a 2f 0a 20 20 20 20 20   btrees */.     
bf90: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20   int cnt = 0;   
bfa0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
bfb0: 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b  ntries in aRoot[
bfc0: 5d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6d  ] */.      int m
bfd0: 78 49 64 78 20 3d 20 30 3b 20 20 20 2f 2a 20 4d  xIdx = 0;   /* M
bfe0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
bff0: 20 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 79   indexes for any
c000: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20   table */..     
c010: 20 69 66 28 20 4f 4d 49 54 5f 54 45 4d 50 44 42   if( OMIT_TEMPDB
c020: 20 26 26 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69   && i==1 ) conti
c030: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69  nue;.      if( i
c040: 44 62 3e 3d 30 20 26 26 20 69 21 3d 69 44 62 20  Db>=0 && i!=iDb 
c050: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
c060: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
c070: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
c080: 65 2c 20 69 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  e, i);..      /*
c090: 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79   Do an integrity
c0a0: 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 42 2d   check of the B-
c0b0: 54 72 65 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20  Tree.      **.  
c0c0: 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 62 79 20      ** Begin by 
c0d0: 66 69 6e 64 69 6e 67 20 74 68 65 20 72 6f 6f 74  finding the root
c0e0: 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 0a 20   pages numbers. 
c0f0: 20 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20       ** for all 
c100: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63  tables and indic
c110: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
c120: 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
c130: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
c140: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
c150: 64 28 64 62 2c 20 69 2c 20 30 29 20 29 3b 0a 20  d(db, i, 0) );. 
c160: 20 20 20 20 20 70 54 62 6c 73 20 3d 20 26 64 62       pTbls = &db
c170: 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61  ->aDb[i].pSchema
c180: 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 20  ->tblHash;.     
c190: 20 66 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71   for(cnt=0, x=sq
c1a0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 54  liteHashFirst(pT
c1b0: 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74  bls); x; x=sqlit
c1c0: 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20  eHashNext(x)){. 
c1d0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
c1e0: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
c1f0: 61 74 61 28 78 29 3b 20 20 2f 2a 20 43 75 72 72  ata(x);  /* Curr
c200: 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ent table */.   
c210: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
c220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c230: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
c240: 65 78 20 6f 6e 20 70 54 61 62 20 2a 2f 0a 20 20  ex on pTab */.  
c250: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 78 3b 20        int nIdx; 
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c280: 72 20 6f 66 20 69 6e 64 65 78 65 73 20 6f 6e 20  r of indexes on 
c290: 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 20 20  pTab */.        
c2a0: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
c2b0: 62 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20  b) ) cnt++;.    
c2c0: 20 20 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20      for(nIdx=0, 
c2d0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
c2e0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
c2f0: 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b  dx->pNext, nIdx+
c300: 2b 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20  +){ cnt++; }.   
c310: 20 20 20 20 20 69 66 28 20 6e 49 64 78 3e 6d 78       if( nIdx>mx
c320: 49 64 78 20 29 20 6d 78 49 64 78 20 3d 20 6e 49  Idx ) mxIdx = nI
c330: 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dx;.      }.    
c340: 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65    aRoot = sqlite
c350: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
c360: 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
c370: 63 6e 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 69  cnt+1));.      i
c380: 66 28 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72  f( aRoot==0 ) br
c390: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 63  eak;.      for(c
c3a0: 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61  nt=0, x=sqliteHa
c3b0: 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20  shFirst(pTbls); 
c3c0: 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e  x; x=sqliteHashN
c3d0: 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20  ext(x)){.       
c3e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
c3f0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29  qliteHashData(x)
c400: 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  ;.        Index 
c410: 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69  *pIdx;.        i
c420: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
c430: 29 20 29 20 61 52 6f 6f 74 5b 2b 2b 63 6e 74 5d  ) ) aRoot[++cnt]
c440: 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20   = pTab->tnum;. 
c450: 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
c460: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
c470: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
c480: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
c490: 20 61 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20 3d 20   aRoot[++cnt] = 
c4a0: 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  pIdx->tnum;.    
c4b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c4c0: 20 20 20 20 61 52 6f 6f 74 5b 30 5d 20 3d 20 63      aRoot[0] = c
c4d0: 6e 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61  nt;..      /* Ma
c4e0: 6b 65 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ke sure sufficie
c4f0: 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67  nt number of reg
c500: 69 73 74 65 72 73 20 68 61 76 65 20 62 65 65 6e  isters have been
c510: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
c520: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
c530: 20 3d 20 4d 41 58 28 20 70 50 61 72 73 65 2d 3e   = MAX( pParse->
c540: 6e 4d 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b  nMem, 8+mxIdx );
c550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
c560: 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
c570: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
c580: 2f 2a 20 44 6f 20 74 68 65 20 62 2d 74 72 65 65  /* Do the b-tree
c590: 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
c5a0: 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  s */.      sqlit
c5b0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
c5c0: 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20  OP_IntegrityCk, 
c5d0: 32 2c 20 63 6e 74 2c 20 31 2c 20 28 63 68 61 72  2, cnt, 1, (char
c5e0: 2a 29 61 52 6f 6f 74 2c 50 34 5f 49 4e 54 41 52  *)aRoot,P4_INTAR
c5f0: 52 41 59 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  RAY);.      sqli
c600: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
c610: 76 2c 20 28 75 38 29 69 29 3b 0a 20 20 20 20 20  v, (u8)i);.     
c620: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
c630: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
c640: 49 73 4e 75 6c 6c 2c 20 32 29 3b 20 56 64 62 65  IsNull, 2); Vdbe
c650: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
c660: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c670: 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
c680: 67 38 2c 20 30 2c 20 33 2c 20 30 2c 0a 20 20 20  g8, 0, 3, 0,.   
c690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
c6a0: 69 6e 74 66 28 64 62 2c 20 22 2a 2a 2a 20 69 6e  intf(db, "*** in
c6b0: 20 64 61 74 61 62 61 73 65 20 25 73 20 2a 2a 2a   database %s ***
c6c0: 5c 6e 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  \n", db->aDb[i].
c6d0: 7a 44 62 53 4e 61 6d 65 29 2c 0a 20 20 20 20 20  zDbSName),.     
c6e0: 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b      P4_DYNAMIC);
c6f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c700: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
c710: 6f 6e 63 61 74 2c 20 32 2c 20 33 2c 20 33 29 3b  oncat, 2, 3, 3);
c720: 0a 20 20 20 20 20 20 69 6e 74 65 67 72 69 74 79  .      integrity
c730: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76  CheckResultRow(v
c740: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c750: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c760: 61 64 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  addr);..      /*
c770: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   Make sure all t
c780: 68 65 20 69 6e 64 69 63 65 73 20 61 72 65 20 63  he indices are c
c790: 6f 6e 73 74 72 75 63 74 65 64 20 63 6f 72 72 65  onstructed corre
c7a0: 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ctly..      */. 
c7b0: 20 20 20 20 20 66 6f 72 28 78 3d 73 71 6c 69 74       for(x=sqlit
c7c0: 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73  eHashFirst(pTbls
c7d0: 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61  ); x; x=sqliteHa
c7e0: 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20  shNext(x)){.    
c7f0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c800: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
c810: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64  (x);.        Ind
c820: 65 78 20 2a 70 49 64 78 2c 20 2a 70 50 6b 3b 0a  ex *pIdx, *pPk;.
c830: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
c840: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
c850: 20 20 20 69 6e 74 20 6c 6f 6f 70 54 6f 70 3b 0a     int loopTop;.
c860: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 61 74          int iDat
c870: 61 43 75 72 2c 20 69 49 64 78 43 75 72 3b 0a 20  aCur, iIdxCur;. 
c880: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
c890: 2d 31 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  -1;..        if(
c8a0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3c 31 20 29 20   pTab->tnum<1 ) 
c8b0: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 53 6b  continue;  /* Sk
c8c0: 69 70 20 56 49 45 57 73 20 6f 72 20 56 49 52 54  ip VIEWs or VIRT
c8d0: 55 41 4c 20 54 41 42 4c 45 73 20 2a 2f 0a 20 20  UAL TABLEs */.  
c8e0: 20 20 20 20 20 20 70 50 6b 20 3d 20 48 61 73 52        pPk = HasR
c8f0: 6f 77 69 64 28 70 54 61 62 29 20 3f 20 30 20 3a  owid(pTab) ? 0 :
c900: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
c910: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
c920: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
c930: 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65  enTableAndIndice
c940: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  s(pParse, pTab, 
c950: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 30 2c 0a  OP_OpenRead, 0,.
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 31 2c 20 30 2c 20 26 69 44 61 74 61 43     1, 0, &iDataC
c990: 75 72 2c 20 26 69 49 64 78 43 75 72 29 3b 0a 20  ur, &iIdxCur);. 
c9a0: 20 20 20 20 20 20 20 2f 2a 20 72 65 67 5b 37 5d         /* reg[7]
c9b0: 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62   counts the numb
c9c0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
c9d0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
c9e0: 20 20 20 20 2a 2a 20 72 65 67 5b 38 2b 69 5d 20      ** reg[8+i] 
c9f0: 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65  counts the numbe
ca00: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
ca10: 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 0a  the i-th index .
ca20: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ca30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ca40: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
ca50: 65 72 2c 20 30 2c 20 37 29 3b 0a 20 20 20 20 20  er, 0, 7);.     
ca60: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78     for(j=0, pIdx
ca70: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
ca80: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ca90: 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20  pNext, j++){.   
caa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cab0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
cac0: 6e 74 65 67 65 72 2c 20 30 2c 20 38 2b 6a 29 3b  nteger, 0, 8+j);
cad0: 20 2f 2a 20 69 6e 64 65 78 20 65 6e 74 72 69 65   /* index entrie
cae0: 73 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  s counter */.   
caf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
cb00: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
cb10: 4d 65 6d 3e 3d 38 2b 6a 20 29 3b 0a 20 20 20 20  Mem>=8+j );.    
cb20: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
cb30: 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67  te3NoTempsInRang
cb40: 65 28 70 50 61 72 73 65 2c 31 2c 37 2b 6a 29 20  e(pParse,1,7+j) 
cb50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
cb60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cb70: 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44 61 74 61  OP_Rewind, iData
cb80: 43 75 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  Cur, 0); VdbeCov
cb90: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
cba0: 20 20 6c 6f 6f 70 54 6f 70 20 3d 20 73 71 6c 69    loopTop = sqli
cbb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cbc0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 37 2c 20 31   OP_AddImm, 7, 1
cbd0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
cbe0: 69 73 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20  isQuick ){.     
cbf0: 20 20 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63       /* Sanity c
cc00: 68 65 63 6b 20 6f 6e 20 72 65 63 6f 72 64 20 68  heck on record h
cc10: 65 61 64 65 72 20 64 65 63 6f 64 69 6e 67 20 2a  eader decoding *
cc20: 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
cc30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
cc40: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 44 61 74   OP_Column, iDat
cc50: 61 43 75 72 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  aCur, pTab->nCol
cc60: 2d 31 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  -1, 3);.        
cc70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
cc80: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
cc90: 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20  TYPEOFARG);.    
cca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
ccb0: 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c   Verify that all
ccc0: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
ccd0: 73 20 72 65 61 6c 6c 79 20 61 72 65 20 4e 4f 54  s really are NOT
cce0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20   NULL */.       
ccf0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
cd00: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
cd10: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45          char *zE
cd20: 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  rr;.          in
cd30: 74 20 6a 6d 70 32 3b 0a 20 20 20 20 20 20 20 20  t jmp2;.        
cd40: 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69    if( j==pTab->i
cd50: 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b  PKey ) continue;
cd60: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
cd70: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  Tab->aCol[j].not
cd80: 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Null==0 ) contin
cd90: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ue;.          sq
cda0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
cdb0: 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
cdc0: 20 70 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c   pTab, iDataCur,
cdd0: 20 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20   j, 3);.        
cde0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
cdf0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
ce00: 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20  TYPEOFARG);.    
ce10: 20 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c        jmp2 = sql
ce20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
ce30: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 33 29  , OP_NotNull, 3)
ce40: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
ce50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72  );.          zEr
ce60: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
ce70: 74 66 28 64 62 2c 20 22 4e 55 4c 4c 20 76 61 6c  tf(db, "NULL val
ce80: 75 65 20 69 6e 20 25 73 2e 25 73 22 2c 20 70 54  ue in %s.%s", pT
ce90: 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
cec0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[j].zName);. 
ced0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cee0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
cef0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20  _String8, 0, 3, 
cf00: 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41  0, zErr, P4_DYNA
cf10: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  MIC);.          
cf20: 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65  integrityCheckRe
cf30: 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20  sultRow(v);.    
cf40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cf50: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70  eJumpHere(v, jmp
cf60: 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  2);.        }.  
cf70: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
cf80: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
cf90: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
cfa0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 26 26   pTab->pCheck &&
cfb0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
cfc0: 4c 49 54 45 5f 49 67 6e 6f 72 65 43 68 65 63 6b  LITE_IgnoreCheck
cfd0: 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  s)==0 ){.       
cfe0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68     ExprList *pCh
cff0: 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
d000: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 54 61  rListDup(db, pTa
d010: 62 2d 3e 70 43 68 65 63 6b 2c 20 30 29 3b 0a 20  b->pCheck, 0);. 
d020: 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d           if( db-
d030: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
d040: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d050: 69 6e 74 20 61 64 64 72 43 6b 46 61 75 6c 74 20  int addrCkFault 
d060: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d070: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
d080: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
d090: 61 64 64 72 43 6b 4f 6b 20 3d 20 73 71 6c 69 74  addrCkOk = sqlit
d0a0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d0b0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d0c0: 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b       char *zErr;
d0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d0e0: 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
d0f0: 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
d100: 20 3d 20 69 44 61 74 61 43 75 72 20 2b 20 31 3b   = iDataCur + 1;
d110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
d120: 28 6b 3d 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72  (k=pCheck->nExpr
d130: 2d 31 3b 20 6b 3e 30 3b 20 6b 2d 2d 29 7b 0a 20  -1; k>0; k--){. 
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
d150: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
d160: 70 50 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e  pParse, pCheck->
d170: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 61 64 64 72  a[k].pExpr, addr
d180: 43 6b 46 61 75 6c 74 2c 20 30 29 3b 0a 20 20 20  CkFault, 0);.   
d190: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d1a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d1b0: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
d1c0: 20 70 43 68 65 63 6b 2d 3e 61 5b 30 5d 2e 70 45   pCheck->a[0].pE
d1d0: 78 70 72 2c 20 61 64 64 72 43 6b 4f 6b 2c 20 0a  xpr, addrCkOk, .
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
d200: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  L);.            
d210: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d220: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
d230: 6b 46 61 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  kFault);.       
d240: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65       pParse->iSe
d250: 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  lfTab = 0;.     
d260: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71         zErr = sq
d270: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
d280: 20 22 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69   "CHECK constrai
d290: 6e 74 20 66 61 69 6c 65 64 20 69 6e 20 25 73 22  nt failed in %s"
d2a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d2b0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d2d0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
d2e0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
d2f0: 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44  3, 0, zErr, P4_D
d300: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
d310: 20 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68       integrityCh
d320: 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b  eckResultRow(v);
d330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d340: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
d350: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 4f 6b  abel(v, addrCkOk
d360: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
d370: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d380: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
d390: 62 2c 20 70 43 68 65 63 6b 29 3b 0a 20 20 20 20  b, pCheck);.    
d3a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
d3b0: 28 20 21 69 73 51 75 69 63 6b 20 29 7b 20 2f 2a  ( !isQuick ){ /*
d3c0: 20 4f 6d 69 74 20 74 68 65 20 72 65 6d 61 69 6e   Omit the remain
d3d0: 69 6e 67 20 74 65 73 74 73 20 66 6f 72 20 71 75  ing tests for qu
d3e0: 69 63 6b 5f 63 68 65 63 6b 20 2a 2f 0a 20 20 20  ick_check */.   
d3f0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 61         /* Valida
d400: 74 65 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  te index entries
d410: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
d420: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20   row */.        
d430: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d    for(j=0, pIdx=
d440: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
d450: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
d460: 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20  Next, j++){.    
d470: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32          int jmp2
d480: 2c 20 6a 6d 70 33 2c 20 6a 6d 70 34 2c 20 6a 6d  , jmp3, jmp4, jm
d490: 70 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p5;.            
d4a0: 69 6e 74 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c  int ckUniq = sql
d4b0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
d4c0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
d4d0: 20 20 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d         if( pPk==
d4e0: 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b  pIdx ) continue;
d4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31 20  .            r1 
d500: 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  = sqlite3Generat
d510: 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
d520: 2c 20 70 49 64 78 2c 20 69 44 61 74 61 43 75 72  , pIdx, iDataCur
d530: 2c 20 30 2c 20 30 2c 20 26 6a 6d 70 33 2c 0a 20  , 0, 0, &jmp3,. 
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20          pPrior, 
d570: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
d580: 20 70 50 72 69 6f 72 20 3d 20 70 49 64 78 3b 0a   pPrior = pIdx;.
d590: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d5a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d5b0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 38 2b 6a 2c   OP_AddImm, 8+j,
d5c0: 20 31 29 3b 2f 2a 20 69 6e 63 72 65 6d 65 6e 74   1);/* increment
d5d0: 20 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f 0a   entry count */.
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
d5f0: 65 72 69 66 79 20 74 68 61 74 20 61 6e 20 69 6e  erify that an in
d600: 64 65 78 20 65 6e 74 72 79 20 65 78 69 73 74 73  dex entry exists
d610: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
d620: 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20   table row */.  
d630: 20 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d            jmp2 =
d640: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d650: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
d660: 64 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 63 6b  d, iIdxCur+j, ck
d670: 55 6e 69 71 2c 20 72 31 2c 0a 20 20 20 20 20 20  Uniq, r1,.      
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29    pIdx->nColumn)
d6b0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d6c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d6d0: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
d6e0: 72 69 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77 20  ring(v, 3, "row 
d6f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
d700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d710: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
d720: 37 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20  7, 3, 3);.      
d730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d740: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34  eLoadString(v, 4
d750: 2c 20 22 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d  , " missing from
d760: 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20   index ");.     
d770: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d780: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
d790: 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33 29 3b  oncat, 4, 3, 3);
d7a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70  .            jmp
d7b0: 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4c  5 = sqlite3VdbeL
d7c0: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20  oadString(v, 4, 
d7d0: 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
d7e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d7f0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d800: 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20  P_Concat, 4, 3, 
d810: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
d820: 6a 6d 70 34 20 3d 20 69 6e 74 65 67 72 69 74 79  jmp4 = integrity
d830: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76  CheckResultRow(v
d840: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d850: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
d860: 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20  re(v, jmp2);.   
d870: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
d880: 55 4e 49 51 55 45 20 69 6e 64 65 78 65 73 2c 20  UNIQUE indexes, 
d890: 76 65 72 69 66 79 20 74 68 61 74 20 6f 6e 6c 79  verify that only
d8a0: 20 6f 6e 65 20 65 6e 74 72 79 20 65 78 69 73 74   one entry exist
d8b0: 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20  s with the.     
d8c0: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
d8d0: 74 20 6b 65 79 2e 20 20 54 68 65 20 65 6e 74 72  t key.  The entr
d8e0: 79 20 69 73 20 75 6e 69 71 75 65 20 69 66 20 28  y is unique if (
d8f0: 31 29 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73  1) any column is
d900: 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20   NULL.          
d910: 20 20 2a 2a 20 6f 72 20 28 32 29 20 74 68 65 20    ** or (2) the 
d920: 6e 65 78 74 20 65 6e 74 72 79 20 68 61 73 20 61  next entry has a
d930: 20 64 69 66 66 65 72 65 6e 74 20 6b 65 79 20 2a   different key *
d940: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
d950: 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
d960: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
d970: 20 20 20 20 20 20 20 69 6e 74 20 75 6e 69 71 4f         int uniqO
d980: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
d990: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
d9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d9b0: 69 6e 74 20 6a 6d 70 36 3b 0a 20 20 20 20 20 20  int jmp6;.      
d9c0: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 6b 3b 0a          int kk;.
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
d9e0: 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78 2d  r(kk=0; kk<pIdx-
d9f0: 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b  >nKeyCol; kk++){
da00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
da10: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78   int iCol = pIdx
da20: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a  ->aiColumn[kk];.
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da40: 61 73 73 65 72 74 28 20 69 43 6f 6c 21 3d 58 4e  assert( iCol!=XN
da50: 5f 52 4f 57 49 44 20 26 26 20 69 43 6f 6c 3c 70  _ROWID && iCol<p
da60: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
da80: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70 54 61 62   iCol>=0 && pTab
da90: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74  ->aCol[iCol].not
daa0: 4e 75 6c 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Null ) continue;
dab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dad0: 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
dae0: 20 72 31 2b 6b 6b 2c 20 75 6e 69 71 4f 6b 29 3b   r1+kk, uniqOk);
daf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
db00: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
db10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
db20: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
db30: 6a 6d 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp6 = sqlite3Vd
db40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
db50: 65 78 74 2c 20 69 49 64 78 43 75 72 2b 6a 29 3b  ext, iIdxCur+j);
db60: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
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 47 6f 74 6f 28  sqlite3VdbeGoto(
db90: 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20  v, uniqOk);.    
dba0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dbb0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
dbc0: 20 6a 6d 70 36 29 3b 0a 20 20 20 20 20 20 20 20   jmp6);.        
dbd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dbe0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
dbf0: 5f 49 64 78 47 54 2c 20 69 49 64 78 43 75 72 2b  _IdxGT, iIdxCur+
dc00: 6a 2c 20 75 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20  j, uniqOk, r1,. 
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29    pIdx->nKeyCol)
dc40: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
dc50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
dc60: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
dc70: 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 6e 6f  String(v, 3, "no
dc80: 6e 2d 75 6e 69 71 75 65 20 65 6e 74 72 79 20 69  n-unique entry i
dc90: 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20  n index ");.    
dca0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dcb0: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 6d 70  3VdbeGoto(v, jmp
dcc0: 35 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  5);.            
dcd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
dce0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 75 6e 69  olveLabel(v, uni
dcf0: 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  qOk);.          
dd00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
dd10: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
dd20: 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b 0a 20 20  ere(v, jmp4);.  
dd30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dd40: 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c  3ResolvePartIdxL
dd50: 61 62 65 6c 28 70 50 61 72 73 65 2c 20 6a 6d 70  abel(pParse, jmp
dd60: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  3);.          }.
dd70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dd80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dd90: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
dda0: 69 44 61 74 61 43 75 72 2c 20 6c 6f 6f 70 54 6f  iDataCur, loopTo
ddb0: 70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  p); VdbeCoverage
ddc0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
ddd0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
dde0: 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31 29 3b 0a  (v, loopTop-1);.
ddf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
de00: 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20  MIT_BTREECOUNT. 
de10: 20 20 20 20 20 20 20 69 66 28 20 21 69 73 51 75         if( !isQu
de20: 69 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ick ){.         
de30: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
de40: 53 74 72 69 6e 67 28 76 2c 20 32 2c 20 22 77 72  String(v, 2, "wr
de50: 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72 69 65 73  ong # of entries
de60: 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20 20   in index ");.  
de70: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
de80: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
de90: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
dea0: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29  Idx->pNext, j++)
deb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
dec0: 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f  ( pPk==pIdx ) co
ded0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
dee0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
def0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
df00: 74 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 33 29  t, iIdxCur+j, 3)
df10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ;.            ad
df20: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
df30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
df40: 20 38 2b 6a 2c 20 30 2c 20 33 29 3b 20 56 64 62   8+j, 0, 3); Vdb
df50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
df60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
df70: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
df80: 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29   SQLITE_NOTNULL)
df90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
dfa0: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
dfb0: 69 6e 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e  ing(v, 4, pIdx->
dfc0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
dfd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dfe0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63  ddOp3(v, OP_Conc
dff0: 61 74 2c 20 34 2c 20 32 2c 20 33 29 3b 0a 20 20  at, 4, 2, 3);.  
e000: 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 67 72            integr
e010: 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f  ityCheckResultRo
e020: 77 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  w(v);.          
e030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e040: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
e050: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e060: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
e070: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
e080: 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20  ECOUNT */.      
e090: 7d 20 0a 20 20 20 20 7d 0a 20 20 20 20 7b 0a 20  } .    }.    {. 
e0a0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
e0b0: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
e0c0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
e0d0: 29 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  );.      static 
e0e0: 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
e0f0: 20 65 6e 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20   endCode[] = {. 
e100: 20 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49         { OP_AddI
e110: 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20  mm,      1, 0,  
e120: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
e130: 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  0 */.        { O
e140: 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 20 20 31  P_IfNotZero,   1
e150: 2c 20 34 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 4,        0}, 
e160: 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20     /* 1 */.     
e170: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c     { OP_String8,
e180: 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20       0, 3,      
e190: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f    0},    /* 2 */
e1a0: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  .        { OP_Re
e1b0: 73 75 6c 74 52 6f 77 2c 20 20 20 33 2c 20 31 2c  sultRow,   3, 1,
e1c0: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
e1d0: 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 3 */.        {
e1e0: 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20 20 20 20   OP_Halt,       
e1f0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
e200: 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20  ,    /* 4 */.   
e210: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
e220: 38 2c 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20  8,     0, 3,    
e230: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 35 20      0},    /* 5 
e240: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
e250: 47 6f 74 6f 2c 20 20 20 20 20 20 20 20 30 2c 20  Goto,        0, 
e260: 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  3,        0},   
e270: 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7d   /* 6 */.      }
e280: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
e290: 61 4f 70 3b 0a 0a 20 20 20 20 20 20 61 4f 70 20  aOp;..      aOp 
e2a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e2b0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
e2c0: 69 7a 65 28 65 6e 64 43 6f 64 65 29 2c 20 65 6e  ize(endCode), en
e2d0: 64 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a 20 20 20  dCode, iLn);.   
e2e0: 20 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20     if( aOp ){.  
e2f0: 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 32 20        aOp[0].p2 
e300: 3d 20 31 2d 6d 78 45 72 72 3b 0a 20 20 20 20 20  = 1-mxErr;.     
e310: 20 20 20 61 4f 70 5b 32 5d 2e 70 34 74 79 70 65     aOp[2].p4type
e320: 20 3d 20 50 34 5f 53 54 41 54 49 43 3b 0a 20 20   = P4_STATIC;.  
e330: 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 2e        aOp[2].p4.
e340: 7a 20 3d 20 22 6f 6b 22 3b 0a 20 20 20 20 20 20  z = "ok";.      
e350: 20 20 61 4f 70 5b 35 5d 2e 70 34 74 79 70 65 20    aOp[5].p4type 
e360: 3d 20 50 34 5f 53 54 41 54 49 43 3b 0a 20 20 20  = P4_STATIC;.   
e370: 20 20 20 20 20 61 4f 70 5b 35 5d 2e 70 34 2e 7a       aOp[5].p4.z
e380: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
e390: 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 43  3ErrStr(SQLITE_C
e3a0: 4f 52 52 55 50 54 29 3b 0a 20 20 20 20 20 20 7d  ORRUPT);.      }
e3b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e3c0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 30 2c  beChangeP3(v, 0,
e3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
e3e0: 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20  entAddr(v)-2);. 
e3f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
e400: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
e410: 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
e420: 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
e430: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e440: 55 54 46 31 36 0a 20 20 2f 2a 0a 20 20 2a 2a 20  UTF16.  /*.  ** 
e450: 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e    PRAGMA encodin
e460: 67 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  g.  **   PRAGMA 
e470: 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75 74 66 2d  encoding = "utf-
e480: 38 22 7c 22 75 74 66 2d 31 36 22 7c 22 75 74 66  8"|"utf-16"|"utf
e490: 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31 36 62 65  -16le"|"utf-16be
e4a0: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 69  ".  **.  ** In i
e4b0: 74 73 20 66 69 72 73 74 20 66 6f 72 6d 2c 20 74  ts first form, t
e4c0: 68 69 73 20 70 72 61 67 6d 61 20 72 65 74 75 72  his pragma retur
e4d0: 6e 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  ns the encoding 
e4e0: 6f 66 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a  of the main.  **
e4f0: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
e500: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
e510: 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 69  t initialized, i
e520: 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
e530: 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   now..  **.  ** 
e540: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
e550: 6f 66 20 74 68 69 73 20 70 72 61 67 6d 61 20 69  of this pragma i
e560: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
e570: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
e580: 69 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74  ile.  ** has not
e590: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
e5a0: 69 74 69 61 6c 69 7a 65 64 2e 20 49 6e 20 74 68  itialized. In th
e5b0: 69 73 20 63 61 73 65 20 69 74 20 73 65 74 73 20  is case it sets 
e5c0: 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a  the default.  **
e5d0: 20 65 6e 63 6f 64 69 6e 67 20 74 68 61 74 20 77   encoding that w
e5e0: 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
e5f0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
e600: 65 20 66 69 6c 65 20 69 66 20 61 20 6e 65 77 20  e file if a new 
e610: 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 63 72 65  file.  ** is cre
e620: 61 74 65 64 2e 20 49 66 20 61 6e 20 65 78 69 73  ated. If an exis
e630: 74 69 6e 67 20 6d 61 69 6e 20 64 61 74 61 62 61  ting main databa
e640: 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
e650: 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  d, then the.  **
e660: 20 64 65 66 61 75 6c 74 20 74 65 78 74 20 65 6e   default text en
e670: 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 65  coding for the e
e680: 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
e690: 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2a 20 0a   is used..  ** .
e6a0: 20 20 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65    ** In all case
e6b0: 73 20 6e 65 77 20 64 61 74 61 62 61 73 65 73 20  s new databases 
e6c0: 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
e6d0: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
e6e0: 20 61 72 65 0a 20 20 2a 2a 20 63 72 65 61 74 65   are.  ** create
e6f0: 64 20 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d  d to use the sam
e700: 65 20 64 65 66 61 75 6c 74 20 74 65 78 74 20 65  e default text e
e710: 6e 63 6f 64 69 6e 67 20 61 73 20 74 68 65 20 6d  ncoding as the m
e720: 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 49 66  ain database. If
e730: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64  .  ** the main d
e740: 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20  atabase has not 
e750: 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
e760: 20 61 6e 64 2f 6f 72 20 63 72 65 61 74 65 64 20   and/or created 
e770: 77 68 65 6e 20 41 54 54 41 43 48 0a 20 20 2a 2a  when ATTACH.  **
e780: 20 69 73 20 65 78 65 63 75 74 65 64 2c 20 74 68   is executed, th
e790: 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
e7a0: 65 20 74 68 65 20 41 54 54 41 43 48 20 6f 70 65  e the ATTACH ope
e7b0: 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  ration..  **.  *
e7c0: 2a 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  * In the second 
e7d0: 66 6f 72 6d 20 74 68 69 73 20 70 72 61 67 6d 61  form this pragma
e7e0: 20 73 65 74 73 20 74 68 65 20 74 65 78 74 20 65   sets the text e
e7f0: 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65 20 75 73  ncoding to be us
e800: 65 64 20 69 6e 0a 20 20 2a 2a 20 6e 65 77 20 64  ed in.  ** new d
e810: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72  atabase files cr
e820: 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 69 73  eated using this
e830: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
e840: 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a 20 20 2a  . It is only.  *
e850: 2a 20 75 73 65 66 75 6c 20 69 66 20 69 6e 76 6f  * useful if invo
e860: 6b 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ked immediately 
e870: 61 66 74 65 72 20 74 68 65 20 6d 61 69 6e 20 64  after the main d
e880: 61 74 61 62 61 73 65 20 69 0a 20 20 2a 2f 0a 20  atabase i.  */. 
e890: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 45 4e   case PragTyp_EN
e8a0: 43 4f 44 49 4e 47 3a 20 7b 0a 20 20 20 20 73 74  CODING: {.    st
e8b0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
e8c0: 74 20 45 6e 63 4e 61 6d 65 20 7b 0a 20 20 20 20  t EncName {.    
e8d0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
e8e0: 20 20 20 20 20 75 38 20 65 6e 63 3b 0a 20 20 20       u8 enc;.   
e8f0: 20 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20   } encnames[] = 
e900: 7b 0a 20 20 20 20 20 20 7b 20 22 55 54 46 38 22  {.      { "UTF8"
e910: 2c 20 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 0a 20 20 20 20  8        },.    
e930: 20 20 7b 20 22 55 54 46 2d 38 22 2c 20 20 20 20    { "UTF-8",    
e940: 53 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20  SQLITE_UTF8     
e950: 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62     },  /* Must b
e960: 65 20 65 6c 65 6d 65 6e 74 20 5b 31 5d 20 2a 2f  e element [1] */
e970: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36  .      { "UTF-16
e980: 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  le", SQLITE_UTF1
e990: 36 4c 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d  6LE     },  /* M
e9a0: 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b  ust be element [
e9b0: 32 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55  2] */.      { "U
e9c0: 54 46 2d 31 36 62 65 22 2c 20 53 51 4c 49 54 45  TF-16be", SQLITE
e9d0: 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c 20  _UTF16BE     }, 
e9e0: 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d   /* Must be elem
e9f0: 65 6e 74 20 5b 33 5d 20 2a 2f 0a 20 20 20 20 20  ent [3] */.     
ea00: 20 7b 20 22 55 54 46 31 36 6c 65 22 2c 20 20 53   { "UTF16le",  S
ea10: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20  QLITE_UTF16LE   
ea20: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54    },.      { "UT
ea30: 46 31 36 62 65 22 2c 20 20 53 51 4c 49 54 45 5f  F16be",  SQLITE_
ea40: 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c 0a 20  UTF16BE     },. 
ea50: 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 22 2c       { "UTF-16",
ea60: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
ea70: 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49        }, /* SQLI
ea80: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 2a  TE_UTF16NATIVE *
ea90: 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31 36  /.      { "UTF16
eaa0: 22 2c 20 20 20 20 30 20 20 20 20 20 20 20 20 20  ",    0         
eab0: 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53           }, /* S
eac0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
ead0: 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 30 2c 20  E */.      { 0, 
eae0: 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63  0 }.    };.    c
eaf0: 6f 6e 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e  onst struct EncN
eb00: 61 6d 65 20 2a 70 45 6e 63 3b 0a 20 20 20 20 69  ame *pEnc;.    i
eb10: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 20 20 20  f( !zRight ){   
eb20: 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f   /* "PRAGMA enco
eb30: 64 69 6e 67 22 20 2a 2f 0a 20 20 20 20 20 20 69  ding" */.      i
eb40: 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63  f( sqlite3ReadSc
eb50: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
eb60: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
eb70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e        assert( en
eb80: 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54  cnames[SQLITE_UT
eb90: 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  F8].enc==SQLITE_
eba0: 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 61 73  UTF8 );.      as
ebb0: 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53  sert( encnames[S
ebc0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 5d 2e 65  QLITE_UTF16LE].e
ebd0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
ebe0: 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LE );.      asse
ebf0: 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c  rt( encnames[SQL
ec00: 49 54 45 5f 55 54 46 31 36 42 45 5d 2e 65 6e 63  ITE_UTF16BE].enc
ec10: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
ec20: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
ec30: 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 65 6e  SingleText(v, en
ec40: 63 6e 61 6d 65 73 5b 45 4e 43 28 70 50 61 72 73  cnames[ENC(pPars
ec50: 65 2d 3e 64 62 29 5d 2e 7a 4e 61 6d 65 29 3b 0a  e->db)].zName);.
ec60: 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20      }else{      
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63    /* "PRAGMA enc
ec90: 6f 64 69 6e 67 20 3d 20 58 58 58 22 20 2a 2f 0a  oding = XXX" */.
eca0: 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 63 68        /* Only ch
ecb0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
ecc0: 66 20 73 71 6c 69 74 65 2e 65 6e 63 20 69 66 20  f sqlite.enc if 
ecd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
ece0: 64 6c 65 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  dle is not.     
ecf0: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   ** initialized.
ed00: 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   If the main dat
ed10: 61 62 61 73 65 20 65 78 69 73 74 73 2c 20 74 68  abase exists, th
ed20: 65 20 6e 65 77 20 73 71 6c 69 74 65 2e 65 6e 63  e new sqlite.enc
ed30: 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
ed40: 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
ed50: 74 65 6e 20 77 68 65 6e 20 74 68 65 20 73 63 68  ten when the sch
ed60: 65 6d 61 20 69 73 20 6e 65 78 74 20 6c 6f 61 64  ema is next load
ed70: 65 64 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e  ed. If it does n
ed80: 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  ot.      ** alre
ed90: 61 64 79 20 65 78 69 73 74 73 2c 20 69 74 20 77  ady exists, it w
eda0: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 74  ill be created t
edb0: 6f 20 75 73 65 20 74 68 65 20 6e 65 77 20 65 6e  o use the new en
edc0: 63 6f 64 69 6e 67 20 76 61 6c 75 65 2e 0a 20 20  coding value..  
edd0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
ede0: 20 0a 20 20 20 20 20 20 20 20 21 28 44 62 48 61   .        !(DbHa
edf0: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 30 2c  sProperty(db, 0,
ee00: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
ee10: 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 44  )) || .        D
ee20: 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
ee30: 20 30 2c 20 44 42 5f 45 6d 70 74 79 29 20 0a 20   0, DB_Empty) . 
ee40: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
ee50: 66 6f 72 28 70 45 6e 63 3d 26 65 6e 63 6e 61 6d  for(pEnc=&encnam
ee60: 65 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e 7a 4e 61  es[0]; pEnc->zNa
ee70: 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a 20 20 20  me; pEnc++){.   
ee80: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71         if( 0==sq
ee90: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69  lite3StrICmp(zRi
eea0: 67 68 74 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65  ght, pEnc->zName
eeb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
eec0: 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 20   SCHEMA_ENC(db) 
eed0: 3d 20 45 4e 43 28 64 62 29 20 3d 0a 20 20 20 20  = ENC(db) =.    
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 6e 63              pEnc
eef0: 2d 3e 65 6e 63 20 3f 20 70 45 6e 63 2d 3e 65 6e  ->enc ? pEnc->en
ef00: 63 20 3a 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c : SQLITE_UTF16
ef10: 4e 41 54 49 56 45 3b 0a 20 20 20 20 20 20 20 20  NATIVE;.        
ef20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ef30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
ef40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 45  .        if( !pE
ef50: 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  nc->zName ){.   
ef60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
ef70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
ef80: 75 6e 73 75 70 70 6f 72 74 65 64 20 65 6e 63 6f  unsupported enco
ef90: 64 69 6e 67 3a 20 25 73 22 2c 20 7a 52 69 67 68  ding: %s", zRigh
efa0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
efb0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
efc0: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
efd0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
efe0: 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TF16 */..#ifndef
eff0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
f000: 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47  EMA_VERSION_PRAG
f010: 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  MAS.  /*.  **   
f020: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
f030: 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 0a 20  schema_version. 
f040: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
f050: 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72  hema.]schema_ver
f060: 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e  sion = <integer>
f070: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  **.  **   PRA
f080: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65  GMA [schema.]use
f090: 72 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20  r_version.  **  
f0a0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
f0b0: 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 20 3d 20  ]user_version = 
f0c0: 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20  <integer>.  **. 
f0d0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
f0e0: 68 65 6d 61 2e 5d 66 72 65 65 6c 69 73 74 5f 63  hema.]freelist_c
f0f0: 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ount.  **.  **  
f100: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
f110: 5d 64 61 74 61 5f 76 65 72 73 69 6f 6e 0a 20 20  ]data_version.  
f120: 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  **.  **   PRAGMA
f130: 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63   [schema.]applic
f140: 61 74 69 6f 6e 5f 69 64 0a 20 20 2a 2a 20 20 20  ation_id.  **   
f150: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
f160: 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 20 3d  application_id =
f170: 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a   <integer>.  **.
f180: 20 20 2a 2a 20 54 68 65 20 70 72 61 67 6d 61 27    ** The pragma'
f190: 73 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e  s schema_version
f1a0: 20 61 6e 64 20 75 73 65 72 5f 76 65 72 73 69 6f   and user_versio
f1b0: 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 65  n are used to se
f1c0: 74 20 6f 72 20 67 65 74 0a 20 20 2a 2a 20 74 68  t or get.  ** th
f1d0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
f1e0: 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e  chema-version an
f1f0: 64 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 2c 20  d user-version, 
f200: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 42 6f  respectively. Bo
f210: 74 68 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  th.  ** the sche
f220: 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20 74  ma-version and t
f230: 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20  he user-version 
f240: 61 72 65 20 33 32 2d 62 69 74 20 73 69 67 6e 65  are 32-bit signe
f250: 64 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20  d integers.  ** 
f260: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
f270: 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 0a 20  tabase header.. 
f280: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 63 68   **.  ** The sch
f290: 65 6d 61 2d 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema-cookie is us
f2a0: 75 61 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69 70  ually only manip
f2b0: 75 6c 61 74 65 64 20 69 6e 74 65 72 6e 61 6c 6c  ulated internall
f2c0: 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74 0a  y by SQLite. It.
f2d0: 20 20 2a 2a 20 69 73 20 69 6e 63 72 65 6d 65 6e    ** is incremen
f2e0: 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  ted by SQLite wh
f2f0: 65 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62  enever the datab
f300: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6d 6f  ase schema is mo
f310: 64 69 66 69 65 64 20 28 62 79 0a 20 20 2a 2a 20  dified (by.  ** 
f320: 63 72 65 61 74 69 6e 67 20 6f 72 20 64 72 6f 70  creating or drop
f330: 70 69 6e 67 20 61 20 74 61 62 6c 65 20 6f 72 20  ping a table or 
f340: 69 6e 64 65 78 29 2e 20 54 68 65 20 73 63 68 65  index). The sche
f350: 6d 61 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73  ma version is us
f360: 65 64 20 62 79 0a 20 20 2a 2a 20 53 51 4c 69 74  ed by.  ** SQLit
f370: 65 20 65 61 63 68 20 74 69 6d 65 20 61 20 71 75  e each time a qu
f380: 65 72 79 20 69 73 20 65 78 65 63 75 74 65 64 20  ery is executed 
f390: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
f3a0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
f3b0: 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63  e.  ** of the sc
f3c0: 68 65 6d 61 20 75 73 65 64 20 77 68 65 6e 20 63  hema used when c
f3d0: 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c  ompiling the SQL
f3e0: 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 20 74   query matches t
f3f0: 68 65 20 73 63 68 65 6d 61 20 6f 66 0a 20 20 2a  he schema of.  *
f400: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
f410: 67 61 69 6e 73 74 20 77 68 69 63 68 20 74 68 65  gainst which the
f420: 20 63 6f 6d 70 69 6c 65 64 20 71 75 65 72 79 20   compiled query 
f430: 69 73 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  is actually exec
f440: 75 74 65 64 2e 0a 20 20 2a 2a 20 53 75 62 76 65  uted..  ** Subve
f450: 72 74 69 6e 67 20 74 68 69 73 20 6d 65 63 68 61  rting this mecha
f460: 6e 69 73 6d 20 62 79 20 75 73 69 6e 67 20 22 50  nism by using "P
f470: 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72  RAGMA schema_ver
f480: 73 69 6f 6e 22 20 74 6f 20 6d 6f 64 69 66 79 0a  sion" to modify.
f490: 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d    ** the schema-
f4a0: 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 74 65 6e  version is poten
f4b0: 74 69 61 6c 6c 79 20 64 61 6e 67 65 72 6f 75 73  tially dangerous
f4c0: 20 61 6e 64 20 6d 61 79 20 6c 65 61 64 20 74 6f   and may lead to
f4d0: 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 63 72   program.  ** cr
f4e0: 61 73 68 65 73 20 6f 72 20 64 61 74 61 62 61 73  ashes or databas
f4f0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 55 73  e corruption. Us
f500: 65 20 77 69 74 68 20 63 61 75 74 69 6f 6e 21 0a  e with caution!.
f510: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 75 73    **.  ** The us
f520: 65 72 2d 76 65 72 73 69 6f 6e 20 69 73 20 6e 6f  er-version is no
f530: 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
f540: 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74 20  y by SQLite. It 
f550: 6d 61 79 20 62 65 20 75 73 65 64 20 62 79 0a 20  may be used by. 
f560: 20 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73   ** applications
f570: 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65   for any purpose
f580: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
f590: 61 67 54 79 70 5f 48 45 41 44 45 52 5f 56 41 4c  agTyp_HEADER_VAL
f5a0: 55 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 43  UE: {.    int iC
f5b0: 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20  ookie;          
f5c0: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
f5d0: 20 63 6f 6f 6b 69 65 20 74 6f 20 72 65 61 64 20   cookie to read 
f5e0: 6f 72 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20  or write */.    
f5f0: 69 43 6f 6f 6b 69 65 20 3d 20 70 50 72 61 67 6d  iCookie = pPragm
f600: 61 2d 3e 69 41 72 67 20 26 20 50 52 41 47 4d 41  a->iArg & PRAGMA
f610: 5f 48 45 41 44 45 52 5f 56 41 4c 55 45 5f 4d 41  _HEADER_VALUE_MA
f620: 53 4b 3b 20 20 20 20 20 0a 20 20 20 20 73 71 6c  SK;     .    sql
f630: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
f640: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  e(v, iDb);.    i
f650: 66 28 20 7a 52 69 67 68 74 20 26 26 20 28 70 50  f( zRight && (pP
f660: 72 61 67 6d 61 2d 3e 69 41 72 67 20 26 20 50 52  ragma->iArg & PR
f670: 41 47 4d 41 5f 48 45 41 44 45 52 5f 56 41 4c 55  AGMA_HEADER_VALU
f680: 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29  E_READONLY)==0 )
f690: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  {.      /* Write
f6a0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63   the specified c
f6b0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
f6c0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
f6d0: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74  t VdbeOpList set
f6e0: 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20  Cookie[] = {.   
f6f0: 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61       { OP_Transa
f700: 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31 2c  ction,    0,  1,
f710: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f    0},    /* 0 */
f720: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65  .        { OP_Se
f730: 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c  tCookie,      0,
f740: 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20    0,  0},    /* 
f750: 31 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20  1 */.      };.  
f760: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
f770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f780: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
f790: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
f7a0: 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29  ySize(setCookie)
f7b0: 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73  );.      aOp = s
f7c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
f7d0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
f7e0: 28 73 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74  (setCookie), set
f7f0: 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20  Cookie, 0);.    
f800: 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45    if( ONLY_IF_RE
f810: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70  ALLOC_STRESS(aOp
f820: 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ==0) ) break;.  
f830: 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20      aOp[0].p1 = 
f840: 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  iDb;.      aOp[1
f850: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
f860: 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69 43    aOp[1].p2 = iC
f870: 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f 70  ookie;.      aOp
f880: 5b 31 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65 33  [1].p3 = sqlite3
f890: 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  Atoi(zRight);.  
f8a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
f8b0: 2a 20 52 65 61 64 20 74 68 65 20 73 70 65 63 69  * Read the speci
f8c0: 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75  fied cookie valu
f8d0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  e */.      stati
f8e0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
f8f0: 73 74 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d 20  st readCookie[] 
f900: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
f910: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
f920: 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20    0,  0,  0},   
f930: 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20   /* 0 */.       
f940: 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65   { OP_ReadCookie
f950: 2c 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20 30  ,      0,  1,  0
f960: 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  },    /* 1 */.  
f970: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c        { OP_Resul
f980: 74 52 6f 77 2c 20 20 20 20 20 20 20 31 2c 20 20  tRow,       1,  
f990: 31 2c 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b 0a  1,  0}.      };.
f9a0: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f        VdbeOp *aO
f9b0: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
f9c0: 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c  VdbeVerifyNoMall
f9d0: 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72  ocRequired(v, Ar
f9e0: 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b  raySize(readCook
f9f0: 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20  ie));.      aOp 
fa00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
fa10: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
fa20: 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 2c  ize(readCookie),
fa30: 72 65 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20  readCookie,0);. 
fa40: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
fa50: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
fa60: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
fa70: 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31  .      aOp[0].p1
fa80: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
fa90: 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[1].p1 = iDb;. 
faa0: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d       aOp[1].p3 =
fab0: 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20   iCookie;.      
fac0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61  sqlite3VdbeReusa
fad0: 62 6c 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  ble(v);.    }.  
fae0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
faf0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
fb00: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f  _SCHEMA_VERSION_
fb10: 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e  PRAGMAS */..#ifn
fb20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fb30: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
fb40: 41 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  AGS.  /*.  **   
fb50: 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f  PRAGMA compile_o
fb60: 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a  ptions.  **.  **
fb70: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
fb80: 73 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c 65  s of all compile
fb90: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75 73  -time options us
fba0: 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
fbb0: 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f  ,.  ** one optio
fbc0: 6e 20 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a  n per row..  */.
fbd0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
fbe0: 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20  OMPILE_OPTIONS: 
fbf0: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  {.    int i = 0;
fc00: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
fc10: 2a 7a 4f 70 74 3b 0a 20 20 20 20 70 50 61 72 73  *zOpt;.    pPars
fc20: 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20  e->nMem = 1;.   
fc30: 20 77 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20   while( (zOpt = 
fc40: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f  sqlite3_compileo
fc50: 70 74 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21  ption_get(i++))!
fc60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
fc70: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
fc80: 67 28 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20  g(v, 1, zOpt);. 
fc90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fca0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
fcb0: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
fcc0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
fcd0: 56 64 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b  VdbeReusable(v);
fce0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
fcf0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
fd00: 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
fd10: 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66 6e  N_DIAGS */..#ifn
fd20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fd30: 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  WAL.  /*.  **   
fd40: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
fd50: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 3d  wal_checkpoint =
fd60: 20 70 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72 65   passive|full|re
fd70: 73 74 61 72 74 7c 74 72 75 6e 63 61 74 65 0a 20  start|truncate. 
fd80: 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70 6f   **.  ** Checkpo
fd90: 69 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  int the database
fda0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
fdb0: 61 67 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b 50  agTyp_WAL_CHECKP
fdc0: 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  OINT: {.    int 
fdd0: 69 42 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69  iBt = (pId2->z?i
fde0: 44 62 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  Db:SQLITE_MAX_AT
fdf0: 54 41 43 48 45 44 29 3b 0a 20 20 20 20 69 6e 74  TACHED);.    int
fe00: 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f   eMode = SQLITE_
fe10: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
fe20: 56 45 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  VE;.    if( zRig
fe30: 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ht ){.      if( 
fe40: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
fe50: 52 69 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d  Right, "full")==
fe60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
fe70: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
fe80: 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20  KPOINT_FULL;.   
fe90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
fea0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67  ite3StrICmp(zRig
feb0: 68 74 2c 20 22 72 65 73 74 61 72 74 22 29 3d 3d  ht, "restart")==
fec0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
fed0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
fee0: 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a  KPOINT_RESTART;.
fef0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ff00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
ff10: 52 69 67 68 74 2c 20 22 74 72 75 6e 63 61 74 65  Right, "truncate
ff20: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
ff30: 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f   eMode = SQLITE_
ff40: 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43  CHECKPOINT_TRUNC
ff50: 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ATE;.      }.   
ff60: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e   }.    pParse->n
ff70: 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71 6c  Mem = 3;.    sql
ff80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ff90: 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c  , OP_Checkpoint,
ffa0: 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b   iBt, eMode, 1);
ffb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ffc0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
ffd0: 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20  ultRow, 1, 3);. 
ffe0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f   }.  break;..  /
fff0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
10000 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
10010 6e 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  nt.  **   PRAGMA
10020 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
10030 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a  int = N.  **.  *
10040 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 20 64 61  * Configure a da
10050 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10060 6e 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  n to automatical
10070 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 20  ly checkpoint a 
10080 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 66  database.  ** af
10090 74 65 72 20 61 63 63 75 6d 75 6c 61 74 69 6e 67  ter accumulating
100a0 20 4e 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65   N frames in the
100b0 20 6c 6f 67 2e 20 4f 72 20 71 75 65 72 79 20 66   log. Or query f
100c0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  or the current v
100d0 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a  alue.  ** of N..
100e0 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
100f0 54 79 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43  Typ_WAL_AUTOCHEC
10100 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 66  KPOINT: {.    if
10110 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
10120 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
10130 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  tocheckpoint(db,
10140 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69   sqlite3Atoi(zRi
10150 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ght));.    }.   
10160 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
10170 28 76 2c 20 0a 20 20 20 20 20 20 20 64 62 2d 3e  (v, .       db->
10180 78 57 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73 71  xWalCallback==sq
10190 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
101a0 6f 6f 6b 20 3f 20 0a 20 20 20 20 20 20 20 20 20  ook ? .         
101b0 20 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f    SQLITE_PTR_TO_
101c0 49 4e 54 28 64 62 2d 3e 70 57 61 6c 41 72 67 29  INT(db->pWalArg)
101d0 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65   : 0);.  }.  bre
101e0 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ak;.#endif..  /*
101f0 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 68  .  **  PRAGMA sh
10200 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a  rink_memory.  **
10210 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
10220 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34 35  TION-OF: R-23445
10230 2d 34 36 31 30 39 20 54 68 69 73 20 70 72 61 67  -46109 This prag
10240 6d 61 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ma causes the da
10250 74 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e  tabase.  ** conn
10260 65 63 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68 20  ection on which 
10270 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  it is invoked to
10280 20 66 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   free up as much
10290 20 6d 65 6d 6f 72 79 20 61 73 20 69 74 0a 20 20   memory as it.  
102a0 2a 2a 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c 69  ** can, by calli
102b0 6e 67 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  ng sqlite3_db_re
102c0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a  lease_memory()..
102d0 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
102e0 54 79 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52  Typ_SHRINK_MEMOR
102f0 59 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  Y: {.    sqlite3
10300 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
10310 72 79 28 64 62 29 3b 0a 20 20 20 20 62 72 65 61  ry(db);.    brea
10320 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
10330 2a 20 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69  *  PRAGMA optimi
10340 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  ze.  **  PRAGMA 
10350 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20  optimize(MASK). 
10360 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65   **  PRAGMA sche
10370 6d 61 2e 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a  ma.optimize.  **
10380 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61 2e    PRAGMA schema.
10390 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20  optimize(MASK). 
103a0 20 2a 2a 0a 20 20 2a 2a 20 41 74 74 65 6d 70 74   **.  ** Attempt
103b0 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65   to optimize the
103c0 20 64 61 74 61 62 61 73 65 2e 20 20 41 6c 6c 20   database.  All 
103d0 73 63 68 65 6d 61 73 20 61 72 65 20 6f 70 74 69  schemas are opti
103e0 6d 69 7a 65 64 20 69 6e 20 74 68 65 20 66 69 72  mized in the fir
103f0 73 74 0a 20 20 2a 2a 20 74 77 6f 20 66 6f 72 6d  st.  ** two form
10400 73 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 20  s, and only the 
10410 73 70 65 63 69 66 69 65 64 20 73 63 68 65 6d 61  specified schema
10420 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e   is optimized in
10430 20 74 68 65 20 6c 61 74 74 65 72 20 74 77 6f 2e   the latter two.
10440 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
10450 65 74 61 69 6c 73 20 6f 66 20 6f 70 74 69 6d 69  etails of optimi
10460 7a 61 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  zations performe
10470 64 20 62 79 20 74 68 69 73 20 70 72 61 67 6d 61  d by this pragma
10480 20 61 72 65 20 65 78 70 65 63 74 65 64 0a 20 20   are expected.  
10490 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 64  ** to change and
104a0 20 69 6d 70 72 6f 76 65 20 6f 76 65 72 20 74 69   improve over ti
104b0 6d 65 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e  me.  Application
104c0 73 20 73 68 6f 75 6c 64 20 61 6e 74 69 63 69 70  s should anticip
104d0 61 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ate that.  ** th
104e0 69 73 20 70 72 61 67 6d 61 20 77 69 6c 6c 20 70  is pragma will p
104f0 65 72 66 6f 72 6d 20 6e 65 77 20 6f 70 74 69 6d  erform new optim
10500 69 7a 61 74 69 6f 6e 73 20 69 6e 20 66 75 74 75  izations in futu
10510 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a  re releases..  *
10520 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 70 74 69 6f  *.  ** The optio
10530 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 69 73 20  nal argument is 
10540 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74  a bitmask of opt
10550 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 70 65  imizations to pe
10560 72 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  rform:.  **.  **
10570 20 20 20 20 30 78 30 30 30 31 20 20 20 20 44 65      0x0001    De
10580 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 44  bugging mode.  D
10590 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 70  o not actually p
105a0 65 72 66 6f 72 6d 20 61 6e 79 20 6f 70 74 69 6d  erform any optim
105b0 69 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 20 20  izations.  **   
105c0 20 20 20 20 20 20 20 20 20 20 20 62 75 74 20 69             but i
105d0 6e 73 74 65 61 64 20 72 65 74 75 72 6e 20 6f 6e  nstead return on
105e0 65 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  e line of text f
105f0 6f 72 20 65 61 63 68 20 6f 70 74 69 6d 69 7a 61  or each optimiza
10600 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20  tion.  **       
10610 20 20 20 20 20 20 20 74 68 61 74 20 77 6f 75 6c         that woul
10620 64 20 68 61 76 65 20 62 65 65 6e 20 64 6f 6e 65  d have been done
10630 2e 20 20 4f 66 66 20 62 79 20 64 65 66 61 75 6c  .  Off by defaul
10640 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  t..  **.  **    
10650 30 78 30 30 30 32 20 20 20 20 52 75 6e 20 41 4e  0x0002    Run AN
10660 41 4c 59 5a 45 20 6f 6e 20 74 61 62 6c 65 73 20  ALYZE on tables 
10670 74 68 61 74 20 6d 69 67 68 74 20 62 65 6e 65 66  that might benef
10680 69 74 2e 20 20 4f 6e 20 62 79 20 64 65 66 61 75  it.  On by defau
10690 6c 74 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  lt..  **        
106a0 20 20 20 20 20 20 53 65 65 20 62 65 6c 6f 77 20        See below 
106b0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
106c0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a  nformation..  **
106d0 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 34 20  .  **    0x0004 
106e0 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c     (Not yet impl
106f0 65 6d 65 6e 74 65 64 29 20 52 65 63 6f 72 64 20  emented) Record 
10700 75 73 61 67 65 20 61 6e 64 20 70 65 72 66 6f 72  usage and perfor
10710 6d 61 6e 63 65 20 0a 20 20 2a 2a 20 20 20 20 20  mance .  **     
10720 20 20 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61           informa
10730 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63 75  tion from the cu
10740 72 72 65 6e 74 20 73 65 73 73 69 6f 6e 20 69 6e  rrent session in
10750 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 20   the.  **       
10760 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
10770 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
10780 77 69 6c 6c 20 62 65 20 61 76 61 69 6c 61 62 6c  will be availabl
10790 65 20 74 6f 20 22 6f 70 74 69 6d 69 7a 65 22 0a  e to "optimize".
107a0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
107b0 20 20 70 72 61 67 6d 61 73 20 72 75 6e 20 62 79    pragmas run by
107c0 20 66 75 74 75 72 65 20 64 61 74 61 62 61 73 65   future database
107d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
107e0 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30  **.  **    0x000
107f0 38 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d  8    (Not yet im
10800 70 6c 65 6d 65 6e 74 65 64 29 20 43 72 65 61 74  plemented) Creat
10810 65 20 69 6e 64 65 78 65 73 20 74 68 61 74 20 6d  e indexes that m
10820 69 67 68 74 20 68 61 76 65 0a 20 20 2a 2a 20 20  ight have.  **  
10830 20 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e              been
10840 20 68 65 6c 70 66 75 6c 20 74 6f 20 72 65 63 65   helpful to rece
10850 6e 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 0a  nt queries.  **.
10860 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74    ** The default
10870 20 4d 41 53 4b 20 69 73 20 61 6e 64 20 61 6c 77   MASK is and alw
10880 61 79 73 20 73 68 61 6c 6c 20 62 65 20 30 78 66  ays shall be 0xf
10890 66 66 65 2e 20 20 30 78 66 66 66 65 20 6d 65 61  ffe.  0xfffe mea
108a0 6e 73 20 70 65 72 66 6f 72 6d 20 61 6c 6c 0a 20  ns perform all. 
108b0 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6d   ** of the optim
108c0 69 7a 61 74 69 6f 6e 73 20 6c 69 73 74 65 64 20  izations listed 
108d0 61 62 6f 76 65 20 65 78 63 65 70 74 20 44 65 62  above except Deb
108e0 75 67 20 4d 6f 64 65 2c 20 69 6e 63 6c 75 64 69  ug Mode, includi
108f0 6e 67 20 6e 65 77 0a 20 20 2a 2a 20 6f 70 74 69  ng new.  ** opti
10900 6d 69 7a 61 74 69 6f 6e 73 20 74 68 61 74 20 68  mizations that h
10910 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
10920 20 69 6e 76 65 6e 74 65 64 2e 20 20 49 66 20 6e   invented.  If n
10930 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ew optimizations
10940 20 61 72 65 0a 20 20 2a 2a 20 65 76 65 72 20 61   are.  ** ever a
10950 64 64 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64  dded that should
10960 20 62 65 20 6f 66 66 20 62 79 20 64 65 66 61 75   be off by defau
10970 6c 74 2c 20 74 68 6f 73 65 20 6f 66 66 2d 62 79  lt, those off-by
10980 2d 64 65 66 61 75 6c 74 20 0a 20 20 2a 2a 20 6f  -default .  ** o
10990 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 69 6c  ptimizations wil
109a0 6c 20 68 61 76 65 20 62 69 74 6d 61 73 6b 73 20  l have bitmasks 
109b0 6f 66 20 30 78 31 30 30 30 30 20 6f 72 20 6c 61  of 0x10000 or la
109c0 72 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rger..  **.  ** 
109d0 44 45 54 45 52 4d 49 4e 41 54 49 4f 4e 20 4f 46  DETERMINATION OF
109e0 20 57 48 45 4e 20 54 4f 20 52 55 4e 20 41 4e 41   WHEN TO RUN ANA
109f0 4c 59 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  LYZE.  **.  ** I
10a00 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
10a10 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20  plementation, a 
10a20 74 61 62 6c 65 20 69 73 20 61 6e 61 6c 79 7a 65  table is analyze
10a30 64 20 69 66 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  d if only if all
10a40 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c   of.  ** the fol
10a50 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
10a60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 29 20 4d  .  **.  ** (1) M
10a70 41 53 4b 20 62 69 74 20 30 78 30 32 20 69 73 20  ASK bit 0x02 is 
10a80 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28  set..  **.  ** (
10a90 32 29 20 54 68 65 20 71 75 65 72 79 20 70 6c 61  2) The query pla
10aa0 6e 6e 65 72 20 75 73 65 64 20 73 71 6c 69 74 65  nner used sqlite
10ab0 5f 73 74 61 74 31 2d 73 74 79 6c 65 20 73 74 61  _stat1-style sta
10ac0 74 69 73 74 69 63 73 20 66 6f 72 20 6f 6e 65 20  tistics for one 
10ad0 6f 72 0a 20 20 2a 2a 20 20 20 20 20 6d 6f 72 65  or.  **     more
10ae0 20 69 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20   indexes of the 
10af0 74 61 62 6c 65 20 61 74 20 73 6f 6d 65 20 70 6f  table at some po
10b00 69 6e 74 20 64 75 72 69 6e 67 20 74 68 65 20 6c  int during the l
10b10 69 66 65 74 69 6d 65 20 6f 66 0a 20 20 2a 2a 20  ifetime of.  ** 
10b20 20 20 20 20 74 68 65 20 63 75 72 72 65 6e 74 20      the current 
10b30 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
10b40 0a 20 20 2a 2a 20 28 33 29 20 4f 6e 65 20 6f 72  .  ** (3) One or
10b50 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66   more indexes of
10b60 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 63   the table are c
10b70 75 72 72 65 6e 74 6c 79 20 75 6e 61 6e 61 6c 79  urrently unanaly
10b80 7a 65 64 20 4f 52 0a 20 20 2a 2a 20 20 20 20 20  zed OR.  **     
10b90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
10ba0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
10bb0 68 61 73 20 69 6e 63 72 65 61 73 65 64 20 62 79  has increased by
10bc0 20 32 35 20 74 69 6d 65 73 20 6f 72 20 6d 6f 72   25 times or mor
10bd0 65 0a 20 20 2a 2a 20 20 20 20 20 73 69 6e 63 65  e.  **     since
10be0 20 74 68 65 20 6c 61 73 74 20 74 69 6d 65 20 41   the last time A
10bf0 4e 41 4c 59 5a 45 20 77 61 73 20 72 75 6e 2e 0a  NALYZE was run..
10c00 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75    **.  ** The ru
10c10 6c 65 73 20 66 6f 72 20 77 68 65 6e 20 74 61 62  les for when tab
10c20 6c 65 73 20 61 72 65 20 61 6e 61 6c 79 7a 65 64  les are analyzed
10c30 20 61 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63   are likely to c
10c40 68 61 6e 67 65 20 69 6e 0a 20 20 2a 2a 20 66 75  hange in.  ** fu
10c50 74 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20  ture releases.. 
10c60 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
10c70 79 70 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b 0a 20  yp_OPTIMIZE: {. 
10c80 20 20 20 69 6e 74 20 69 44 62 4c 61 73 74 3b 20     int iDbLast; 
10c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
10ca0 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 70 6f  p termination po
10cb0 69 6e 74 20 66 6f 72 20 74 68 65 20 73 63 68 65  int for the sche
10cc0 6d 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  ma loop */.    i
10cd0 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20  nt iTabCur;     
10ce0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
10cf0 66 6f 72 20 61 20 74 61 62 6c 65 20 77 68 6f 73  for a table whos
10d00 65 20 73 69 7a 65 20 6e 65 65 64 73 20 63 68 65  e size needs che
10d10 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 48 61 73  cking */.    Has
10d20 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20  hElem *k;       
10d30 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72      /* Loop over
10d40 20 74 61 62 6c 65 73 20 6f 66 20 61 20 73 63 68   tables of a sch
10d50 65 6d 61 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d  ema */.    Schem
10d60 61 20 2a 70 53 63 68 65 6d 61 3b 20 20 20 20 20  a *pSchema;     
10d70 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
10d80 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 54   schema */.    T
10d90 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
10da0 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
10db0 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a   in the schema *
10dc0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
10dd0 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x;           /* 
10de0 41 6e 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  An index of the 
10df0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4c 6f 67  table */.    Log
10e00 45 73 74 20 73 7a 54 68 72 65 73 68 6f 6c 64 3b  Est szThreshold;
10e10 20 20 20 20 2f 2a 20 53 69 7a 65 20 74 68 72 65      /* Size thre
10e20 73 68 6f 6c 64 20 61 62 6f 76 65 20 77 68 69 63  shold above whic
10e30 68 20 72 65 61 6e 61 6c 79 73 69 73 20 69 73 20  h reanalysis is 
10e40 6e 65 65 64 64 20 2a 2f 0a 20 20 20 20 63 68 61  needd */.    cha
10e50 72 20 2a 7a 53 75 62 53 71 6c 3b 20 20 20 20 20  r *zSubSql;     
10e60 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65      /* SQL state
10e70 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 4f 50 5f  ment for the OP_
10e80 53 71 6c 45 78 65 63 20 6f 70 63 6f 64 65 20 2a  SqlExec opcode *
10e90 2f 0a 20 20 20 20 75 33 32 20 6f 70 4d 61 73 6b  /.    u32 opMask
10ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10eb0 4d 61 73 6b 20 6f 66 20 6f 70 65 72 61 74 69 6f  Mask of operatio
10ec0 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f  ns to perform */
10ed0 0a 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ..    if( zRight
10ee0 20 29 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b   ){.      opMask
10ef0 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 41   = (u32)sqlite3A
10f00 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  toi(zRight);.   
10f10 20 20 20 69 66 28 20 28 6f 70 4d 61 73 6b 20 26     if( (opMask &
10f20 20 30 78 30 32 29 3d 3d 30 20 29 20 62 72 65 61   0x02)==0 ) brea
10f30 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
10f40 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 30 78 66      opMask = 0xf
10f50 66 66 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ffe;.    }.    i
10f60 54 61 62 43 75 72 20 3d 20 70 50 61 72 73 65 2d  TabCur = pParse-
10f70 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 66 6f 72  >nTab++;.    for
10f80 28 69 44 62 4c 61 73 74 20 3d 20 7a 44 62 3f 69  (iDbLast = zDb?i
10f90 44 62 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db:db->nDb-1; iD
10fa0 62 3c 3d 69 44 62 4c 61 73 74 3b 20 69 44 62 2b  b<=iDbLast; iDb+
10fb0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44  +){.      if( iD
10fc0 62 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==1 ) continue;
10fd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
10fe0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
10ff0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
11000 20 20 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d     pSchema = db-
11010 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
11020 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73  a;.      for(k=s
11030 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
11040 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
11050 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ); k; k=sqliteHa
11060 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
11070 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
11080 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
11090 61 28 6b 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  a(k);..        /
110a0 2a 20 49 66 20 74 61 62 6c 65 20 70 54 61 62 20  * If table pTab 
110b0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 75 73 65  has not been use
110c0 64 20 69 6e 20 61 20 77 61 79 20 74 68 61 74 20  d in a way that 
110d0 77 6f 75 6c 64 20 62 65 6e 65 66 69 74 20 66 72  would benefit fr
110e0 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61  om.        ** ha
110f0 76 69 6e 67 20 61 6e 61 6c 79 73 69 73 20 73 74  ving analysis st
11100 61 74 69 73 74 69 63 73 20 64 75 72 69 6e 67 20  atistics during 
11110 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 73 73  the current sess
11120 69 6f 6e 2c 20 74 68 65 6e 20 73 6b 69 70 20 69  ion, then skip i
11130 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  t..        ** Th
11140 69 73 20 61 6c 73 6f 20 68 61 73 20 74 68 65 20  is also has the 
11150 65 66 66 65 63 74 20 6f 66 20 73 6b 69 70 70 69  effect of skippi
11160 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ng virtual table
11170 73 20 61 6e 64 20 76 69 65 77 73 20 2a 2f 0a 20  s and views */. 
11180 20 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62         if( (pTab
11190 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
111a0 53 74 61 74 73 55 73 65 64 29 3d 3d 30 20 29 20  StatsUsed)==0 ) 
111b0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
111c0 20 20 20 2f 2a 20 52 65 61 6e 61 6c 79 7a 65 20     /* Reanalyze 
111d0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
111e0 32 35 20 74 69 6d 65 73 20 6c 61 72 67 65 72 20  25 times larger 
111f0 74 68 61 6e 20 74 68 65 20 6c 61 73 74 20 61 6e  than the last an
11200 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20 20 20  alysis */.      
11210 20 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20    szThreshold = 
11220 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
11230 20 2b 20 34 36 3b 20 61 73 73 65 72 74 28 20 73   + 46; assert( s
11240 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29  qlite3LogEst(25)
11250 3d 3d 34 36 20 29 3b 0a 20 20 20 20 20 20 20 20  ==46 );.        
11260 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
11270 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
11280 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
11290 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
112a0 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 7b  Idx->hasStat1 ){
112b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 54  .            szT
112c0 68 72 65 73 68 6f 6c 64 20 3d 20 30 3b 20 2f 2a  hreshold = 0; /*
112d0 20 41 6c 77 61 79 73 20 61 6e 61 6c 79 7a 65 20   Always analyze 
112e0 69 66 20 61 6e 79 20 69 6e 64 65 78 20 6c 61 63  if any index lac
112f0 6b 73 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f  ks statistics */
11300 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
11310 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
11320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11330 20 20 69 66 28 20 73 7a 54 68 72 65 73 68 6f 6c    if( szThreshol
11340 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
11350 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
11360 70 50 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c  pParse, iTabCur,
11370 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
11380 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
11390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
113a0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 53 6d  ddOp3(v, OP_IfSm
113b0 61 6c 6c 65 72 2c 20 69 54 61 62 43 75 72 2c 20  aller, iTabCur, 
113c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
113d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
113e0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
113f0 28 76 29 2b 32 2b 28 6f 70 4d 61 73 6b 26 31 29  (v)+2+(opMask&1)
11400 2c 20 73 7a 54 68 72 65 73 68 6f 6c 64 29 3b 0a  , szThreshold);.
11410 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
11420 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
11430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 75     }.        zSu
11440 62 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50  bSql = sqlite3MP
11450 72 69 6e 74 66 28 64 62 2c 20 22 41 4e 41 4c 59  rintf(db, "ANALY
11460 5a 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22  ZE \"%w\".\"%w\"
11470 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11490 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
114a0 2e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d  .zDbSName, pTab-
114b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
114c0 20 69 66 28 20 6f 70 4d 61 73 6b 20 26 20 30 78   if( opMask & 0x
114d0 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  01 ){.          
114e0 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
114f0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
11500 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
11510 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
11520 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
11530 2c 20 72 31 2c 20 30 2c 20 7a 53 75 62 53 71 6c  , r1, 0, zSubSql
11540 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
11550 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11560 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11570 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 31 2c 20  _ResultRow, r1, 
11580 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
11590 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
115a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
115b0 2c 20 4f 50 5f 53 71 6c 45 78 65 63 2c 20 30 2c  , OP_SqlExec, 0,
115c0 20 30 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20   0, 0, zSubSql, 
115d0 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
115e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
115f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11600 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
11610 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20 62 72  _Expire);.    br
11620 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
11630 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73   **   PRAGMA bus
11640 79 5f 74 69 6d 65 6f 75 74 0a 20 20 2a 2a 20 20  y_timeout.  **  
11650 20 50 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d   PRAGMA busy_tim
11660 65 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20  eout = N.  **.  
11670 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ** Call sqlite3_
11680 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c  busy_timeout(db,
11690 20 4e 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65   N).  Return the
116a0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 6f 75 74   current timeout
116b0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 66 20 6f   value.  ** if o
116c0 6e 65 20 69 73 20 73 65 74 2e 20 20 49 66 20 6e  ne is set.  If n
116d0 6f 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 6f  o busy handler o
116e0 72 20 61 20 64 69 66 66 65 72 65 6e 74 20 62 75  r a different bu
116f0 73 79 20 68 61 6e 64 6c 65 72 20 69 73 20 73 65  sy handler is se
11700 74 0a 20 20 2a 2a 20 74 68 65 6e 20 30 20 69 73  t.  ** then 0 is
11710 20 72 65 74 75 72 6e 65 64 2e 20 20 53 65 74 74   returned.  Sett
11720 69 6e 67 20 74 68 65 20 62 75 73 79 5f 74 69 6d  ing the busy_tim
11730 65 6f 75 74 20 74 6f 20 30 20 6f 72 20 6e 65 67  eout to 0 or neg
11740 61 74 69 76 65 0a 20 20 2a 2a 20 64 69 73 61 62  ative.  ** disab
11750 6c 65 73 20 74 68 65 20 74 69 6d 65 6f 75 74 2e  les the timeout.
11760 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61 73 65 20 50  .  */.  /*case P
11770 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45  ragTyp_BUSY_TIME
11780 4f 55 54 2a 2f 20 64 65 66 61 75 6c 74 3a 20 7b  OUT*/ default: {
11790 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
117a0 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 3d 3d  agma->ePragTyp==
117b0 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d  PragTyp_BUSY_TIM
117c0 45 4f 55 54 20 29 3b 0a 20 20 20 20 69 66 28 20  EOUT );.    if( 
117d0 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
117e0 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
117f0 65 6f 75 74 28 64 62 2c 20 73 71 6c 69 74 65 33  eout(db, sqlite3
11800 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20  Atoi(zRight));. 
11810 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
11820 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e  ingleInt(v, db->
11830 62 75 73 79 54 69 6d 65 6f 75 74 29 3b 0a 20 20  busyTimeout);.  
11840 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
11850 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
11860 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74   soft_heap_limit
11870 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73  .  **   PRAGMA s
11880 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3d  oft_heap_limit =
11890 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50   N.  **.  ** IMP
118a0 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
118b0 52 2d 32 36 33 34 33 2d 34 35 39 33 30 20 54 68  R-26343-45930 Th
118c0 69 73 20 70 72 61 67 6d 61 20 69 6e 76 6f 6b 65  is pragma invoke
118d0 73 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  s the.  ** sqlit
118e0 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
118f0 69 74 36 34 28 29 20 69 6e 74 65 72 66 61 63 65  it64() interface
11900 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d 65   with the argume
11910 6e 74 20 4e 2c 20 69 66 20 4e 20 69 73 0a 20 20  nt N, if N is.  
11920 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 6e 64  ** specified and
11930 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69   is a non-negati
11940 76 65 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a  ve integer..  **
11950 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
11960 4f 46 3a 20 52 2d 36 34 34 35 31 2d 30 37 31 36  OF: R-64451-0716
11970 33 20 54 68 65 20 73 6f 66 74 5f 68 65 61 70 5f  3 The soft_heap_
11980 6c 69 6d 69 74 20 70 72 61 67 6d 61 20 61 6c 77  limit pragma alw
11990 61 79 73 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  ays.  ** returns
119a0 20 74 68 65 20 73 61 6d 65 20 69 6e 74 65 67 65   the same intege
119b0 72 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20  r that would be 
119c0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a  returned by the.
119d0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66    ** sqlite3_sof
119e0 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d  t_heap_limit64(-
119f0 31 29 20 43 2d 6c 61 6e 67 75 61 67 65 20 66 75  1) C-language fu
11a00 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
11a10 61 73 65 20 50 72 61 67 54 79 70 5f 53 4f 46 54  ase PragTyp_SOFT
11a20 5f 48 45 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20  _HEAP_LIMIT: {. 
11a30 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
11a40 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67   N;.    if( zRig
11a50 68 74 20 26 26 20 73 71 6c 69 74 65 33 44 65 63  ht && sqlite3Dec
11a60 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68  OrHexToI64(zRigh
11a70 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f  t, &N)==SQLITE_O
11a80 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
11a90 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
11aa0 69 74 36 34 28 4e 29 3b 0a 20 20 20 20 7d 0a 20  it64(N);.    }. 
11ab0 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
11ac0 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 73 6f  nt(v, sqlite3_so
11ad0 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
11ae0 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  -1));.    break;
11af0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
11b00 20 20 50 52 41 47 4d 41 20 74 68 72 65 61 64 73    PRAGMA threads
11b10 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
11b20 68 72 65 61 64 73 20 3d 20 4e 0a 20 20 2a 2a 0a  hreads = N.  **.
11b30 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74    ** Configure t
11b40 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
11b50 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65  r of worker thre
11b60 61 64 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ads.  Return the
11b70 20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78 69 6d 75   new.  ** maximu
11b80 6d 2c 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  m, which might b
11b90 65 20 6c 65 73 73 20 74 68 61 6e 20 72 65 71 75  e less than requ
11ba0 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ested..  */.  ca
11bb0 73 65 20 50 72 61 67 54 79 70 5f 54 48 52 45 41  se PragTyp_THREA
11bc0 44 53 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  DS: {.    sqlite
11bd0 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69  3_int64 N;.    i
11be0 66 28 20 7a 52 69 67 68 74 0a 20 20 20 20 20 26  f( zRight.     &
11bf0 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  & sqlite3DecOrHe
11c00 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26  xToI64(zRight, &
11c10 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  N)==SQLITE_OK.  
11c20 20 20 20 26 26 20 4e 3e 3d 30 0a 20 20 20 20 29     && N>=0.    )
11c30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11c40 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45  limit(db, SQLITE
11c50 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
11c60 52 45 41 44 53 2c 20 28 69 6e 74 29 28 4e 26 30  READS, (int)(N&0
11c70 78 37 66 66 66 66 66 66 66 29 29 3b 0a 20 20 20  x7fffffff));.   
11c80 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
11c90 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65  gleInt(v, sqlite
11ca0 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49  3_limit(db, SQLI
11cb0 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
11cc0 54 48 52 45 41 44 53 2c 20 2d 31 29 29 3b 0a 20  THREADS, -1));. 
11cd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23     break;.  }..#
11ce0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
11cf0 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
11d00 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
11d10 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f 72  .  /*.  ** Repor
11d20 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  t the current st
11d30 61 74 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67 73  ate of file logs
11d40 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
11d50 65 73 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  es.  */.  case P
11d60 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 53 54 41 54  ragTyp_LOCK_STAT
11d70 55 53 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63  US: {.    static
11d80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
11d90 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20  st azLockName[] 
11da0 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e 6c 6f 63  = {.      "unloc
11db0 6b 65 64 22 2c 20 22 73 68 61 72 65 64 22 2c 20  ked", "shared", 
11dc0 22 72 65 73 65 72 76 65 64 22 2c 20 22 70 65 6e  "reserved", "pen
11dd0 64 69 6e 67 22 2c 20 22 65 78 63 6c 75 73 69 76  ding", "exclusiv
11de0 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  e".    };.    in
11df0 74 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  t i;.    pParse-
11e00 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66  >nMem = 2;.    f
11e10 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
11e20 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
11e30 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 20  tree *pBt;.     
11e40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
11e50 61 74 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  ate = "unknown";
11e60 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
11e70 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
11e80 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30 20 29  i].zDbSName==0 )
11e90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
11ea0 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69   pBt = db->aDb[i
11eb0 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
11ec0 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74   pBt==0 || sqlit
11ed0 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
11ee0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11ef0 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f 73 65 64  zState = "closed
11f00 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
11f10 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  f( sqlite3_file_
11f20 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69 20 3f 20  control(db, i ? 
11f30 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
11f40 61 6d 65 20 3a 20 30 2c 20 0a 20 20 20 20 20 20  ame : 0, .      
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
11f70 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
11f80 53 54 41 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49  STATE, &j)==SQLI
11f90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11fa0 20 20 7a 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63    zState = azLoc
11fb0 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20  kName[j];.      
11fc0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
11fd0 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
11fe0 31 2c 20 22 73 73 22 2c 20 64 62 2d 3e 61 44 62  1, "ss", db->aDb
11ff0 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 53  [i].zDbSName, zS
12000 74 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tate);.    }.   
12010 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
12020 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
12030 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a  E_HAS_CODEC.  /*
12040 20 50 72 61 67 6d 61 20 20 20 20 20 20 20 20 69   Pragma        i
12050 41 72 67 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  Arg.  ** -------
12060 2d 2d 2d 20 20 20 2d 2d 2d 2d 2d 2d 0a 20 20 2a  ---   ------.  *
12070 2a 20 20 6b 65 79 20 20 20 20 20 20 20 20 20 20  *  key          
12080 20 30 0a 20 20 2a 2a 20 20 72 65 6b 65 79 20 20   0.  **  rekey  
12090 20 20 20 20 20 20 20 31 0a 20 20 2a 2a 20 20 68         1.  **  h
120a0 65 78 6b 65 79 20 20 20 20 20 20 20 20 32 0a 20  exkey        2. 
120b0 20 2a 2a 20 20 68 65 78 72 65 6b 65 79 20 20 20   **  hexrekey   
120c0 20 20 20 33 0a 20 20 2a 2a 20 20 74 65 78 74 6b     3.  **  textk
120d0 65 79 20 20 20 20 20 20 20 34 0a 20 20 2a 2a 20  ey       4.  ** 
120e0 20 74 65 78 74 72 65 6b 65 79 20 20 20 20 20 35   textrekey     5
120f0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
12100 67 54 79 70 5f 4b 45 59 3a 20 7b 0a 20 20 20 20  gTyp_KEY: {.    
12110 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
12120 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 61      int n = pPra
12130 67 6d 61 2d 3e 69 41 72 67 3c 34 20 3f 20 73 71  gma->iArg<4 ? sq
12140 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52  lite3Strlen30(zR
12150 69 67 68 74 29 20 3a 20 2d 31 3b 0a 20 20 20 20  ight) : -1;.    
12160 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e    if( (pPragma->
12170 69 41 72 67 20 26 20 31 29 3d 3d 30 20 29 7b 0a  iArg & 1)==0 ){.
12180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12190 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20  key_v2(db, zDb, 
121a0 7a 52 69 67 68 74 2c 20 6e 29 3b 0a 20 20 20 20  zRight, n);.    
121b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
121c0 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76   sqlite3_rekey_v
121d0 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68  2(db, zDb, zRigh
121e0 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, n);.      }. 
121f0 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
12200 20 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54    }.  case PragT
12210 79 70 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20 20  yp_HEXKEY: {.   
12220 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
12230 20 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20       u8 iByte;. 
12240 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
12250 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b    char zKey[40];
12260 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
12270 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f  iByte=0; i<sizeo
12280 66 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c  f(zKey)*2 && sql
12290 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 52 69  ite3Isxdigit(zRi
122a0 67 68 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20  ght[i]); i++){. 
122b0 20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28         iByte = (
122c0 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69  iByte<<4) + sqli
122d0 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 52 69 67  te3HexToInt(zRig
122e0 68 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ht[i]);.        
122f0 69 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a  if( (i&1)!=0 ) z
12300 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65  Key[i/2] = iByte
12310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12320 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 69 41  if( (pPragma->iA
12330 72 67 20 26 20 31 29 3d 3d 30 20 29 7b 0a 20 20  rg & 1)==0 ){.  
12340 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65        sqlite3_ke
12350 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b  y_v2(db, zDb, zK
12360 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20  ey, i/2);.      
12370 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
12380 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28  qlite3_rekey_v2(
12390 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69  db, zDb, zKey, i
123a0 2f 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  /2);.      }.   
123b0 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
123c0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
123d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
123e0 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65  CODEC) || define
123f0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
12400 43 45 52 4f 44 29 0a 20 20 63 61 73 65 20 50 72  CEROD).  case Pr
12410 61 67 54 79 70 5f 41 43 54 49 56 41 54 45 5f 45  agTyp_ACTIVATE_E
12420 58 54 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20 7a  XTENSIONS: if( z
12430 52 69 67 68 74 20 29 7b 0a 23 69 66 64 65 66 20  Right ){.#ifdef 
12440 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
12450 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12460 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c  StrNICmp(zRight,
12470 20 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29   "see-", 4)==0 )
12480 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
12490 61 63 74 69 76 61 74 65 5f 73 65 65 28 26 7a 52  activate_see(&zR
124a0 69 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a  ight[4]);.    }.
124b0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
124c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f  LITE_ENABLE_CERO
124d0 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
124e0 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74  3StrNICmp(zRight
124f0 2c 20 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d  , "cerod-", 6)==
12500 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12510 65 33 5f 61 63 74 69 76 61 74 65 5f 63 65 72 6f  e3_activate_cero
12520 64 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20  d(&zRight[6]);. 
12530 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
12540 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a    break;.#endif.
12550 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74  .  } /* End of t
12560 68 65 20 50 52 41 47 4d 41 20 73 77 69 74 63 68  he PRAGMA switch
12570 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   */..  /* The fo
12580 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 69 73  llowing block is
12590 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
125a0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
125b0 64 65 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c  defined. Its onl
125c0 79 0a 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 69  y.  ** purpose i
125d0 73 20 74 6f 20 65 78 65 63 75 74 65 20 61 73 73  s to execute ass
125e0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
125f0 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
12600 69 66 20 74 68 65 0a 20 20 2a 2a 20 50 72 61 67  if the.  ** Prag
12610 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 20 66  Flg_NoColumns1 f
12620 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
12630 68 65 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  he caller specif
12640 69 65 64 20 61 6e 20 61 72 67 75 6d 65 6e 74 0a  ied an argument.
12650 20 20 2a 2a 20 74 6f 20 74 68 65 20 50 52 41 47    ** to the PRAG
12660 4d 41 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  MA, the implemen
12670 74 61 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 61  tation has not a
12680 64 64 65 64 20 61 6e 79 20 4f 50 5f 52 65 73 75  dded any OP_Resu
12690 6c 74 52 6f 77 20 0a 20 20 2a 2a 20 69 6e 73 74  ltRow .  ** inst
126a0 72 75 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  ructions to the 
126b0 56 4d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  VM.  */.  if( (p
126c0 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67  Pragma->mPragFlg
126d0 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c   & PragFlg_NoCol
126e0 75 6d 6e 73 31 29 20 26 26 20 7a 52 69 67 68 74  umns1) && zRight
126f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
12700 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c  dbeVerifyNoResul
12710 74 52 6f 77 28 76 29 3b 0a 20 20 7d 0a 0a 70 72  tRow(v);.  }..pr
12720 61 67 6d 61 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  agma_out:.  sqli
12730 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4c  te3DbFree(db, zL
12740 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  eft);.  sqlite3D
12750 62 46 72 65 65 28 64 62 2c 20 7a 52 69 67 68 74  bFree(db, zRight
12760 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  );.}.#ifndef SQL
12770 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12780 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  TABLE./*********
12790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127d0 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ****.** Implemen
127e0 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 70 6f  tation of an epo
127f0 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74  nymous virtual t
12800 61 62 6c 65 20 74 68 61 74 20 72 75 6e 73 20 61  able that runs a
12810 20 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f 0a 74   pragma..**.*/.t
12820 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 72  ypedef struct Pr
12830 61 67 6d 61 56 74 61 62 20 50 72 61 67 6d 61 56  agmaVtab PragmaV
12840 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72  tab;.typedef str
12850 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 43 75  uct PragmaVtabCu
12860 72 73 6f 72 20 50 72 61 67 6d 61 56 74 61 62 43  rsor PragmaVtabC
12870 75 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 50 72  ursor;.struct Pr
12880 61 67 6d 61 56 74 61 62 20 7b 0a 20 20 73 71 6c  agmaVtab {.  sql
12890 69 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20  ite3_vtab base; 
128a0 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63         /* Base c
128b0 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66  lass.  Must be f
128c0 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  irst */.  sqlite
128d0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
128e0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
128f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
12900 6f 20 77 68 69 63 68 20 69 74 20 62 65 6c 6f 6e  o which it belon
12910 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 50 72  gs */.  const Pr
12920 61 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b  agmaName *pName;
12930 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
12940 20 70 72 61 67 6d 61 20 2a 2f 0a 20 20 75 38 20   pragma */.  u8 
12950 6e 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20  nHidden;        
12960 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12970 20 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d   of hidden colum
12980 6e 73 20 2a 2f 0a 20 20 75 38 20 69 48 69 64 64  ns */.  u8 iHidd
12990 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
129a0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
129b0 65 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 63  e first hidden c
129c0 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74 72 75  olumn */.};.stru
129d0 63 74 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  ct PragmaVtabCur
129e0 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sor {.  sqlite3_
129f0 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65  vtab_cursor base
12a00 3b 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e  ; /* Base class.
12a10 20 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20    Must be first 
12a20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
12a30 74 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 20 2f  t *pPragma;    /
12a40 2a 20 54 68 65 20 70 72 61 67 6d 61 20 73 74 61  * The pragma sta
12a50 74 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f  tement to run */
12a60 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
12a70 69 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20  iRowid;      /* 
12a80 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f  Current rowid */
12a90 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 32  .  char *azArg[2
12aa0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ];           /* 
12ab0 56 61 6c 75 65 20 6f 66 20 74 68 65 20 61 72 67  Value of the arg
12ac0 75 6d 65 6e 74 20 61 6e 64 20 73 63 68 65 6d 61  ument and schema
12ad0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 50   */.};../* .** P
12ae0 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
12af0 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e  ble module xConn
12b00 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  ect method..*/.s
12b10 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
12b20 56 74 61 62 43 6f 6e 6e 65 63 74 28 0a 20 20 73  VtabConnect(.  s
12b30 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
12b40 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20  id *pAux,.  int 
12b50 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
12b60 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20   *const*argv,.  
12b70 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
12b80 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a  pVtab,.  char **
12b90 70 7a 45 72 72 0a 29 7b 0a 20 20 63 6f 6e 73 74  pzErr.){.  const
12ba0 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50 72   PragmaName *pPr
12bb0 61 67 6d 61 20 3d 20 28 63 6f 6e 73 74 20 50 72  agma = (const Pr
12bc0 61 67 6d 61 4e 61 6d 65 2a 29 70 41 75 78 3b 0a  agmaName*)pAux;.
12bd0 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54    PragmaVtab *pT
12be0 61 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ab = 0;.  int rc
12bf0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
12c00 63 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b  char cSep = '(';
12c10 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b  .  StrAccum acc;
12c20 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30  .  char zBuf[200
12c30 5d 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ];..  UNUSED_PAR
12c40 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
12c50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12c60 28 61 72 67 76 29 3b 0a 20 20 73 71 6c 69 74 65  (argv);.  sqlite
12c70 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61  3StrAccumInit(&a
12c80 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a  cc, 0, zBuf, siz
12c90 65 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20  eof(zBuf), 0);. 
12ca0 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
12cb0 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 22 43 52  endall(&acc, "CR
12cc0 45 41 54 45 20 54 41 42 4c 45 20 78 22 29 3b 0a  EATE TABLE x");.
12cd0 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 50 72    for(i=0, j=pPr
12ce0 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e 61 6d 65  agma->iPragCName
12cf0 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e 6e 50 72  ; i<pPragma->nPr
12d00 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20 6a 2b  agCName; i++, j+
12d10 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
12d20 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63  str_appendf(&acc
12d30 2c 20 22 25 63 5c 22 25 73 5c 22 22 2c 20 63 53  , "%c\"%s\"", cS
12d40 65 70 2c 20 70 72 61 67 43 4e 61 6d 65 5b 6a 5d  ep, pragCName[j]
12d50 29 3b 0a 20 20 20 20 63 53 65 70 20 3d 20 27 2c  );.    cSep = ',
12d60 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d 3d  ';.  }.  if( i==
12d70 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
12d80 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63  _str_appendf(&ac
12d90 63 2c 20 22 28 5c 22 25 73 5c 22 22 2c 20 70 50  c, "(\"%s\"", pP
12da0 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  ragma->zName);. 
12db0 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6a 20     i++;.  }.  j 
12dc0 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 72 61 67  = 0;.  if( pPrag
12dd0 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  ma->mPragFlg & P
12de0 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 20 29  ragFlg_Result1 )
12df0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
12e00 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63  r_appendall(&acc
12e10 2c 20 22 2c 61 72 67 20 48 49 44 44 45 4e 22 29  , ",arg HIDDEN")
12e20 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
12e30 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50   if( pPragma->mP
12e40 72 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c  ragFlg & (PragFl
12e50 67 5f 53 63 68 65 6d 61 4f 70 74 7c 50 72 61 67  g_SchemaOpt|Prag
12e60 46 6c 67 5f 53 63 68 65 6d 61 52 65 71 29 20 29  Flg_SchemaReq) )
12e70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
12e80 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63  r_appendall(&acc
12e90 2c 20 22 2c 73 63 68 65 6d 61 20 48 49 44 44 45  , ",schema HIDDE
12ea0 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  N");.    j++;.  
12eb0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f  }.  sqlite3_str_
12ec0 61 70 70 65 6e 64 28 26 61 63 63 2c 20 22 29 22  append(&acc, ")"
12ed0 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 1);.  sqlite3S
12ee0 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 61  trAccumFinish(&a
12ef0 63 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  cc);.  assert( s
12f00 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20 73 69  trlen(zBuf) < si
12f10 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b 0a  zeof(zBuf)-1 );.
12f20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64    rc = sqlite3_d
12f30 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20  eclare_vtab(db, 
12f40 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d  zBuf);.  if( rc=
12f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12f60 20 20 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61    pTab = (Pragma
12f70 56 74 61 62 2a 29 73 71 6c 69 74 65 33 5f 6d 61  Vtab*)sqlite3_ma
12f80 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72 61 67  lloc(sizeof(Prag
12f90 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20 69 66  maVtab));.    if
12fa0 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
12fb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
12fc0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
12fd0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54  .      memset(pT
12fe0 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72  ab, 0, sizeof(Pr
12ff0 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20  agmaVtab));.    
13000 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20 3d 20    pTab->pName = 
13010 70 50 72 61 67 6d 61 3b 0a 20 20 20 20 20 20 70  pPragma;.      p
13020 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  Tab->db = db;.  
13030 20 20 20 20 70 54 61 62 2d 3e 69 48 69 64 64 65      pTab->iHidde
13040 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 54 61  n = i;.      pTa
13050 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a 3b 0a  b->nHidden = j;.
13060 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
13070 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
13080 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
13090 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
130a0 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70  (db));.  }..  *p
130b0 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33  pVtab = (sqlite3
130c0 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20 72  _vtab*)pTab;.  r
130d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
130e0 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75  .** Pragma virtu
130f0 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
13100 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74 68  xDisconnect meth
13110 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
13120 74 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63  t pragmaVtabDisc
13130 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76  onnect(sqlite3_v
13140 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 50  tab *pVtab){.  P
13150 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
13160 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 70  = (PragmaVtab*)p
13170 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Vtab;.  sqlite3_
13180 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20 72 65  free(pTab);.  re
13190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
131a0 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  }../* Figure out
131b0 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
131c0 74 6f 20 75 73 65 20 74 6f 20 73 65 61 72 63 68  to use to search
131d0 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61   a pragma virtua
131e0 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  l table..**.** T
131f0 68 65 72 65 20 61 72 65 20 6e 6f 74 20 72 65 61  here are not rea
13200 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78 20 63 68  lly any index ch
13210 6f 69 63 65 73 2e 20 20 42 75 74 20 77 65 20 77  oices.  But we w
13220 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61 67 65  ant to encourage
13230 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 6c   the.** query pl
13240 61 6e 6e 65 72 20 74 6f 20 67 69 76 65 20 3d 3d  anner to give ==
13250 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
13260 61 73 20 6d 61 6e 79 20 68 69 64 64 65 6e 20 70  as many hidden p
13270 61 72 61 6d 65 74 65 72 73 20 61 73 0a 2a 2a 20  arameters as.** 
13280 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 65 73  possible, and es
13290 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68 65 20  pecially on the 
132a0 66 69 72 73 74 20 68 69 64 64 65 6e 20 70 61 72  first hidden par
132b0 61 6d 65 74 65 72 2e 20 20 53 6f 20 72 65 74 75  ameter.  So retu
132c0 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63 6f 73  rn a.** high cos
132d0 74 20 69 66 20 68 69 64 64 65 6e 20 70 61 72 61  t if hidden para
132e0 6d 65 74 65 72 73 20 61 72 65 20 75 6e 63 6f 6e  meters are uncon
132f0 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  strained..*/.sta
13300 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
13310 61 62 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69  abBestIndex(sqli
13320 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73  te3_vtab *tab, s
13330 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13340 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20  o *pIdxInfo){.  
13350 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62  PragmaVtab *pTab
13360 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29   = (PragmaVtab*)
13370 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72  tab;.  const str
13380 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
13390 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43  x_constraint *pC
133a0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74  onstraint;.  int
133b0 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73 65 65   i, j;.  int see
133c0 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49 6e 66  n[2];..  pIdxInf
133d0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
133e0 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20   = (double)1;.  
133f0 69 66 28 20 70 54 61 62 2d 3e 6e 48 69 64 64 65  if( pTab->nHidde
13400 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 53  n==0 ){ return S
13410 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 70 43  QLITE_OK; }.  pC
13420 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
13430 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
13440 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d 20 30  t;.  seen[0] = 0
13450 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20 30 3b  ;.  seen[1] = 0;
13460 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
13470 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
13480 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74  int; i++, pConst
13490 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66  raint++){.    if
134a0 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75  ( pConstraint->u
134b0 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69  sable==0 ) conti
134c0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  nue;.    if( pCo
134d0 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53 51  nstraint->op!=SQ
134e0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
134f0 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69  RAINT_EQ ) conti
13500 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  nue;.    if( pCo
13510 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d  nstraint->iColum
13520 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69 64 64 65  n < pTab->iHidde
13530 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
13540 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e    j = pConstrain
13550 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 54 61  t->iColumn - pTa
13560 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20 20 20  b->iHidden;.    
13570 61 73 73 65 72 74 28 20 6a 20 3c 20 32 20 29 3b  assert( j < 2 );
13580 0a 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d 20 69  .    seen[j] = i
13590 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 65  +1;.  }.  if( se
135a0 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  en[0]==0 ){.    
135b0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
135c0 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c  tedCost = (doubl
135d0 65 29 32 31 34 37 34 38 33 36 34 37 3b 0a 20 20  e)2147483647;.  
135e0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
135f0 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 31 34 37  matedRows = 2147
13600 34 38 33 36 34 37 3b 0a 20 20 20 20 72 65 74 75  483647;.    retu
13610 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13620 7d 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30 5d 2d  }.  j = seen[0]-
13630 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  1;.  pIdxInfo->a
13640 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
13650 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31  j].argvIndex = 1
13660 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
13670 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
13680 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 69 66  ].omit = 1;.  if
13690 28 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29 20 72  ( seen[1]==0 ) r
136a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
136b0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
136c0 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f  imatedCost = (do
136d0 75 62 6c 65 29 32 30 3b 0a 20 20 70 49 64 78 49  uble)20;.  pIdxI
136e0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
136f0 77 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d 20 73  ws = 20;.  j = s
13700 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49 64 78  een[1]-1;.  pIdx
13710 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
13720 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e  tUsage[j].argvIn
13730 64 65 78 20 3d 20 32 3b 0a 20 20 70 49 64 78 49  dex = 2;.  pIdxI
13740 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
13750 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20  Usage[j].omit = 
13760 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
13770 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72 65  TE_OK;.}../* Cre
13780 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
13790 20 66 6f 72 20 74 68 65 20 70 72 61 67 6d 61 20   for the pragma 
137a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
137b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
137c0 6d 61 56 74 61 62 4f 70 65 6e 28 73 71 6c 69 74  maVtabOpen(sqlit
137d0 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20  e3_vtab *pVtab, 
137e0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
137f0 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b  sor **ppCursor){
13800 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13810 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70 43 73  sor *pCsr;.  pCs
13820 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
13830 75 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f 6d  ursor*)sqlite3_m
13840 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 43  alloc(sizeof(*pC
13850 73 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73 72  sr));.  if( pCsr
13860 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
13870 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
13880 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a  set(pCsr, 0, siz
13890 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 43 75  eof(PragmaVtabCu
138a0 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e  rsor));.  pCsr->
138b0 62 61 73 65 2e 70 56 74 61 62 20 3d 20 70 56 74  base.pVtab = pVt
138c0 61 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20  ab;.  *ppCursor 
138d0 3d 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20  = &pCsr->base;. 
138e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
138f0 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20 61  K;.}../* Clear a
13900 6c 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ll content from 
13910 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  pragma virtual t
13920 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a  able cursor. */.
13930 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 61 67  static void prag
13940 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
13950 72 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73  r(PragmaVtabCurs
13960 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74  or *pCsr){.  int
13970 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   i;.  sqlite3_fi
13980 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72  nalize(pCsr->pPr
13990 61 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d 3e 70  agma);.  pCsr->p
139a0 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 66 6f  Pragma = 0;.  fo
139b0 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
139c0 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 3b  ze(pCsr->azArg);
139d0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
139e0 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 7a  e3_free(pCsr->az
139f0 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70 43 73  Arg[i]);.    pCs
13a00 72 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20 30 3b  r->azArg[i] = 0;
13a10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73 65  .  }.}../* Close
13a20 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61   a pragma virtua
13a30 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 2a  l table cursor *
13a40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
13a50 67 6d 61 56 74 61 62 43 6c 6f 73 65 28 73 71 6c  gmaVtabClose(sql
13a60 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
13a70 20 2a 63 75 72 29 7b 0a 20 20 50 72 61 67 6d 61   *cur){.  Pragma
13a80 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
13a90 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
13aa0 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 72 61  rsor*)cur;.  pra
13ab0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65  gmaVtabCursorCle
13ac0 61 72 28 70 43 73 72 29 3b 0a 20 20 73 71 6c 69  ar(pCsr);.  sqli
13ad0 74 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b 0a  te3_free(pCsr);.
13ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13af0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63  OK;.}../* Advanc
13b00 65 20 74 68 65 20 70 72 61 67 6d 61 20 76 69 72  e the pragma vir
13b10 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f  tual table curso
13b20 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  r to the next ro
13b30 77 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  w */.static int 
13b40 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74 28 73  pragmaVtabNext(s
13b50 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
13b60 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29  or *pVtabCursor)
13b70 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
13b80 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
13b90 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
13ba0 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 69  pVtabCursor;.  i
13bb0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13bc0 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65  K;..  /* Increme
13bd0 6e 74 20 74 68 65 20 78 52 6f 77 69 64 20 76 61  nt the xRowid va
13be0 6c 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d 3e 69  lue */.  pCsr->i
13bf0 52 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73 65 72  Rowid++;.  asser
13c00 74 28 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61  t( pCsr->pPragma
13c10 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
13c20 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW!=sqlite3_st
13c30 65 70 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61  ep(pCsr->pPragma
13c40 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
13c50 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
13c60 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20  Csr->pPragma);. 
13c70 20 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61     pCsr->pPragma
13c80 20 3d 20 30 3b 0a 20 20 20 20 70 72 61 67 6d 61   = 0;.    pragma
13c90 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28  VtabCursorClear(
13ca0 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pCsr);.  }.  ret
13cb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
13cc0 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c  * Pragma virtual
13cd0 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 46   table module xF
13ce0 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f  ilter method..*/
13cf0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
13d00 6d 61 56 74 61 62 46 69 6c 74 65 72 28 0a 20 20  maVtabFilter(.  
13d10 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
13d20 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
13d30 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c  , .  int idxNum,
13d40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78   const char *idx
13d50 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  Str,.  int argc,
13d60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
13d70 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72 61 67 6d  *argv.){.  Pragm
13d80 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13d90 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
13da0 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
13db0 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  or;.  PragmaVtab
13dc0 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61   *pTab = (Pragma
13dd0 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73  Vtab*)(pVtabCurs
13de0 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 6e  or->pVtab);.  in
13df0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  t rc;.  int i, j
13e00 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63  ;.  StrAccum acc
13e10 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
13e20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
13e30 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20 20 55  TER(idxNum);.  U
13e40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
13e50 69 64 78 53 74 72 29 3b 0a 20 20 70 72 61 67 6d  idxStr);.  pragm
13e60 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72  aVtabCursorClear
13e70 28 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20 28 70  (pCsr);.  j = (p
13e80 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50 72 61  Tab->pName->mPra
13e90 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52  gFlg & PragFlg_R
13ea0 65 73 75 6c 74 31 29 21 3d 30 20 3f 20 30 20 3a  esult1)!=0 ? 0 :
13eb0 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   1;.  for(i=0; i
13ec0 3c 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b 2b 29  <argc; i++, j++)
13ed0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
13ee0 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74   *zText = (const
13ef0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
13f00 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
13f10 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
13f20 6a 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72  j<ArraySize(pCsr
13f30 2d 3e 61 7a 41 72 67 29 20 29 3b 0a 20 20 20 20  ->azArg) );.    
13f40 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61 7a  assert( pCsr->az
13f50 41 72 67 5b 6a 5d 3d 3d 30 20 29 3b 0a 20 20 20  Arg[j]==0 );.   
13f60 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20   if( zText ){.  
13f70 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b      pCsr->azArg[
13f80 6a 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  j] = sqlite3_mpr
13f90 69 6e 74 66 28 22 25 73 22 2c 20 7a 54 65 78 74  intf("%s", zText
13fa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73  );.      if( pCs
13fb0 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29  r->azArg[j]==0 )
13fc0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
13fd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
13fe0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13ff0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
14000 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c 20  umInit(&acc, 0, 
14010 30 2c 20 30 2c 20 70 54 61 62 2d 3e 64 62 2d 3e  0, 0, pTab->db->
14020 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
14030 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 29  MIT_SQL_LENGTH])
14040 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f  ;.  sqlite3_str_
14050 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20  appendall(&acc, 
14060 22 50 52 41 47 4d 41 20 22 29 3b 0a 20 20 69 66  "PRAGMA ");.  if
14070 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d  ( pCsr->azArg[1]
14080 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
14090 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63  str_appendf(&acc
140a0 2c 20 22 25 51 2e 22 2c 20 70 43 73 72 2d 3e 61  , "%Q.", pCsr->a
140b0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20  zArg[1]);.  }.  
140c0 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
140d0 6e 64 61 6c 6c 28 26 61 63 63 2c 20 70 54 61 62  ndall(&acc, pTab
140e0 2d 3e 70 4e 61 6d 65 2d 3e 7a 4e 61 6d 65 29 3b  ->pName->zName);
140f0 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41  .  if( pCsr->azA
14100 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 73 71 6c  rg[0] ){.    sql
14110 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
14120 28 26 61 63 63 2c 20 22 3d 25 51 22 2c 20 70 43  (&acc, "=%Q", pC
14130 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  sr->azArg[0]);. 
14140 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69   }.  zSql = sqli
14150 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
14160 68 28 26 61 63 63 29 3b 0a 20 20 69 66 28 20 7a  h(&acc);.  if( z
14170 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sql==0 ) return 
14180 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14190 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
141a0 70 61 72 65 5f 76 32 28 70 54 61 62 2d 3e 64 62  pare_v2(pTab->db
141b0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 73  , zSql, -1, &pCs
141c0 72 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29 3b 0a  r->pPragma, 0);.
141d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
141e0 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Sql);.  if( rc!=
141f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14200 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72   pTab->base.zErr
14210 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
14220 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
14230 74 65 33 5f 65 72 72 6d 73 67 28 70 54 61 62 2d  te3_errmsg(pTab-
14240 3e 64 62 29 29 3b 0a 20 20 20 20 72 65 74 75 72  >db));.    retur
14250 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n rc;.  }.  retu
14260 72 6e 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78  rn pragmaVtabNex
14270 74 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a  t(pVtabCursor);.
14280 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d 61 20  }../*.** Pragma 
14290 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
142a0 64 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f 64  dule xEof method
142b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
142c0 70 72 61 67 6d 61 56 74 61 62 45 6f 66 28 73 71  pragmaVtabEof(sq
142d0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
142e0 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29 7b  r *pVtabCursor){
142f0 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
14300 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
14310 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
14320 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72 65  VtabCursor;.  re
14330 74 75 72 6e 20 28 70 43 73 72 2d 3e 70 50 72 61  turn (pCsr->pPra
14340 67 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20 54  gma==0);.}../* T
14350 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f  he xColumn metho
14360 64 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73  d simply returns
14370 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
14380 6e 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  ng column from.*
14390 2a 20 74 68 65 20 50 52 41 47 4d 41 2e 20 20 0a  * the PRAGMA.  .
143a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
143b0 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 28 0a  agmaVtabColumn(.
143c0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
143d0 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
143e0 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 63  or, .  sqlite3_c
143f0 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20 20  ontext *ctx, .  
14400 69 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61 67 6d  int i.){.  Pragm
14410 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
14420 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
14430 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
14440 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  or;.  PragmaVtab
14450 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61   *pTab = (Pragma
14460 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73  Vtab*)(pVtabCurs
14470 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 66  or->pVtab);.  if
14480 28 20 69 3c 70 54 61 62 2d 3e 69 48 69 64 64 65  ( i<pTab->iHidde
14490 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
144a0 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74  _result_value(ct
144b0 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  x, sqlite3_colum
144c0 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 50  n_value(pCsr->pP
144d0 72 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20 7d 65  ragma, i));.  }e
144e0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
144f0 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78  _result_text(ctx
14500 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 2d  , pCsr->azArg[i-
14510 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d 2c 2d  pTab->iHidden],-
14520 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  1,SQLITE_TRANSIE
14530 4e 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  NT);.  }.  retur
14540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14550 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69  /* .** Pragma vi
14560 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
14570 6c 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f 64  le xRowid method
14580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14590 70 72 61 67 6d 61 56 74 61 62 52 6f 77 69 64 28  pragmaVtabRowid(
145a0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
145b0 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
145c0 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  , sqlite_int64 *
145d0 70 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  p){.  PragmaVtab
145e0 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
145f0 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
14600 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
14610 20 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52 6f 77   *p = pCsr->iRow
14620 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  id;.  return SQL
14630 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
14640 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  e pragma virtual
14650 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f   table object */
14660 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
14670 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70 72 61  lite3_module pra
14680 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20 3d 20  gmaVtabModule = 
14690 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  {.  0,          
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
146c0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
146e0 2a 20 78 43 72 65 61 74 65 20 2d 20 63 72 65 61  * xCreate - crea
146f0 74 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  te a table */.  
14700 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63  pragmaVtabConnec
14710 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
14720 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e 65  xConnect - conne
14730 63 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e  ct to an existin
14740 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61  g table */.  pra
14750 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65 78  gmaVtabBestIndex
14760 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65  ,         /* xBe
14770 73 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72 6d  stIndex - Determ
14780 69 6e 65 20 73 65 61 72 63 68 20 73 74 72 61 74  ine search strat
14790 65 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  egy */.  pragmaV
147a0 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20  tabDisconnect,  
147b0 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e        /* xDiscon
147c0 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65 63  nect - Disconnec
147d0 74 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 2a  t from a table *
147e0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14800 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20 44   /* xDestroy - D
14810 72 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20  rop a table */. 
14820 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e 2c   pragmaVtabOpen,
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14840 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20   xOpen - open a 
14850 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67  cursor */.  prag
14860 6d 61 56 74 61 62 43 6c 6f 73 65 2c 20 20 20 20  maVtabClose,    
14870 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
14880 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72  se - close a cur
14890 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  sor */.  pragmaV
148a0 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20 20  tabFilter,      
148b0 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72        /* xFilter
148c0 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61   - configure sca
148d0 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  n constraints */
148e0 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78  .  pragmaVtabNex
148f0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
14900 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e  /* xNext - advan
14910 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  ce a cursor */. 
14920 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 2c 20   pragmaVtabEof, 
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14940 20 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61 67 6d   xEof */.  pragm
14950 61 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20 20  aVtabColumn,    
14960 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75          /* xColu
14970 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  mn - read data *
14980 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 52 6f  /.  pragmaVtabRo
14990 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
149a0 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61   /* xRowid - rea
149b0 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20  d data */.  0,  
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64           /* xUpd
149e0 61 74 65 20 2d 20 77 72 69 74 65 20 64 61 74 61  ate - write data
149f0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20 62     /* xBegin - b
14a20 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egin transaction
14a30 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73 79     /* xSync - sy
14a60 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  nc transaction *
14a70 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a90 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f   /* xCommit - co
14aa0 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  mmit transaction
14ab0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20     /* xRollback 
14ae0 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73  - rollback trans
14af0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  action */.  0,  
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e           /* xFin
14b20 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e 63  dFunction - func
14b30 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
14b40 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d 20     /* xRename - 
14b70 72 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c 65  rename the table
14b80 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74     /* xSavepoint
14bb0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a     /* xRelease *
14be0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20   /* xRollbackTo 
14c10 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e 61 6d 65    /* xShadowName
14c40 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68   */.};../*.** Ch
14c50 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 7a 54  eck to see if zT
14c60 61 62 4e 61 6d 65 20 69 73 20 72 65 61 6c 6c 79  abName is really
14c70 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 70   the name of a p
14c80 72 61 67 6d 61 2e 20 20 49 66 20 69 74 20 69 73  ragma.  If it is
14c90 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 67 69 73 74  ,.** then regist
14ca0 65 72 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  er an eponymous 
14cb0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66 6f  virtual table fo
14cc0 72 20 74 68 61 74 20 70 72 61 67 6d 61 20 61 6e  r that pragma an
14cd0 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  d return.** a po
14ce0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 6f 64  inter to the Mod
14cf0 75 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  ule object for t
14d00 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  he new virtual t
14d10 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65 20  able..*/.Module 
14d20 2a 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56 74  *sqlite3PragmaVt
14d30 61 62 52 65 67 69 73 74 65 72 28 73 71 6c 69 74  abRegister(sqlit
14d40 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
14d50 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f  ar *zName){.  co
14d60 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a  nst PragmaName *
14d70 70 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  pName;.  assert(
14d80 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
14d90 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61  p(zName, "pragma
14da0 5f 22 2c 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  _", 7)==0 );.  p
14db0 4e 61 6d 65 20 3d 20 70 72 61 67 6d 61 4c 6f 63  Name = pragmaLoc
14dc0 61 74 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a 20 20  ate(zName+7);.  
14dd0 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 20 72  if( pName==0 ) r
14de0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
14df0 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20  pName->mPragFlg 
14e00 26 20 28 50 72 61 67 46 6c 67 5f 52 65 73 75 6c  & (PragFlg_Resul
14e10 74 30 7c 50 72 61 67 46 6c 67 5f 52 65 73 75 6c  t0|PragFlg_Resul
14e20 74 31 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  t1))==0 ) return
14e30 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
14e40 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
14e50 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d  b->aModule, zNam
14e60 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  e)==0 );.  retur
14e70 6e 20 73 71 6c 69 74 65 33 56 74 61 62 43 72 65  n sqlite3VtabCre
14e80 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a 4e  ateModule(db, zN
14e90 61 6d 65 2c 20 26 70 72 61 67 6d 61 56 74 61 62  ame, &pragmaVtab
14ea0 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64 2a 29 70  Module, (void*)p
14eb0 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65 6e  Name, 0);.}..#en
14ec0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14ed0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
14ee0 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  */..#endif /* SQ
14ef0 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41  LITE_OMIT_PRAGMA
14f00 20 2a 2f 0a                                       */.