/ Hex Artifact Content
Login

Artifact af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 61  esult row with a
2400: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
2410: 20 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20   string held in 
2420: 72 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63  register 3.  Dec
2430: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c  rement the resul
2440: 74 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73  t count in regis
2450: 74 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c  ter 1.** and hal
2460: 74 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d  t if the maximum
2470: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
2480: 74 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  t rows have been
2490: 20 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74   issued..*/.stat
24a0: 69 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79  ic int integrity
24b0: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56  CheckResultRow(V
24c0: 64 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61  dbe *v){.  int a
24d0: 64 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ddr;.  sqlite3Vd
24e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
24f0: 65 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b  esultRow, 3, 1);
2500: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
2510: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2520: 50 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69  P_IfPos, 1, sqli
2530: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2540: 64 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56  dr(v)+2, 1);.  V
2550: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2570: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
2580: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
25a0: 20 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d   a pragma statem
25b0: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61  ent.  .**.** Pra
25c0: 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73  gmas are of this
25d0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
25e0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
25f0: 2e 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a  .]id [= value].*
2600: 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66  *.** The identif
2610: 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  ier might also b
2620: 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65  e a string.  The
2630: 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
2640: 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74  ng, and.** ident
2650: 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62  ifier, or a numb
2660: 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61  er.  If minusFla
2670: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
2680: 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  the value is.** 
2690: 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61  a number that wa
26a0: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
26b0: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
26c0: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69  * If the left si
26d0: 64 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e  de is "database.
26e0: 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73  id" then pId1 is
26f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
2700: 6d 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69  me.** and pId2 i
2710: 73 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68  s the id.  If th
2720: 65 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a  e left side is j
2730: 75 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49  ust "id" then pI
2740: 64 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20  d1 is the.** id 
2750: 61 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20  and pId2 is any 
2760: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f  empty string..*/
2770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61  .void sqlite3Pra
2780: 67 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gma(.  Parse *pP
2790: 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a  arse, .  Token *
27a0: 70 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20  pId1,        /* 
27b0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73  First part of [s
27c0: 63 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20  chema.]id field 
27d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32  */.  Token *pId2
27e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  ,        /* Seco
27f0: 6e 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65  nd part of [sche
2800: 6d 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72  ma.]id field, or
2810: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
2820: 20 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f   *pValue,      /
2830: 2a 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c  * Token for <val
2840: 75 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ue>, or NULL */.
2850: 20 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20    int minusFlag 
2860: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2870: 20 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63   a '-' sign prec
2880: 65 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a  eded <value> */.
2890: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74  ){.  char *zLeft
28a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
28b0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
28c0: 46 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20  F-8 string <id> 
28d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68  */.  char *zRigh
28e0: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  t = 0;      /* N
28f0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2900: 46 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75  F-8 string <valu
2910: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2920: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2930: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64   = 0;   /* The d
2940: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
2950: 20 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20    Token *pId;   
2960: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2970: 74 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65  ter to <id> toke
2980: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63  n */.  char *aFc
2990: 6e 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a  ntl[4];       /*
29a0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c   Argument to SQL
29b0: 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41  ITE_FCNTL_PRAGMA
29c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 44 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66  Database index f
29f0: 6f 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f  or <database> */
2a00: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 2f 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  /* return value 
2a30: 66 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54  form SQLITE_FCNT
2a40: 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71  L_PRAGMA */.  sq
2a50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2a60: 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68  se->db;    /* Th
2a70: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2a80: 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70  ction */.  Db *p
2a90: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
2ab0: 70 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65  pecific database
2ac0: 20 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20   being pragmaed 
2ad0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
2ae0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
2af0: 61 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61  arse);  /* Prepa
2b00: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
2b10: 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e  .  const PragmaN
2b20: 61 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20  ame *pPragma;   
2b30: 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f  /* The pragma */
2b40: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
2b50: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2b60: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
2b70: 76 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  v);.  pParse->nM
2b80: 65 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e  em = 2;..  /* In
2b90: 74 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68  terpret the [sch
2ba0: 65 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68  ema.] part of th
2bb0: 65 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  e pragma stateme
2bc0: 6e 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20  nt. iDb is the. 
2bd0: 20 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65   ** index of the
2be0: 20 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70   database this p
2bf0: 72 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61  ragma is being a
2c00: 70 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e  pplied to in db.
2c10: 61 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20  aDb[]. */.  iDb 
2c20: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
2c30: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64  Name(pParse, pId
2c40: 31 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a  1, pId2, &pId);.
2c50: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
2c60: 74 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64  turn;.  pDb = &d
2c70: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
2c80: 2f 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64  /* If the temp d
2c90: 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
2ca0: 20 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65   explicitly name
2cb0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2cc0: 20 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d   .  ** pragma, m
2cd0: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f  ake sure it is o
2ce0: 70 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  pen. .  */.  if(
2cf0: 20 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74   iDb==1 && sqlit
2d00: 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
2d10: 73 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  se(pParse) ){.  
2d20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2d30: 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   zLeft = sqlite3
2d40: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
2d50: 2c 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a  , pId);.  if( !z
2d60: 4c 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Left ) return;. 
2d70: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
2d80: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
2d90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2da0: 2c 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29  , "-%T", pValue)
2db0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2dc0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e  Right = sqlite3N
2dd0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2de0: 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20   pValue);.  }.. 
2df0: 20 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b   assert( pId2 );
2e00: 0a 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e  .  zDb = pId2->n
2e10: 3e 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61  >0 ? pDb->zDbSNa
2e20: 6d 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71  me : 0;.  if( sq
2e30: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
2e40: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52  Parse, SQLITE_PR
2e50: 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69  AGMA, zLeft, zRi
2e60: 67 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ght, zDb) ){.   
2e70: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
2e80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64  ;.  }..  /* Send
2e90: 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   an SQLITE_FCNTL
2ea0: 5f 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e  _PRAGMA file-con
2eb0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65  trol to the unde
2ec0: 72 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20  rlying VFS.  ** 
2ed0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20  connection.  If 
2ee0: 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
2ef0: 45 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d  E_OK, then assum
2f00: 65 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20  e that the VFS. 
2f10: 20 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20   ** handled the 
2f20: 70 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72  pragma and gener
2f30: 61 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70  ate a no-op prep
2f40: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
2f50: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
2f60: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31  ENTATION-OF: R-1
2f70: 32 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65  2238-55120 Whene
2f80: 76 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61  ver a PRAGMA sta
2f90: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
2fa0: 2c 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45  ,.  ** an SQLITE
2fb0: 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69  _FCNTL_PRAGMA fi
2fc0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65  le control is se
2fd0: 6e 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73  nt to the open s
2fe0: 71 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a  qlite3_file.  **
2ff0: 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
3000: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  nding to the dat
3010: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68  abase file to wh
3020: 69 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20  ich the pragma. 
3030: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
3040: 66 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fers..  **.  ** 
3050: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
3060: 46 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38  F: R-29875-31678
3070: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   The argument to
3080: 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
3090: 4c 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69  L_PRAGMA.  ** fi
30a0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e  le control is an
30b0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
30c0: 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63  rs to strings (c
30d0: 68 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20  har**) in which 
30e0: 74 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20  the.  ** second 
30f0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
3100: 72 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65  rray is the name
3110: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61   of the pragma a
3120: 6e 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a  nd the third.  *
3130: 2a 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65  * element is the
3140: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3150: 20 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20   pragma or NULL 
3160: 69 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61  if the pragma ha
3170: 73 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65  s no.  ** argume
3180: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74  nt..  */.  aFcnt
3190: 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e  l[0] = 0;.  aFcn
31a0: 74 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20  tl[1] = zLeft;. 
31b0: 20 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69   aFcntl[2] = zRi
31c0: 67 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d  ght;.  aFcntl[3]
31d0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
31e0: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
31f0: 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
3200: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
3210: 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46  b, zDb, SQLITE_F
3220: 43 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f  CNTL_PRAGMA, (vo
3230: 69 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69  id*)aFcntl);.  i
3240: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3250: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
3260: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
3270: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
3280: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
3290: 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 0, COLNAME_NAM
32a0: 45 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51  E, aFcntl[0], SQ
32b0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
32c0: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
32d0: 65 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b  eText(v, aFcntl[
32e0: 30 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0]);.    sqlite3
32f0: 5f 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29  _free(aFcntl[0])
3300: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d  ;.    goto pragm
3310: 61 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  a_out;.  }.  if(
3320: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
3330: 4f 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20  OUND ){.    if( 
3340: 61 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20  aFcntl[0] ){.   
3350: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3360: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
3370: 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20   aFcntl[0]);.   
3380: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3390: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
33a0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  }.    pParse->nE
33b0: 72 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65  rr++;.    pParse
33c0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67  ->rc = rc;.    g
33d0: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
33e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
33f0: 20 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74   the pragma in t
3400: 68 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20  he lookup table 
3410: 2a 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70  */.  pPragma = p
3420: 72 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66  ragmaLocate(zLef
3430: 74 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d  t);.  if( pPragm
3440: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67  a==0 ) goto prag
3450: 6d 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61  ma_out;..  /* Ma
3460: 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
3470: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c  base schema is l
3480: 6f 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61  oaded if the pra
3490: 67 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61  gma requires tha
34a0: 74 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61  t */.  if( (pPra
34b0: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
34c0: 50 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65  PragFlg_NeedSche
34d0: 6d 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ma)!=0 ){.    if
34e0: 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
34f0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
3500: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
3510: 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
3520: 72 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c  r the result col
3530: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 70 72  umn names for pr
3540: 61 67 6d 61 73 20 74 68 61 74 20 72 65 74 75 72  agmas that retur
3550: 6e 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  n results */.  i
3560: 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72  f( (pPragma->mPr
3570: 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
3580: 4e 6f 43 6f 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20  NoColumns)==0 . 
3590: 20 20 26 26 20 28 28 70 50 72 61 67 6d 61 2d 3e    && ((pPragma->
35a0: 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
35b0: 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d  lg_NoColumns1)==
35c0: 30 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 29 0a  0 || zRight==0).
35d0: 20 20 29 7b 0a 20 20 20 20 73 65 74 50 72 61 67    ){.    setPrag
35e0: 6d 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61  maResultColumnNa
35f0: 6d 65 73 28 76 2c 20 70 50 72 61 67 6d 61 29 3b  mes(v, pPragma);
3600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
3610: 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
3620: 74 65 20 70 72 61 67 6d 61 20 68 61 6e 64 6c 65  te pragma handle
3630: 72 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70  r */.  switch( p
3640: 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70  Pragma->ePragTyp
3650: 20 29 7b 0a 20 20 0a 23 69 66 20 21 64 65 66 69   ){.  .#if !defi
3660: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3670: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 26  PAGER_PRAGMAS) &
3680: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
3690: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
36a0: 44 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  D).  /*.  **  PR
36b0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65  AGMA [schema.]de
36c0: 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65  fault_cache_size
36d0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
36e0: 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63  chema.]default_c
36f0: 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a  ache_size=N.  **
3700: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
3710: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
3720: 20 63 75 72 72 65 6e 74 20 70 65 72 73 69 73 74   current persist
3730: 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ent setting for 
3740: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
3750: 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76  che size.  The v
3760: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
3770: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
3780: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65  ber of.  ** page
3790: 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
37a0: 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  che.  The second
37b0: 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20   form sets both 
37c0: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
37d0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
37e0: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
37f0: 65 72 73 69 73 74 65 6e 74 20 70 61 67 65 20 63  ersistent page c
3800: 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a  ache size value.
3810: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74    ** stored in t
3820: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3830: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65  ..  **.  ** Olde
3840: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
3850: 4c 69 74 65 20 77 6f 75 6c 64 20 73 65 74 20 74  Lite would set t
3860: 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65  he default cache
3870: 20 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a 2a 20   size to a.  ** 
3880: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
3890: 74 6f 20 69 6e 64 69 63 61 74 65 20 73 79 6e 63  to indicate sync
38a0: 68 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20 54 68  hronous=OFF.  Th
38b0: 65 73 65 20 64 61 79 73 2c 20 73 79 6e 63 68 72  ese days, synchr
38c0: 6f 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 61 6c  onous.  ** is al
38d0: 77 61 79 73 20 6f 6e 20 62 79 20 64 65 66 61 75  ways on by defau
38e0: 6c 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  lt regardless of
38f0: 20 74 68 65 20 73 69 67 6e 20 6f 66 20 74 68 65   the sign of the
3900: 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a 20   default cache. 
3910: 20 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74 20 63   ** size.  But c
3920: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b 65 20  ontinue to take 
3930: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
3940: 75 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  ue of the defaul
3950: 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a  t cache.  ** siz
3960: 65 20 6f 66 20 68 69 73 74 6f 72 69 63 61 6c 20  e of historical 
3970: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 20  compatibility.. 
3980: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
3990: 79 70 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  yp_DEFAULT_CACHE
39a0: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 74 61  _SIZE: {.    sta
39b0: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c  tic const int iL
39c0: 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f  n = VDBE_OFFSET_
39d0: 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 73  LINENO(2);.    s
39e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65  tatic const Vdbe
39f0: 4f 70 4c 69 73 74 20 67 65 74 43 61 63 68 65 53  OpList getCacheS
3a00: 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ize[] = {.      
3a10: 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  { OP_Transaction
3a20: 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30  , 0, 0,        0
3a30: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  },              
3a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
3a50: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  */.      { OP_Re
3a60: 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 31 2c  adCookie,  0, 1,
3a70: 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 44 45          BTREE_DE
3a80: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
3a90: 7d 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20  },  /* 1 */.    
3aa0: 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20    { OP_IfPos,   
3ab0: 20 20 20 20 31 2c 20 38 2c 20 20 20 20 20 20 20      1, 8,       
3ac0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
3ad0: 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20  Integer,     0, 
3ae0: 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  2,        0},.  
3af0: 20 20 20 20 7b 20 4f 50 5f 53 75 62 74 72 61 63      { OP_Subtrac
3b00: 74 2c 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20  t,    1, 2,     
3b10: 20 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     1},.      { O
3b20: 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31  P_IfPos,       1
3b30: 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 8,        0},.
3b40: 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
3b50: 65 72 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  er,     0, 1,   
3b60: 20 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20 20       0},        
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 6 */.      {
3b90: 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
3ba0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
3bb0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73  ,.      { OP_Res
3bc0: 75 6c 74 52 6f 77 2c 20 20 20 31 2c 20 31 2c 20  ultRow,   1, 1, 
3bd0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
3be0: 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f  ;.    VdbeOp *aO
3bf0: 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  p;.    sqlite3Vd
3c00: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
3c10: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52  Db);.    if( !zR
3c20: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 50  ight ){.      pP
3c30: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b  arse->nMem += 2;
3c40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3c50: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
3c60: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
3c70: 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69  ySize(getCacheSi
3c80: 7a 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20  ze));.      aOp 
3c90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3ca0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
3cb0: 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65  ize(getCacheSize
3cc0: 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 2c  ), getCacheSize,
3cd0: 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28   iLn);.      if(
3ce0: 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43   ONLY_IF_REALLOC
3cf0: 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20  _STRESS(aOp==0) 
3d00: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61  ) break;.      a
3d10: 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[0].p1 = iDb;.
3d20: 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20        aOp[1].p1 
3d30: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70  = iDb;.      aOp
3d40: 5b 36 5d 2e 70 31 20 3d 20 53 51 4c 49 54 45 5f  [6].p1 = SQLITE_
3d50: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
3d60: 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ZE;.    }else{. 
3d70: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
3d80: 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
3d90: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
3da0: 68 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ht));.      sqli
3db0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
3dc0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
3dd0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
3de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3df0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
3e00: 20 69 44 62 2c 20 42 54 52 45 45 5f 44 45 46 41   iDb, BTREE_DEFA
3e10: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20  ULT_CACHE_SIZE, 
3e20: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73  size);.      ass
3e30: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3e40: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3e50: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
3e60: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63   pDb->pSchema->c
3e70: 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
3e80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3e90: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
3ea0: 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e  (pDb->pBt, pDb->
3eb0: 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73  pSchema->cache_s
3ec0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
3ed0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
3ee0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
3ef0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20  T_PAGER_PRAGMAS 
3f00: 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  && !SQLITE_OMIT_
3f10: 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 23  DEPRECATED */..#
3f20: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
3f30: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
3f40: 41 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a  AGMAS).  /*.  **
3f50: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
3f60: 2e 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20 2a 2a  .]page_size.  **
3f70: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
3f80: 2e 5d 70 61 67 65 5f 73 69 7a 65 3d 4e 0a 20 20  .]page_size=N.  
3f90: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
3fa0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
3fb0: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
3fc0: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
3fd0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
3fe0: 7a 65 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68  ze in bytes.  Th
3ff0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
4000: 74 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  ts the.  ** data
4010: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 76  base page size v
4020: 61 6c 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65  alue.  The value
4030: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 73 65 74   can only be set
4040: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74   if.  ** the dat
4050: 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 79 65  abase has not ye
4060: 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2e 0a  t been created..
4070: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
4080: 54 79 70 5f 50 41 47 45 5f 53 49 5a 45 3a 20 7b  Typ_PAGE_SIZE: {
4090: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
40a0: 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20  = pDb->pBt;.    
40b0: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
40c0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
40d0: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  t ){.      int s
40e0: 69 7a 65 20 3d 20 41 4c 57 41 59 53 28 70 42 74  ize = ALWAYS(pBt
40f0: 29 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  ) ? sqlite3Btree
4100: 47 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 29  GetPageSize(pBt)
4110: 20 3a 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   : 0;.      retu
4120: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73  rnSingleInt(v, s
4130: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
4140: 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  .      /* Malloc
4150: 20 6d 61 79 20 66 61 69 6c 20 77 68 65 6e 20 73   may fail when s
4160: 65 74 74 69 6e 67 20 74 68 65 20 70 61 67 65 2d  etting the page-
4170: 73 69 7a 65 2c 20 61 73 20 74 68 65 72 65 20 69  size, as there i
4180: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20  s an internal.  
4190: 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 74 68      ** buffer th
41a0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f 64  at the pager mod
41b0: 75 6c 65 20 72 65 73 69 7a 65 73 20 75 73 69 6e  ule resizes usin
41c0: 67 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  g sqlite3_reallo
41d0: 63 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  c()..      */.  
41e0: 20 20 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65      db->nextPage
41f0: 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74  size = sqlite3At
4200: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
4210: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
4220: 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
4230: 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
4240: 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
4250: 65 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20 20 20  e,-1,0) ){.     
4260: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
4270: 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  lt(db);.      }.
4280: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
4290: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
42a0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
42b0: 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20  ]secure_delete. 
42c0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
42d0: 65 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65  ema.]secure_dele
42e0: 74 65 3d 4f 4e 2f 4f 46 46 2f 46 41 53 54 0a 20  te=ON/OFF/FAST. 
42f0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
4300: 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20  st form reports 
4310: 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
4320: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
4330: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 66   secure_delete f
4340: 6c 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  lag.  The second
4350: 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68   form changes th
4360: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
4370: 20 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69 6e    ** flag settin
4380: 67 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74 68  g and reports th
4390: 65 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a  e new value..  *
43a0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
43b0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20  _SECURE_DELETE: 
43c0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
43d0: 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20   = pDb->pBt;.   
43e0: 20 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20   int b = -1;.   
43f0: 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20   assert( pBt!=0 
4400: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
4410: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  t ){.      if( s
4420: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
4430: 52 69 67 68 74 2c 20 22 66 61 73 74 22 29 3d 3d  Right, "fast")==
4440: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 20 3d  0 ){.        b =
4450: 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   2;.      }else{
4460: 0a 20 20 20 20 20 20 20 20 62 20 3d 20 73 71 6c  .        b = sql
4470: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
4480: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
4490: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
44a0: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62   pId2->n==0 && b
44b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
44c0: 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
44d0: 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
44e0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
44f0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
4500: 72 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62  reDelete(db->aDb
4510: 5b 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20  [ii].pBt, b);.  
4520: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4530: 62 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  b = sqlite3Btree
4540: 53 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74  SecureDelete(pBt
4550: 2c 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , b);.    return
4560: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b  SingleInt(v, b);
4570: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4580: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4590: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f  MA [schema.]max_
45a0: 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20  page_count.  ** 
45b0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
45c0: 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d  ]max_page_count=
45d0: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
45e0: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
45f0: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
4600: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
4610: 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62   ** maximum numb
4620: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
4630: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
4640: 2e 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63  .  The .  ** sec
4650: 6f 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74  ond form attempt
4660: 73 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73  s to change this
4670: 20 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a   setting.  Both.
4680: 20 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72    ** forms retur
4690: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  n the current se
46a0: 74 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tting..  **.  **
46b0: 20 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   The absolute va
46c0: 6c 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64  lue of N is used
46d0: 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
46e0: 75 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68  umented and migh
46f0: 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20  t.  ** change.  
4700: 54 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65  The only purpose
4710: 20 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61   is to provide a
4720: 6e 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65  n easy way to te
4730: 73 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  st.  ** the sqli
4740: 74 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75  te3AbsInt32() fu
4750: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  nction..  **.  *
4760: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4770: 61 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20  a.]page_count.  
4780: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
4790: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
47a0: 65 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  es in the specif
47b0: 69 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ied database..  
47c0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
47d0: 70 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a  p_PAGE_COUNT: {.
47e0: 20 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20      int iReg;.  
47f0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
4800: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
4810: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67  , iDb);.    iReg
4820: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4830: 6d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  m;.    if( sqlit
4840: 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b  e3Tolower(zLeft[
4850: 30 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20  0])=='p' ){.    
4860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4870: 4f 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f  Op2(v, OP_Pageco
4880: 75 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b  unt, iDb, iReg);
4890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
48a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
48b0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63  Op3(v, OP_MaxPgc
48c0: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a  nt, iDb, iReg, .
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
48f0: 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41  bsInt32(sqlite3A
4900: 74 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20  toi(zRight)));. 
4910: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
4920: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4930: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67  _ResultRow, iReg
4940: 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 1);.    break;
4950: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4960: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4970: 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20  ]locking_mode.  
4980: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4990: 6d 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ma.]locking_mode
49a0: 20 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75   = (normal|exclu
49b0: 73 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73  sive).  */.  cas
49c0: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e  e PragTyp_LOCKIN
49d0: 47 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f  G_MODE: {.    co
49e0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  nst char *zRet =
49f0: 20 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69   "normal";.    i
4a00: 6e 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f  nt eMode = getLo
4a10: 63 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74  ckingMode(zRight
4a20: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32  );..    if( pId2
4a30: 2d 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d  ->n==0 && eMode=
4a40: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4a50: 44 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20  DE_QUERY ){.    
4a60: 20 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41    /* Simple "PRA
4a70: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
4a80: 3b 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ;" statement. Th
4a90: 69 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f  is is a query fo
4aa0: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
4ab0: 75 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c  urrent default l
4ac0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69  ocking mode (whi
4ad0: 63 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  ch may be differ
4ae0: 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ent to.      ** 
4af0: 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
4b00: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
4b10: 61 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f  abase)..      */
4b20: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64  .      eMode = d
4b30: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b  b->dfltLockMode;
4b40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b50: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
4b60: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d  .      if( pId2-
4b70: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >n==0 ){.       
4b80: 20 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   /* This indicat
4b90: 65 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62  es that no datab
4ba0: 61 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65  ase name was spe
4bb0: 63 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20  cified as part. 
4bc0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
4bd0: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e   PRAGMA command.
4be0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
4bf0: 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d  e locking-mode m
4c00: 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
4c10: 2a 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74  * set on all att
4c20: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c  ached databases,
4c30: 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
4c40: 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20  main db file..  
4c50: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
4c60: 20 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71   ** Also, the sq
4c70: 6c 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f  lite3.dfltLockMo
4c80: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  de variable is s
4c90: 65 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20  et so that.     
4ca0: 20 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71     ** any subseq
4cb0: 75 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20  uently attached 
4cc0: 64 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75  databases also u
4cd0: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
4ce0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
4cf0: 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20  ing mode..      
4d00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
4d10: 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
4d20: 65 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44  ert(pDb==&db->aD
4d30: 62 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  b[0]);.        f
4d40: 6f 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e  or(ii=2; ii<db->
4d50: 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
4d60: 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
4d70: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4d80: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4da0: 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
4db0: 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f  Mode(pPager, eMo
4dc0: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  de);.        }. 
4dd0: 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c         db->dfltL
4de0: 6f 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  ockMode = (u8)eM
4df0: 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
4e00: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
4e10: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
4e20: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65  b->pBt);.      e
4e30: 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Mode = sqlite3Pa
4e40: 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  gerLockingMode(p
4e50: 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  Pager, eMode);. 
4e60: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
4e70: 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
4e80: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
4e90: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
4ea0: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4eb0: 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
4ec0: 49 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65  IVE );.    if( e
4ed0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4ee0: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
4ef0: 45 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20  E ){.      zRet 
4f00: 3d 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20  = "exclusive";. 
4f10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
4f20: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65  ingleText(v, zRe
4f30: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
4f40: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
4f50: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
4f60: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a  ournal_mode.  **
4f70: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4f80: 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  .]journal_mode =
4f90: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
4fa0: 20 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65             (dele
4fb0: 74 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74  te|persist|off|t
4fc0: 72 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77  runcate|memory|w
4fd0: 61 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63  al|off).  */.  c
4fe0: 61 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52  ase PragTyp_JOUR
4ff0: 4e 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20  NAL_MODE: {.    
5000: 69 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20  int eMode;      
5010: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
5020: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
5030: 45 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f  E_XXX symbols */
5040: 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
5050: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5060: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69  ounter */..    i
5070: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( zRight==0 ){.
5080: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
5090: 65 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20  e is no "=MODE" 
50a0: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67  part of the prag
50b0: 6d 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66  ma, do a query f
50c0: 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
50d0: 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a  current mode */.
50e0: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41        eMode = PA
50f0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
5100: 51 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65  QUERY;.    }else
5110: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
5120: 61 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20  ar *zMode;.     
5130: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
5140: 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29  Strlen30(zRight)
5150: 3b 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64  ;.      for(eMod
5160: 65 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71  e=0; (zMode = sq
5170: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65  lite3JournalMode
5180: 6e 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b  name(eMode))!=0;
5190: 20 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20   eMode++){.     
51a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
51b0: 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a  rNICmp(zRight, z
51c0: 4d 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72  Mode, n)==0 ) br
51d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
51e0: 20 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b     if( !zMode ){
51f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
5200: 68 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20  he "=MODE" part 
5210: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
5220: 6e 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c  ny known journal
5230: 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a   mode,.        *
5240: 2a 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72  * then do a quer
5250: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f  y */.        eMo
5260: 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
5270: 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20  ALMODE_QUERY;.  
5280: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5290: 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  if( eMode==PAGER
52a0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
52b0: 52 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30  RY && pId2->n==0
52c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e   ){.      /* Con
52d0: 76 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75  vert "PRAGMA jou
52e0: 72 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20  rnal_mode" into 
52f0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
5300: 72 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20  rnal_mode" */.  
5310: 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20      iDb = 0;.   
5320: 20 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a     pId2->n = 1;.
5330: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
5340: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d  =db->nDb-1; ii>=
5350: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
5360: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  if( db->aDb[ii].
5370: 70 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20  pBt && (ii==iDb 
5380: 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29  || pId2->n==0) )
5390: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
53a0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
53b0: 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73  , ii);.        s
53c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
53d0: 28 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  (v, OP_JournalMo
53e0: 64 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65  de, ii, 1, eMode
53f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5400: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5410: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
5420: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
5430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
5440: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
5450: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5460: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a  l_size_limit.  *
5470: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
5480: 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  a.]journal_size_
5490: 6c 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  limit=N.  **.  *
54a0: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
54b0: 20 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72   size limit on r
54c0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
54d0: 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  files..  */.  ca
54e0: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
54f0: 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b  AL_SIZE_LIMIT: {
5500: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
5510: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
5520: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
5530: 3b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74  ;.    i64 iLimit
5540: 20 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a   = -2;.    if( z
5550: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
5560: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
5570: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69  I64(zRight, &iLi
5580: 6d 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mit);.      if( 
5590: 69 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d  iLimit<-1 ) iLim
55a0: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  it = -1;.    }. 
55b0: 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69     iLimit = sqli
55c0: 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
55d0: 69 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c  izeLimit(pPager,
55e0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65   iLimit);.    re
55f0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
5600: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72   iLimit);.    br
5610: 65 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  eak;.  }..#endif
5620: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5630: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
5640: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
5650: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74  GMA [schema.]aut
5660: 6f 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50  o_vacuum.  **  P
5670: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
5680: 75 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a  uto_vacuum=N.  *
5690: 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65  *.  ** Get or se
56a0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
56b0: 68 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74  he database 'aut
56c0: 6f 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65  o-vacuum' parame
56d0: 74 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  ter..  ** The va
56e0: 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20  lue is one of:  
56f0: 30 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20  0 NONE 1 FULL 2 
5700: 49 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f  INCREMENTAL.  */
5710: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5720: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
5730: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
5740: 55 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20  UTO_VACUUM: {.  
5750: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
5760: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  Db->pBt;.    ass
5770: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
5780: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
5790: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
57a0: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74  ngleInt(v, sqlit
57b0: 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
57c0: 63 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20  cuum(pBt));.    
57d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
57e0: 20 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f   eAuto = getAuto
57f0: 56 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a  Vacuum(zRight);.
5800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41        assert( eA
5810: 75 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c  uto>=0 && eAuto<
5820: 3d 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  =2 );.      db->
5830: 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75  nextAutovac = (u
5840: 38 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f  8)eAuto;.      /
5850: 2a 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61  * Call SetAutoVa
5860: 63 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e  cuum() to set in
5870: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74  itialize the int
5880: 65 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20  ernal auto and. 
5890: 20 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63       ** incr-vac
58a0: 75 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20  uum flags. This 
58b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
58c0: 61 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ase this connect
58d0: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65  ion.      ** cre
58e0: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
58f0: 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d  e file. It is im
5900: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20  portant that it 
5910: 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  is created.     
5920: 20 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76   ** as an auto-v
5930: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62  acuum capable db
5940: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5950: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5960: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
5970: 70 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20  pBt, eAuto);.   
5980: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5990: 45 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d  E_OK && (eAuto==
59a0: 31 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29  1 || eAuto==2) )
59b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  {.        /* Whe
59c0: 6e 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75  n setting the au
59d0: 74 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to_vacuum mode t
59e0: 6f 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20  o either "full" 
59f0: 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  or .        ** "
5a00: 69 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72  incremental", wr
5a10: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ite the value of
5a20: 20 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20   meta[6] in the 
5a30: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
5a40: 20 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65   ** file. Before
5a50: 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61   writing to meta
5a60: 5b 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20  [6], check that 
5a70: 6d 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65  meta[3] indicate
5a80: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
5a90: 74 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73  t this really is
5aa0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
5ab0: 63 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65  capable database
5ac0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5ad0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
5ae0: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
5af0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
5b00: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  );.        stati
5b10: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
5b20: 73 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20  st setMeta6[] = 
5b30: 7b 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50  {.          { OP
5b40: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
5b50: 20 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20   0,         1,  
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b70: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
5b80: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61          { OP_Rea
5b90: 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20  dCookie,     0, 
5ba0: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5bb0: 20 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54     BTREE_LARGEST
5bc0: 5f 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20  _ROOT_PAGE},.   
5bd0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20         { OP_If, 
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20              1,  
5bf0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
5c00: 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20            0},   
5c10: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20   /* 2 */.       
5c20: 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20     { OP_Halt,   
5c30: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
5c40: 4b 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20  K, OE_Abort,    
5c50: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c60: 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  3 */.          {
5c70: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
5c80: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42      0,         B
5c90: 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d  TREE_INCR_VACUUM
5ca0: 2c 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f  , 0},    /* 4 */
5cb0: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
5cc0: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
5cd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64  .        int iAd
5ce0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5cf0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
5d00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5d10: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
5d20: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
5d30: 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29  aySize(setMeta6)
5d40: 29 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d  );.        aOp =
5d50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d60: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
5d70: 7a 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65  ze(setMeta6), se
5d80: 74 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20  tMeta6, iLn);.  
5d90: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
5da0: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
5db0: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
5dc0: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d  ;.        aOp[0]
5dd0: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
5de0: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
5df0: 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  Db;.        aOp[
5e00: 32 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b  2].p2 = iAddr+4;
5e10: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e  .        aOp[4].
5e20: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5e30: 20 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41    aOp[4].p3 = eA
5e40: 75 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  uto - 1;.       
5e50: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
5e60: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
5e70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5e80: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
5e90: 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  if..  /*.  **  P
5ea0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69  RAGMA [schema.]i
5eb0: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
5ec0: 6d 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  m(N).  **.  ** D
5ed0: 6f 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63  o N steps of inc
5ee0: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69  remental vacuumi
5ef0: 6e 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ng on a database
5f00: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5f10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5f20: 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61  ACUUM.  case Pra
5f30: 67 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c  gTyp_INCREMENTAL
5f40: 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69  _VACUUM: {.    i
5f50: 6e 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b  nt iLimit, addr;
5f60: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
5f70: 3d 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65  =0 || !sqlite3Ge
5f80: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
5f90: 69 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69  iLimit) || iLimi
5fa0: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  t<=0 ){.      iL
5fb0: 69 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66  imit = 0x7ffffff
5fc0: 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  f;.    }.    sql
5fd0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5fe0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5ff0: 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
6000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6010: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c  , OP_Integer, iL
6020: 69 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64  imit, 1);.    ad
6030: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
6040: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63  AddOp1(v, OP_Inc
6050: 72 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56  rVacuum, iDb); V
6060: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6080: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp1(v, OP_Resu
6090: 6c 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73  ltRow, 1);.    s
60a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
60b0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
60c0: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
60d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
60e0: 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64  OP_IfPos, 1, add
60f0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
6100: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6110: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
6120: 61 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b  addr);.    break
6130: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
6140: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6150: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
6160: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6170: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6180: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
6190: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
61a0: 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20  e_size=N.  **.  
61b0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
61c0: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
61d0: 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74  rrent local sett
61e0: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
61f0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
6200: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  . The second for
6210: 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c  m sets the local
6220: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
6230: 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66   size value.  If
6240: 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74   N is positive t
6250: 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a  hen that is the.
6260: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
6270: 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
6280: 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61  e.  If N is nega
6290: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  tive, then the. 
62a0: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
62b0: 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20  ges is adjusted 
62c0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
62d0: 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79  e uses -N kibiby
62e0: 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f  tes.  ** of memo
62f0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
6300: 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49  PragTyp_CACHE_SI
6310: 5a 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE: {.    assert
6320: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
6330: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
6340: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
6350: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6360: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6370: 28 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  (v, pDb->pSchema
6380: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
6390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
63a0: 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74  int size = sqlit
63b0: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
63c0: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
63d0: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  ma->cache_size =
63e0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
63f0: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
6400: 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20  eSize(pDb->pBt, 
6410: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
6420: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
6430: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6440: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
6450: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6460: 65 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52  e_spill.  **  PR
6470: 41 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c  AGMA cache_spill
6480: 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50  =BOOLEAN.  **  P
6490: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63  RAGMA [schema.]c
64a0: 61 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a  ache_spill=N.  *
64b0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
64c0: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
64d0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20  e current local 
64e0: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
64f0: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
6500: 73 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20  spill size. The 
6510: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e  second form turn
6520: 73 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e  s cache spill on
6530: 0a 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57  .  ** or off.  W
6540: 68 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63  hen turnning cac
6550: 68 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65  he spill on, the
6560: 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
6570: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
6580: 20 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68   cache_size.  Th
6590: 65 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74  e third form set
65a0: 73 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74  s a spill size t
65b0: 68 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  hat.  ** may be 
65c0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74  different form t
65d0: 68 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  he cache size.. 
65e0: 20 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69   ** If N is posi
65f0: 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69  tive then that i
6600: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
6610: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6620: 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69  e cache.  If N i
6630: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
6640: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
6650: 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a   of pages is adj
6660: 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  usted so that th
6670: 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20  e cache uses -N 
6680: 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f  kibibytes.  ** o
6690: 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20  f memory..  **. 
66a0: 20 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   ** If the numbe
66b0: 72 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c  r of cache_spill
66c0: 20 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74   pages is less t
66d0: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
66e0: 66 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a  f.  ** cache_siz
66f0: 65 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c  e pages, no spil
6700: 6c 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69  ling occurs unti
6710: 6c 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  l the page count
6720: 20 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68   exceeds.  ** th
6730: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
6740: 65 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20  e_size pages..  
6750: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68  **.  ** The cach
6760: 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20  e_spill=BOOLEAN 
6770: 73 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20  setting applies 
6780: 74 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  to all attached 
6790: 73 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f  schemas,.  ** no
67a0: 74 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d  t just the schem
67b0: 61 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a  a specified..  *
67c0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
67d0: 5f 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a  _CACHE_SPILL: {.
67e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
67f0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
6800: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
6810: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
6820: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
6830: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20  nSingleInt(v,.  
6840: 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67         (db->flag
6850: 73 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65  s & SQLITE_Cache
6860: 53 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20  Spill)==0 ? 0 : 
6870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6880: 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
6890: 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30  lSize(pDb->pBt,0
68a0: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
68b0: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
68c0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  1;.      if( sql
68d0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
68e0: 67 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20  ght, &size) ){. 
68f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
6900: 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
6910: 70 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b  pDb->pBt, size);
6920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6930: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
6940: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a  lean(zRight, siz
6950: 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  e!=0) ){.       
6960: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
6970: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b  LITE_CacheSpill;
6980: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6990: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
69a0: 26 3d 20 7e 28 75 36 34 29 53 51 4c 49 54 45 5f  &= ~(u64)SQLITE_
69b0: 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20 20  CacheSpill;.    
69c0: 20 20 7d 0a 20 20 20 20 20 20 73 65 74 41 6c 6c    }.      setAll
69d0: 50 61 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a  PagerFlags(db);.
69e0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
69f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
6a00: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
6a10: 5d 6d 6d 61 70 5f 73 69 7a 65 28 4e 29 0a 20 20  ]mmap_size(N).  
6a20: 2a 2a 0a 20 20 2a 2a 20 55 73 65 64 20 74 6f 20  **.  ** Used to 
6a30: 73 65 74 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  set mapping size
6a40: 20 6c 69 6d 69 74 2e 20 54 68 65 20 6d 61 70 70   limit. The mapp
6a50: 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 20 69  ing size limit i
6a60: 73 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 6c  s.  ** used to l
6a70: 69 6d 69 74 20 74 68 65 20 61 67 67 72 65 67 61  imit the aggrega
6a80: 74 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 6d  te size of all m
6a90: 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65 67  emory mapped reg
6aa0: 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ions of the.  **
6ab0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
6ac0: 49 66 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  If this paramete
6ad0: 72 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  r is set to zero
6ae0: 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
6af0: 70 70 69 6e 67 0a 20 20 2a 2a 20 69 73 20 6e 6f  pping.  ** is no
6b00: 74 20 75 73 65 64 20 61 74 20 61 6c 6c 2e 20 20  t used at all.  
6b10: 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65  If N is negative
6b20: 2c 20 74 68 65 6e 20 74 68 65 20 64 65 66 61 75  , then the defau
6b30: 6c 74 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20 20  lt memory map.  
6b40: 2a 2a 20 6c 69 6d 69 74 20 64 65 74 65 72 6d 69  ** limit determi
6b50: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63  ned by sqlite3_c
6b60: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
6b70: 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 29 20 69  FIG_MMAP_SIZE) i
6b80: 73 20 73 65 74 2e 0a 20 20 2a 2a 20 54 68 65 20  s set..  ** The 
6b90: 70 61 72 61 6d 65 74 65 72 20 4e 20 69 73 20 6d  parameter N is m
6ba0: 65 61 73 75 72 65 64 20 69 6e 20 62 79 74 65 73  easured in bytes
6bb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
6bc0: 20 76 61 6c 75 65 20 69 73 20 61 64 76 69 73 6f   value is adviso
6bd0: 72 79 2e 20 20 54 68 65 20 75 6e 64 65 72 6c 79  ry.  The underly
6be0: 69 6e 67 20 56 46 53 20 69 73 20 66 72 65 65 20  ing VFS is free 
6bf0: 74 6f 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20 20  to memory map.  
6c00: 2a 2a 20 61 73 20 6c 69 74 74 6c 65 20 6f 72 20  ** as little or 
6c10: 61 73 20 6d 75 63 68 20 61 73 20 69 74 20 77 61  as much as it wa
6c20: 6e 74 73 2e 20 20 45 78 63 65 70 74 2c 20 69 66  nts.  Except, if
6c30: 20 4e 20 69 73 20 73 65 74 20 74 6f 20 30 20 74   N is set to 0 t
6c40: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 75 70 70  hen the.  ** upp
6c50: 65 72 20 6c 61 79 65 72 73 20 77 69 6c 6c 20 6e  er layers will n
6c60: 65 76 65 72 20 69 6e 76 6f 6b 65 20 74 68 65 20  ever invoke the 
6c70: 78 46 65 74 63 68 20 69 6e 74 65 72 66 61 63 65  xFetch interface
6c80: 73 20 74 6f 20 74 68 65 20 56 46 53 2e 0a 20 20  s to the VFS..  
6c90: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
6ca0: 70 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  p_MMAP_SIZE: {. 
6cb0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
6cc0: 20 73 7a 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f   sz;.#if SQLITE_
6cd0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
6ce0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
6cf0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
6d00: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
6d10: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
6d20: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
6d30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
6d40: 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69  ecOrHexToI64(zRi
6d50: 67 68 74 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20  ght, &sz);.     
6d60: 20 69 66 28 20 73 7a 3c 30 20 29 20 73 7a 20 3d   if( sz<0 ) sz =
6d70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
6d80: 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 20  nfig.szMmap;.   
6d90: 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d     if( pId2->n==
6da0: 30 20 29 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d  0 ) db->szMmap =
6db0: 20 73 7a 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   sz;.      for(i
6dc0: 69 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e  i=db->nDb-1; ii>
6dd0: 3d 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20  =0; ii--){.     
6de0: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
6df0: 69 5d 2e 70 42 74 20 26 26 20 28 69 69 3d 3d 69  i].pBt && (ii==i
6e00: 44 62 20 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30  Db || pId2->n==0
6e10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
6e20: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
6e30: 61 70 4c 69 6d 69 74 28 64 62 2d 3e 61 44 62 5b  apLimit(db->aDb[
6e40: 69 69 5d 2e 70 42 74 2c 20 73 7a 29 3b 0a 20 20  ii].pBt, sz);.  
6e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6e60: 20 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20 2d      }.    sz = -
6e70: 31 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  1;.    rc = sqli
6e80: 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
6e90: 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45  (db, zDb, SQLITE
6ea0: 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
6eb0: 2c 20 26 73 7a 29 3b 0a 23 65 6c 73 65 0a 20 20  , &sz);.#else.  
6ec0: 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 72 63    sz = 0;.    rc
6ed0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
6ee0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 3d  ndif.    if( rc=
6ef0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6f00: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
6f10: 49 6e 74 28 76 2c 20 73 7a 29 3b 0a 20 20 20 20  Int(v, sz);.    
6f20: 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
6f30: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
6f40: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
6f50: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Err++;.      pPa
6f60: 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
6f70: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
6f80: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
6f90: 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
6fa0: 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  e.  **   PRAGMA 
6fb0: 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 22 64 65  temp_store = "de
6fc0: 66 61 75 6c 74 22 7c 22 6d 65 6d 6f 72 79 22 7c  fault"|"memory"|
6fd0: 22 66 69 6c 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a  "file".  **.  **
6fe0: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
6ff0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f  he local value o
7000: 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65  f the temp_store
7010: 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
7020: 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20  .  ** the local 
7030: 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d  value does not m
7040: 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ake changes to t
7050: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64  he disk file and
7060: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a   the default.  *
7070: 2a 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  * value will be 
7080: 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78  restored the nex
7090: 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62  t time the datab
70a0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2e 0a 20  ase is opened.. 
70b0: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
70c0: 61 74 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  at it is possibl
70d0: 65 20 66 6f 72 20 74 68 65 20 6c 69 62 72 61 72  e for the librar
70e0: 79 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  y compile-time o
70f0: 70 74 69 6f 6e 73 20 74 6f 0a 20 20 2a 2a 20 6f  ptions to.  ** o
7100: 76 65 72 72 69 64 65 20 74 68 69 73 20 73 65 74  verride this set
7110: 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ting.  */.  case
7120: 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53 54   PragTyp_TEMP_ST
7130: 4f 52 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21  ORE: {.    if( !
7140: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
7150: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
7160: 76 2c 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  v, db->temp_stor
7170: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
7180: 20 20 20 20 20 63 68 61 6e 67 65 54 65 6d 70 53       changeTempS
7190: 74 6f 72 61 67 65 28 70 50 61 72 73 65 2c 20 7a  torage(pParse, z
71a0: 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20  Right);.    }.  
71b0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
71c0: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
71d0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
71e0: 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52 41  ctory.  **   PRA
71f0: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
7200: 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c 22 64  irectory = ""|"d
7210: 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a 20  irectory_name". 
7220: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
7230: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
7240: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65   value of the te
7250: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
7260: 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69  ry flag.  Changi
7270: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  ng.  ** the valu
7280: 65 20 73 65 74 73 20 61 20 73 70 65 63 69 66 69  e sets a specifi
7290: 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 62  c directory to b
72a0: 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f  e used for tempo
72b0: 72 61 72 79 20 66 69 6c 65 73 2e 0a 20 20 2a 2a  rary files..  **
72c0: 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75   Setting to a nu
72d0: 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74  ll string revert
72e0: 73 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  s to the default
72f0: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
7300: 74 6f 72 79 20 73 65 61 72 63 68 2e 0a 20 20 2a  tory search..  *
7310: 2a 20 49 66 20 74 65 6d 70 6f 72 61 72 79 20 64  * If temporary d
7320: 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e  irectory is chan
7330: 67 65 64 2c 20 74 68 65 6e 20 69 6e 76 61 6c 69  ged, then invali
7340: 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 2e  dateTempStorage.
7350: 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73  .  **.  */.  cas
7360: 65 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53  e PragTyp_TEMP_S
7370: 54 4f 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20  TORE_DIRECTORY: 
7380: 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  {.    if( !zRigh
7390: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
73a0: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 73  nSingleText(v, s
73b0: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
73c0: 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73  ctory);.    }els
73d0: 65 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e{.#ifndef SQLIT
73e0: 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20  E_OMIT_WSD.     
73f0: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
7400: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
7410: 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
7420: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
7430: 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68 74  db->pVfs, zRight
7440: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
7450: 52 45 41 44 57 52 49 54 45 2c 20 26 72 65 73 29  READWRITE, &res)
7460: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
7470: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  !=SQLITE_OK || r
7480: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
7490: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
74a0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20  sg(pParse, "not 
74b0: 61 20 77 72 69 74 61 62 6c 65 20 64 69 72 65 63  a writable direc
74c0: 74 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20  tory");.        
74d0: 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75    goto pragma_ou
74e0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
74f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 53     }.      if( S
7500: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
7510: 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 53  ==0.       || (S
7520: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
7530: 3d 3d 31 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f  ==1 && db->temp_
7540: 73 74 6f 72 65 3c 3d 31 29 0a 20 20 20 20 20 20  store<=1).      
7550: 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d 50   || (SQLITE_TEMP
7560: 5f 53 54 4f 52 45 3d 3d 32 20 26 26 20 64 62 2d  _STORE==2 && db-
7570: 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 31 29 0a  >temp_store==1).
7580: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
7590: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
75a0: 74 6f 72 61 67 65 28 70 50 61 72 73 65 29 3b 0a  torage(pParse);.
75b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
75c0: 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69 74  lite3_free(sqlit
75d0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
75e0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  y);.      if( zR
75f0: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
7600: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f     sqlite3_temp_
7610: 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c 69  directory = sqli
7620: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
7630: 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , zRight);.     
7640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7650: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
7660: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20  ectory = 0;.    
7670: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
7680: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a 2f  LITE_OMIT_WSD */
7690: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
76a0: 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ;.  }..#if SQLIT
76b0: 45 5f 4f 53 5f 57 49 4e 0a 20 20 2f 2a 0a 20 20  E_OS_WIN.  /*.  
76c0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 64 61 74 61  **   PRAGMA data
76d0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
76e0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 64  .  **   PRAGMA d
76f0: 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  ata_store_direct
7700: 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74  ory = ""|"direct
7710: 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20  ory_name".  **. 
7720: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
7730: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
7740: 65 20 6f 66 20 74 68 65 20 64 61 74 61 5f 73 74  e of the data_st
7750: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c  ore_directory fl
7760: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7770: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7780: 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72  s a specific dir
7790: 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65  ectory to be use
77a0: 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  d for database f
77b0: 69 6c 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 77  iles that.  ** w
77c0: 65 72 65 20 73 70 65 63 69 66 69 65 64 20 77 69  ere specified wi
77d0: 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
77e0: 74 68 6e 61 6d 65 2e 20 20 53 65 74 74 69 6e 67  thname.  Setting
77f0: 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e   to a null strin
7800: 67 20 72 65 76 65 72 74 73 0a 20 20 2a 2a 20 74  g reverts.  ** t
7810: 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 61  o the default da
7820: 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  tabase directory
7830: 2c 20 77 68 69 63 68 20 66 6f 72 20 64 61 74 61  , which for data
7840: 62 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69  base files speci
7850: 66 69 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 61  fied with.  ** a
7860: 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 77   relative path w
7870: 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 62 65 20  ill probably be 
7880: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72  based on the cur
7890: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 66  rent directory f
78a0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63  or the.  ** proc
78b0: 65 73 73 2e 20 20 44 61 74 61 62 61 73 65 20 66  ess.  Database f
78c0: 69 6c 65 20 73 70 65 63 69 66 69 65 64 20 77 69  ile specified wi
78d0: 74 68 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  th an absolute p
78e0: 61 74 68 20 61 72 65 20 6e 6f 74 20 69 6d 70 61  ath are not impa
78f0: 63 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 69  cted.  ** by thi
7900: 73 20 73 65 74 74 69 6e 67 2c 20 72 65 67 61 72  s setting, regar
7910: 64 6c 65 73 73 20 6f 66 20 69 74 73 20 76 61 6c  dless of its val
7920: 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20  ue..  **.  */.  
7930: 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 41 54  case PragTyp_DAT
7940: 41 5f 53 54 4f 52 45 5f 44 49 52 45 43 54 4f 52  A_STORE_DIRECTOR
7950: 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52  Y: {.    if( !zR
7960: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65  ight ){.      re
7970: 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76  turnSingleText(v
7980: 2c 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  , sqlite3_data_d
7990: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d  irectory);.    }
79a0: 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51  else{.#ifndef SQ
79b0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
79c0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
79d0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ] ){.        int
79e0: 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
79f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
7a00: 73 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69  ss(db->pVfs, zRi
7a10: 67 68 74 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ght, SQLITE_ACCE
7a20: 53 53 5f 52 45 41 44 57 52 49 54 45 2c 20 26 72  SS_READWRITE, &r
7a30: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
7a40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
7a50: 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  | res==0 ){.    
7a60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7a70: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
7a80: 6f 74 20 61 20 77 72 69 74 61 62 6c 65 20 64 69  ot a writable di
7a90: 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20  rectory");.     
7aa0: 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61       goto pragma
7ab0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
7ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
7ad0: 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69 74  lite3_free(sqlit
7ae0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7af0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  y);.      if( zR
7b00: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
7b10: 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
7b20: 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c 69  directory = sqli
7b30: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
7b40: 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , zRight);.     
7b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7b60: 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
7b70: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20  ectory = 0;.    
7b80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
7b90: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a 2f  LITE_OMIT_WSD */
7ba0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
7bb0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
7bc0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7bd0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
7be0: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
7bf0: 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70   [schema.]lock_p
7c00: 72 6f 78 79 5f 66 69 6c 65 0a 20 20 2a 2a 20 20  roxy_file.  **  
7c10: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
7c20: 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
7c30: 20 3d 20 22 3a 61 75 74 6f 3a 22 7c 22 6c 6f 63   = ":auto:"|"loc
7c40: 6b 5f 66 69 6c 65 5f 70 61 74 68 22 0a 20 20 2a  k_file_path".  *
7c50: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72  *.  ** Return or
7c60: 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   set the value o
7c70: 66 20 74 68 65 20 6c 6f 63 6b 5f 70 72 6f 78 79  f the lock_proxy
7c80: 5f 66 69 6c 65 20 66 6c 61 67 2e 20 20 43 68 61  _file flag.  Cha
7c90: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76  nging.  ** the v
7ca0: 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63  alue sets a spec
7cb0: 69 66 69 63 20 66 69 6c 65 20 74 6f 20 62 65 20  ific file to be 
7cc0: 75 73 65 64 20 66 6f 72 20 64 61 74 61 62 61 73  used for databas
7cd0: 65 20 61 63 63 65 73 73 20 6c 6f 63 6b 73 2e 0a  e access locks..
7ce0: 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65    **.  */.  case
7cf0: 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 50 52   PragTyp_LOCK_PR
7d00: 4f 58 59 5f 46 49 4c 45 3a 20 7b 0a 20 20 20 20  OXY_FILE: {.    
7d10: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
7d20: 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67       Pager *pPag
7d30: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
7d40: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
7d50: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 72  ;.      char *pr
7d60: 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 20 3d 20  oxy_file_path = 
7d70: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 73 71 6c 69  NULL;.      sqli
7d80: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20  te3_file *pFile 
7d90: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
7da0: 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  le(pPager);.    
7db0: 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
7dc0: 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65  ontrolHint(pFile
7dd0: 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
7de0: 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20  KPROXYFILE, .   
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 20 20 20 20 20 20 20 26 70 72 6f 78 79 5f 66          &proxy_f
7e10: 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20 20 20  ile_path);.     
7e20: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
7e30: 74 28 76 2c 20 70 72 6f 78 79 5f 66 69 6c 65 5f  t(v, proxy_file_
7e40: 70 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65  path);.    }else
7e50: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
7e60: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
7e70: 74 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70  treePager(pDb->p
7e80: 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Bt);.      sqlit
7e90: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d  e3_file *pFile =
7ea0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
7eb0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
7ec0: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
7ed0: 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b  if( zRight[0] ){
7ee0: 0a 20 20 20 20 20 20 20 20 72 65 73 3d 73 71 6c  .        res=sql
7ef0: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
7f00: 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  l(pFile, SQLITE_
7f10: 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
7f20: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 20 20 20 20 20 20 20 20 7a 52 69 67 68 74 29           zRight)
7f50: 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
7f60: 0a 20 20 20 20 20 20 20 20 72 65 73 3d 73 71 6c  .        res=sql
7f70: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
7f80: 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  l(pFile, SQLITE_
7f90: 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
7fa0: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a           NULL);.
7fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7fe0: 28 20 72 65 73 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( res!=SQLITE_OK
7ff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8000: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8010: 73 65 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73  se, "failed to s
8020: 65 74 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69  et lock proxy fi
8030: 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  le");.        go
8040: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
8050: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8060: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
8070: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
8080: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
8090: 45 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 0a  E */      .    .
80a0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
80b0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63  MA [schema.]sync
80c0: 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 20 50  hronous.  **   P
80d0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73  RAGMA [schema.]s
80e0: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 7c 4f  ynchronous=OFF|O
80f0: 4e 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 7c 45 58  N|NORMAL|FULL|EX
8100: 54 52 41 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  TRA.  **.  ** Re
8110: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
8120: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  local value of t
8130: 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66  he synchronous f
8140: 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20  lag.  Changing. 
8150: 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76 61   ** the local va
8160: 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b  lue does not mak
8170: 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
8180: 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20 74   disk file and t
8190: 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
81a0: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65  value will be re
81b0: 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74 20  stored the next 
81c0: 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
81d0: 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65 64  e is.  ** opened
81e0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
81f0: 61 67 54 79 70 5f 53 59 4e 43 48 52 4f 4e 4f 55  agTyp_SYNCHRONOU
8200: 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52  S: {.    if( !zR
8210: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65  ight ){.      re
8220: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
8230: 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
8240: 65 6c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  el-1);.    }else
8250: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d  {.      if( !db-
8260: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
8270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
8280: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
8290: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 61 66              "Saf
82a0: 65 74 79 20 6c 65 76 65 6c 20 6d 61 79 20 6e 6f  ety level may no
82b0: 74 20 62 65 20 63 68 61 6e 67 65 64 20 69 6e 73  t be changed ins
82c0: 69 64 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ide a transactio
82d0: 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n");.      }else
82e0: 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20   if( iDb!=1 ){. 
82f0: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 76 65         int iLeve
8300: 6c 20 3d 20 28 67 65 74 53 61 66 65 74 79 4c 65  l = (getSafetyLe
8310: 76 65 6c 28 7a 52 69 67 68 74 2c 30 2c 31 29 2b  vel(zRight,0,1)+
8320: 31 29 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  1) & PAGER_SYNCH
8330: 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 20  RONOUS_MASK;.   
8340: 20 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3d       if( iLevel=
8350: 3d 30 20 29 20 69 4c 65 76 65 6c 20 3d 20 31 3b  =0 ) iLevel = 1;
8360: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61  .        pDb->sa
8370: 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 69 4c 65  fety_level = iLe
8380: 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 70 44 62  vel;.        pDb
8390: 2d 3e 62 53 79 6e 63 53 65 74 20 3d 20 31 3b 0a  ->bSyncSet = 1;.
83a0: 20 20 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61          setAllPa
83b0: 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20  gerFlags(db);.  
83c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
83d0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
83e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
83f0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a  _PAGER_PRAGMAS *
8400: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
8410: 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47  E_OMIT_FLAG_PRAG
8420: 4d 41 53 0a 20 20 63 61 73 65 20 50 72 61 67 54  MAS.  case PragT
8430: 79 70 5f 46 4c 41 47 3a 20 7b 0a 20 20 20 20 69  yp_FLAG: {.    i
8440: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( zRight==0 ){.
8450: 20 20 20 20 20 20 73 65 74 50 72 61 67 6d 61 52        setPragmaR
8460: 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  esultColumnNames
8470: 28 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20  (v, pPragma);.  
8480: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
8490: 49 6e 74 28 76 2c 20 28 64 62 2d 3e 66 6c 61 67  Int(v, (db->flag
84a0: 73 20 26 20 70 50 72 61 67 6d 61 2d 3e 69 41 72  s & pPragma->iAr
84b0: 67 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  g)!=0 );.    }el
84c0: 73 65 7b 0a 20 20 20 20 20 20 75 36 34 20 6d 61  se{.      u64 ma
84d0: 73 6b 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41  sk = pPragma->iA
84e0: 72 67 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  rg;    /* Mask o
84f0: 66 20 62 69 74 73 20 74 6f 20 73 65 74 20 6f 72  f bits to set or
8500: 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 20 20 20   clear. */.     
8510: 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
8520: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
8530: 20 20 2f 2a 20 46 6f 72 65 69 67 6e 20 6b 65 79    /* Foreign key
8540: 20 73 75 70 70 6f 72 74 20 6d 61 79 20 6e 6f 74   support may not
8550: 20 62 65 20 65 6e 61 62 6c 65 64 20 6f 72 20 64   be enabled or d
8560: 69 73 61 62 6c 65 64 20 77 68 69 6c 65 20 6e 6f  isabled while no
8570: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
8580: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65  auto-commit mode
8590: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61  .  */.        ma
85a0: 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 46  sk &= ~(SQLITE_F
85b0: 6f 72 65 69 67 6e 4b 65 79 73 29 3b 0a 20 20 20  oreignKeys);.   
85c0: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
85d0: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
85e0: 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 64 62  ION.      if( db
85f0: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
8600: 3d 3d 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a  ==UAUTH_User ){.
8610: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
8620: 74 20 61 6c 6c 6f 77 20 6e 6f 6e 2d 61 64 6d 69  t allow non-admi
8630: 6e 20 75 73 65 72 73 20 74 6f 20 6d 6f 64 69 66  n users to modif
8640: 79 20 74 68 65 20 73 63 68 65 6d 61 20 61 72 62  y the schema arb
8650: 69 74 72 61 72 69 6c 79 20 2a 2f 0a 20 20 20 20  itrarily */.    
8660: 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53 51      mask &= ~(SQ
8670: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
8680: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
8690: 66 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  f..      if( sql
86a0: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
86b0: 52 69 67 68 74 2c 20 30 29 20 29 7b 0a 20 20 20  Right, 0) ){.   
86c0: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
86d0: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 65  = mask;.      }e
86e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  lse{.        db-
86f0: 3e 66 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  >flags &= ~mask;
8700: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 61 73  .        if( mas
8710: 6b 3d 3d 53 51 4c 49 54 45 5f 44 65 66 65 72 46  k==SQLITE_DeferF
8720: 4b 73 20 29 20 64 62 2d 3e 6e 44 65 66 65 72 72  Ks ) db->nDeferr
8730: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
8740: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
8750: 20 4d 61 6e 79 20 6f 66 20 74 68 65 20 66 6c 61   Many of the fla
8760: 67 2d 70 72 61 67 6d 61 73 20 6d 6f 64 69 66 79  g-pragmas modify
8770: 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
8780: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 0a  ted by the SQL .
8790: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
87a0: 72 20 28 65 67 2e 20 63 6f 75 6e 74 5f 63 68 61  r (eg. count_cha
87b0: 6e 67 65 73 29 2e 20 53 6f 20 61 64 64 20 61 6e  nges). So add an
87c0: 20 6f 70 63 6f 64 65 20 74 6f 20 65 78 70 69 72   opcode to expir
87d0: 65 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 63  e all.      ** c
87e0: 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73 74 61 74  ompiled SQL stat
87f0: 65 6d 65 6e 74 73 20 61 66 74 65 72 20 6d 6f 64  ements after mod
8800: 69 66 79 69 6e 67 20 61 20 70 72 61 67 6d 61 20  ifying a pragma 
8810: 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  value..      */.
8820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8830: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78  eAddOp0(v, OP_Ex
8840: 70 69 72 65 29 3b 0a 20 20 20 20 20 20 73 65 74  pire);.      set
8850: 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 64 62  AllPagerFlags(db
8860: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
8870: 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ak;.  }.#endif /
8880: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  * SQLITE_OMIT_FL
8890: 41 47 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23  AG_PRAGMAS */..#
88a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
88b0: 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d 41  IT_SCHEMA_PRAGMA
88c0: 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  S.  /*.  **   PR
88d0: 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28  AGMA table_info(
88e0: 3c 74 61 62 6c 65 3e 29 0a 20 20 2a 2a 0a 20 20  <table>).  **.  
88f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6e 67  ** Return a sing
8900: 6c 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20  le row for each 
8910: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6e 61  column of the na
8920: 6d 65 64 20 74 61 62 6c 65 2e 20 54 68 65 20 63  med table. The c
8930: 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74  olumns of.  ** t
8940: 68 65 20 72 65 74 75 72 6e 65 64 20 64 61 74 61  he returned data
8950: 20 73 65 74 20 61 72 65 3a 0a 20 20 2a 2a 0a 20   set are:.  **. 
8960: 20 2a 2a 20 63 69 64 3a 20 20 20 20 20 20 20 20   ** cid:        
8970: 43 6f 6c 75 6d 6e 20 69 64 20 28 6e 75 6d 62 65  Column id (numbe
8980: 72 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  red from left to
8990: 20 72 69 67 68 74 2c 20 73 74 61 72 74 69 6e 67   right, starting
89a0: 20 61 74 20 30 29 0a 20 20 2a 2a 20 6e 61 6d 65   at 0).  ** name
89b0: 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e  :       Column n
89c0: 61 6d 65 0a 20 20 2a 2a 20 74 79 70 65 3a 20 20  ame.  ** type:  
89d0: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 64 65 63 6c       Column decl
89e0: 61 72 61 74 69 6f 6e 20 74 79 70 65 2e 0a 20 20  aration type..  
89f0: 2a 2a 20 6e 6f 74 6e 75 6c 6c 3a 20 20 20 20 54  ** notnull:    T
8a00: 72 75 65 20 69 66 20 27 4e 4f 54 20 4e 55 4c 4c  rue if 'NOT NULL
8a10: 27 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6c  ' is part of col
8a20: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
8a30: 20 20 2a 2a 20 64 66 6c 74 5f 76 61 6c 75 65 3a    ** dflt_value:
8a40: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
8a50: 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ue for the colum
8a60: 6e 2c 20 69 66 20 61 6e 79 2e 0a 20 20 2a 2a 20  n, if any..  ** 
8a70: 70 6b 3a 20 20 20 20 20 20 20 20 20 4e 6f 6e 2d  pk:         Non-
8a80: 7a 65 72 6f 20 66 6f 72 20 50 4b 20 66 69 65 6c  zero for PK fiel
8a90: 64 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ds..  */.  case 
8aa0: 50 72 61 67 54 79 70 5f 54 41 42 4c 45 5f 49 4e  PragTyp_TABLE_IN
8ab0: 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29  FO: if( zRight )
8ac0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
8ad0: 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  b;.    pTab = sq
8ae0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
8af0: 28 70 50 61 72 73 65 2c 20 4c 4f 43 41 54 45 5f  (pParse, LOCATE_
8b00: 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c 20 7a  NOERR, zRight, z
8b10: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Db);.    if( pTa
8b20: 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  b ){.      int i
8b30: 54 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53  TabDb = sqlite3S
8b40: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
8b50: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
8b60: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b  .      int i, k;
8b70: 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64 64  .      int nHidd
8b80: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43 6f  en = 0;.      Co
8b90: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  lumn *pCol;.    
8ba0: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
8bb0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
8bc0: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
8bd0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
8be0: 3d 20 37 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 7;.      sqlit
8bf0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
8c00: 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61 62 44  ma(pParse, iTabD
8c10: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
8c20: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
8c30: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
8c40: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
8c50: 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  , pCol=pTab->aCo
8c60: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
8c70: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
8c80: 20 20 20 20 20 20 20 69 6e 74 20 69 73 48 69 64         int isHid
8c90: 64 65 6e 20 3d 20 49 73 48 69 64 64 65 6e 43 6f  den = IsHiddenCo
8ca0: 6c 75 6d 6e 28 70 43 6f 6c 29 3b 0a 20 20 20 20  lumn(pCol);.    
8cb0: 20 20 20 20 69 66 28 20 69 73 48 69 64 64 65 6e      if( isHidden
8cc0: 20 26 26 20 70 50 72 61 67 6d 61 2d 3e 69 41 72   && pPragma->iAr
8cd0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
8ce0: 20 20 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20    nHidden++;.   
8cf0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8d00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8d10: 20 20 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f     if( (pCol->co
8d20: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
8d30: 5f 50 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a  _PRIMKEY)==0 ){.
8d40: 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b            k = 0;
8d50: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
8d60: 66 28 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20  f( pPk==0 ){.   
8d70: 20 20 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20         k = 1;.  
8d80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8d90: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20         for(k=1; 
8da0: 6b 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26  k<=pTab->nCol &&
8db0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b   pPk->aiColumn[k
8dc0: 2d 31 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20  -1]!=i; k++){}. 
8dd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8de0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70   assert( pCol->p
8df0: 44 66 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d  Dflt==0 || pCol-
8e00: 3e 70 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  >pDflt->op==TK_S
8e10: 50 41 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  PAN );.        s
8e20: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
8e30: 6f 61 64 28 76 2c 20 31 2c 20 70 50 72 61 67 6d  oad(v, 1, pPragm
8e40: 61 2d 3e 69 41 72 67 20 3f 20 22 69 73 73 69 73  a->iArg ? "issis
8e50: 69 69 22 20 3a 20 22 69 73 73 69 73 69 22 2c 0a  ii" : "issisi",.
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
8e70: 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20 20 20  -nHidden,.      
8e80: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a           pCol->z
8e90: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
8ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75       sqlite3Colu
8eb0: 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c  mnType(pCol,""),
8ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ed0: 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20  pCol->notNull ? 
8ee0: 31 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  1 : 0,.         
8ef0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c        pCol->pDfl
8f00: 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d  t ? pCol->pDflt-
8f10: 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c 0a 20  >u.zToken : 0,. 
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 2c                k,
8f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8f40: 69 73 48 69 64 64 65 6e 29 3b 0a 20 20 20 20 20  isHidden);.     
8f50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
8f60: 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66 20 53 51  reak;..#ifdef SQ
8f70: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 63 61 73  LITE_DEBUG.  cas
8f80: 65 20 50 72 61 67 54 79 70 5f 53 54 41 54 53 3a  e PragTyp_STATS:
8f90: 20 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49   {.    Index *pI
8fa0: 64 78 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d  dx;.    HashElem
8fb0: 20 2a 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   *i;.    pParse-
8fc0: 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20 73  >nMem = 5;.    s
8fd0: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
8fe0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
8ff0: 44 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73  Db);.    for(i=s
9000: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9010: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
9020: 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  lHash); i; i=sql
9030: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
9040: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
9050: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
9060: 61 74 61 28 69 29 3b 0a 20 20 20 20 20 20 73 71  ata(i);.      sq
9070: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9080: 61 64 28 76 2c 20 31 2c 20 22 73 73 69 69 69 22  ad(v, 1, "ssiii"
9090: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
90a0: 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
90b0: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
90c0: 20 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f     pTab->szTabRo
90d0: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
90e0: 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 2c 0a  ab->nRowLogEst,.
90f0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
9100: 3e 74 61 62 46 6c 61 67 73 29 3b 0a 20 20 20 20  >tabFlags);.    
9110: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
9120: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
9130: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
9140: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9150: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9160: 2c 20 32 2c 20 22 73 69 69 69 58 22 2c 0a 20 20  , 2, "siiiX",.  
9170: 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 7a           pIdx->z
9180: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
9190: 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 2c   pIdx->szIdxRow,
91a0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78  .           pIdx
91b0: 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
91c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64  ,.           pId
91d0: 78 2d 3e 68 61 73 53 74 61 74 31 29 3b 0a 20 20  x->hasStat1);.  
91e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
91f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
9200: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 35 29 3b 0a  sultRow, 1, 5);.
9210: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9220: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
9230: 66 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  f..  case PragTy
9240: 70 5f 49 4e 44 45 58 5f 49 4e 46 4f 3a 20 69 66  p_INDEX_INFO: if
9250: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
9260: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
9270: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
9280: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
9290: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 52  FindIndex(db, zR
92a0: 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ight, zDb);.    
92b0: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
92c0: 20 20 69 6e 74 20 69 49 64 78 44 62 20 3d 20 73    int iIdxDb = s
92d0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
92e0: 64 65 78 28 64 62 2c 20 70 49 64 78 2d 3e 70 53  dex(db, pIdx->pS
92f0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 69 6e  chema);.      in
9300: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d  t i;.      int m
9310: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  x;.      if( pPr
9320: 61 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20  agma->iArg ){.  
9330: 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
9340: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77  index_xinfo (new
9350: 65 72 20 76 65 72 73 69 6f 6e 20 77 69 74 68 20  er version with 
9360: 6d 6f 72 65 20 72 6f 77 73 20 61 6e 64 20 63 6f  more rows and co
9370: 6c 75 6d 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20  lumns) */.      
9380: 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f    mx = pIdx->nCo
9390: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 50  lumn;.        pP
93a0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a  arse->nMem = 6;.
93b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
93c0: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69       /* PRAGMA i
93d0: 6e 64 65 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63  ndex_info (legac
93e0: 79 20 76 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20  y version) */.  
93f0: 20 20 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d        mx = pIdx-
9400: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
9410: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
9420: 20 33 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   3;.      }.    
9430: 20 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70    pTab = pIdx->p
9440: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c  Table;.      sql
9450: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
9460: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 49 64  hema(pParse, iId
9470: 78 44 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65  xDb);.      asse
9480: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  rt( pParse->nMem
9490: 3c 3d 70 50 72 61 67 6d 61 2d 3e 6e 50 72 61 67  <=pPragma->nPrag
94a0: 43 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 66  CName );.      f
94b0: 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 3b 20 69 2b  or(i=0; i<mx; i+
94c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20  +){.        i16 
94d0: 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43  cnum = pIdx->aiC
94e0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
94f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9500: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 69  tiLoad(v, 1, "ii
9510: 73 58 22 2c 20 69 2c 20 63 6e 75 6d 2c 0a 20 20  sX", i, cnum,.  
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 20 20 20 20 20 20 20 20 20 63 6e 75 6d 3c             cnum<
9540: 30 20 3f 20 30 20 3a 20 70 54 61 62 2d 3e 61 43  0 ? 0 : pTab->aC
9550: 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 29 3b  ol[cnum].zName);
9560: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
9570: 61 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20  agma->iArg ){.  
9580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9590: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
95a0: 34 2c 20 22 69 73 69 58 22 2c 0a 20 20 20 20 20  4, "isiX",.     
95b0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 6f         pIdx->aSo
95c0: 72 74 4f 72 64 65 72 5b 69 5d 2c 0a 20 20 20 20  rtOrder[i],.    
95d0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
95e0: 43 6f 6c 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20  Coll[i],.       
95f0: 20 20 20 20 20 69 3c 70 49 64 78 2d 3e 6e 4b 65       i<pIdx->nKe
9600: 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  yCol);.        }
9610: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9620: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9630: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 70  _ResultRow, 1, p
9640: 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
9650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9660: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65    break;..  case
9670: 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f 4c   PragTyp_INDEX_L
9680: 49 53 54 3a 20 69 66 28 20 7a 52 69 67 68 74 20  IST: if( zRight 
9690: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
96a0: 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  dx;.    Table *p
96b0: 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  Tab;.    int i;.
96c0: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
96d0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
96e0: 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20  zRight, zDb);.  
96f0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
9700: 20 20 20 20 69 6e 74 20 69 54 61 62 44 62 20 3d      int iTabDb =
9710: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
9720: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
9730: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
9740: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35  pParse->nMem = 5
9750: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
9760: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
9770: 70 50 61 72 73 65 2c 20 69 54 61 62 44 62 29 3b  pParse, iTabDb);
9780: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
9790: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 69 3d  pTab->pIndex, i=
97a0: 30 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  0; pIdx; pIdx=pI
97b0: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
97c0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
97d0: 68 61 72 20 2a 61 7a 4f 72 69 67 69 6e 5b 5d 20  har *azOrigin[] 
97e0: 3d 20 7b 20 22 63 22 2c 20 22 75 22 2c 20 22 70  = { "c", "u", "p
97f0: 6b 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 73 71  k" };.        sq
9800: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9810: 61 64 28 76 2c 20 31 2c 20 22 69 73 69 73 69 22  ad(v, 1, "isisi"
9820: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 69 2c 0a  ,.           i,.
9830: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
9840: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
9850: 20 20 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78     IsUniqueIndex
9860: 28 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20  (pIdx),.        
9870: 20 20 20 61 7a 4f 72 69 67 69 6e 5b 70 49 64 78     azOrigin[pIdx
9880: 2d 3e 69 64 78 54 79 70 65 5d 2c 0a 20 20 20 20  ->idxType],.    
9890: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 70 50 61         pIdx->pPa
98a0: 72 74 49 64 78 57 68 65 72 65 21 3d 30 29 3b 0a  rtIdxWhere!=0);.
98b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
98c0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61  }.  break;..  ca
98d0: 73 65 20 50 72 61 67 54 79 70 5f 44 41 54 41 42  se PragTyp_DATAB
98e0: 41 53 45 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20  ASE_LIST: {.    
98f0: 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72 73  int i;.    pPars
9900: 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20  e->nMem = 3;.   
9910: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
9920: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
9930: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
9940: 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  pBt==0 ) continu
9950: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
9960: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53   db->aDb[i].zDbS
9970: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20  Name!=0 );.     
9980: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
9990: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 73  iLoad(v, 1, "iss
99a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 69 2c 0a 20  ",.         i,. 
99b0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
99c0: 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 0a 20 20 20  i].zDbSName,.   
99d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
99e0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
99f0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a  ->aDb[i].pBt));.
9a00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9a10: 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  k;..  case PragT
9a20: 79 70 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4c 49 53  yp_COLLATION_LIS
9a30: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  T: {.    int i =
9a40: 20 30 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d   0;.    HashElem
9a50: 20 2a 70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   *p;.    pParse-
9a60: 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66  >nMem = 2;.    f
9a70: 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46  or(p=sqliteHashF
9a80: 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  irst(&db->aCollS
9a90: 65 71 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  eq); p; p=sqlite
9aa0: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
9ab0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9ac0: 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29  ll = (CollSeq *)
9ad0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
9ae0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9af0: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9b00: 20 31 2c 20 22 69 73 22 2c 20 69 2b 2b 2c 20 70   1, "is", i++, p
9b10: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
9b20: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9b30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9b40: 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52  INTROSPECTION_PR
9b50: 41 47 4d 41 53 0a 20 20 63 61 73 65 20 50 72 61  AGMAS.  case Pra
9b60: 67 54 79 70 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49  gTyp_FUNCTION_LI
9b70: 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ST: {.    int i;
9b80: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a  .    HashElem *j
9b90: 3b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  ;.    FuncDef *p
9ba0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
9bb0: 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28  em = 2;.    for(
9bc0: 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 46 55  i=0; i<SQLITE_FU
9bd0: 4e 43 5f 48 41 53 48 5f 53 5a 3b 20 69 2b 2b 29  NC_HASH_SZ; i++)
9be0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71  {.      for(p=sq
9bf0: 6c 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63  lite3BuiltinFunc
9c00: 74 69 6f 6e 73 2e 61 5b 69 5d 3b 20 70 3b 20 70  tions.a[i]; p; p
9c10: 3d 70 2d 3e 75 2e 70 48 61 73 68 20 29 7b 0a 20  =p->u.pHash ){. 
9c20: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 75         if( p->fu
9c30: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
9c40: 5f 46 55 4e 43 5f 49 4e 54 45 52 4e 41 4c 20 29  _FUNC_INTERNAL )
9c50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9c60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9c70: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
9c80: 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 31 29  i", p->zName, 1)
9c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9ca0: 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65      for(j=sqlite
9cb0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9cc0: 46 75 6e 63 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69  Func); j; j=sqli
9cd0: 74 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a  teHashNext(j)){.
9ce0: 20 20 20 20 20 20 70 20 3d 20 28 46 75 6e 63 44        p = (FuncD
9cf0: 65 66 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  ef*)sqliteHashDa
9d00: 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ta(j);.      sql
9d10: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9d20: 64 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d  d(v, 1, "si", p-
9d30: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
9d40: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
9d50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9d60: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
9d70: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9d80: 4d 4f 44 55 4c 45 5f 4c 49 53 54 3a 20 7b 0a 20  MODULE_LIST: {. 
9d90: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a     HashElem *j;.
9da0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
9db0: 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 1;.    for(j=
9dc0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
9dd0: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 6a  &db->aModule); j
9de0: 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; j=sqliteHashNe
9df0: 78 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 4d 6f  xt(j)){.      Mo
9e00: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
9e10: 64 75 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  dule*)sqliteHash
9e20: 44 61 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 73  Data(j);.      s
9e30: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
9e40: 6f 61 64 28 76 2c 20 31 2c 20 22 73 22 2c 20 70  oad(v, 1, "s", p
9e50: 4d 6f 64 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Mod->zName);.   
9e60: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9e70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9e80: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
9e90: 4c 45 20 2a 2f 0a 0a 20 20 63 61 73 65 20 50 72  LE */..  case Pr
9ea0: 61 67 54 79 70 5f 50 52 41 47 4d 41 5f 4c 49 53  agTyp_PRAGMA_LIS
9eb0: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  T: {.    int i;.
9ec0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
9ed0: 72 72 61 79 53 69 7a 65 28 61 50 72 61 67 6d 61  rraySize(aPragma
9ee0: 4e 61 6d 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Name); i++){.   
9ef0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9f00: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
9f10: 22 2c 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 69  ", aPragmaName[i
9f20: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
9f30: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
9f40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e  dif /* SQLITE_IN
9f50: 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41 47  TROSPECTION_PRAG
9f60: 4d 41 53 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  MAS */..#endif /
9f70: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  * SQLITE_OMIT_SC
9f80: 48 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  HEMA_PRAGMAS */.
9f90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9fa0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
9fb0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9fc0: 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49 53 54  FOREIGN_KEY_LIST
9fd0: 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a  : if( zRight ){.
9fe0: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20      FKey *pFK;. 
9ff0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
a000: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
a010: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
a020: 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20  zRight, zDb);.  
a030: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
a040: 20 20 20 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e      pFK = pTab->
a050: 70 46 4b 65 79 3b 0a 20 20 20 20 20 20 69 66 28  pFKey;.      if(
a060: 20 70 46 4b 20 29 7b 0a 20 20 20 20 20 20 20 20   pFK ){.        
a070: 69 6e 74 20 69 54 61 62 44 62 20 3d 20 73 71 6c  int iTabDb = sql
a080: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
a090: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
a0a0: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  ema);.        in
a0b0: 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  t i = 0; .      
a0c0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
a0d0: 20 38 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   8;.        sqli
a0e0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
a0f0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61 62  ema(pParse, iTab
a100: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  Db);.        whi
a110: 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20 20 20 20  le(pFK){.       
a120: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
a130: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
a140: 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  FK->nCol; j++){.
a150: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a160: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
a170: 28 76 2c 20 31 2c 20 22 69 69 73 73 73 73 73 73  (v, 1, "iissssss
a180: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
a190: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 0a 20              j,. 
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20    pFK->zTo,.    
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
a1e0: 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61  Tab->aCol[pFK->a
a1f0: 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e  Col[j].iFrom].zN
a200: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
a210: 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 61 43 6f          pFK->aCo
a220: 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20  l[j].zCol,.     
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
a240: 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41  tionName(pFK->aA
a250: 63 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f  ction[1]),  /* O
a260: 4e 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20 20  N UPDATE */.    
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
a280: 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61  ctionName(pFK->a
a290: 41 63 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20  Action[0]),  /* 
a2a0: 4f 4e 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20  ON DELETE */.   
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 22 4e 4f 4e 45 22 29 3b 0a 20 20 20 20 20 20 20  "NONE");.       
a2d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2b     }.          +
a2e0: 2b 69 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46  +i;.          pF
a2f0: 4b 20 3d 20 70 46 4b 2d 3e 70 4e 65 78 74 46 72  K = pFK->pNextFr
a300: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  om;.        }.  
a310: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a320: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
a330: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
a340: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
a350: 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  KEY) */..#ifndef
a360: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
a370: 45 49 47 4e 5f 4b 45 59 0a 23 69 66 6e 64 65 66  EIGN_KEY.#ifndef
a380: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
a390: 47 47 45 52 0a 20 20 63 61 73 65 20 50 72 61 67  GGER.  case Prag
a3a0: 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f  Typ_FOREIGN_KEY_
a3b0: 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20 46 4b 65  CHECK: {.    FKe
a3c0: 79 20 2a 70 46 4b 3b 20 20 20 20 20 20 20 20 20  y *pFK;         
a3d0: 20 20 20 20 2f 2a 20 41 20 66 6f 72 65 69 67 6e      /* A foreign
a3e0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
a3f0: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
a400: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab;           /*
a410: 20 43 68 69 6c 64 20 74 61 62 6c 65 20 63 6f 6e   Child table con
a420: 74 61 69 6e 20 22 52 45 46 45 52 45 4e 43 45 53  tain "REFERENCES
a430: 22 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 20  " keyword */.   
a440: 20 54 61 62 6c 65 20 2a 70 50 61 72 65 6e 74 3b   Table *pParent;
a450: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e          /* Paren
a460: 74 20 74 61 62 6c 65 20 74 68 61 74 20 63 68 69  t table that chi
a470: 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a  ld points to */.
a480: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
a490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a4a0: 64 65 78 20 69 6e 20 74 68 65 20 70 61 72 65 6e  dex in the paren
a4b0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  t table */.    i
a4c0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
a4d0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a4e0: 75 6e 74 65 72 3a 20 20 46 6f 72 65 69 67 6e 20  unter:  Foreign 
a4f0: 6b 65 79 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  key number for p
a500: 54 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  Tab */.    int j
a510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a520: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a530: 72 3a 20 20 46 69 65 6c 64 20 6f 66 20 74 68 65  r:  Field of the
a540: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 2a 2f 0a   foreign key */.
a550: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b      HashElem *k;
a560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a570: 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 4e 65 78  op counter:  Nex
a580: 74 20 74 61 62 6c 65 20 69 6e 20 73 63 68 65 6d  t table in schem
a590: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 78 3b 20  a */.    int x; 
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 2f 2a 20 72 65 73 75 6c 74 20 76 61 72 69 61 62  /* result variab
a5c0: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  le */.    int re
a5d0: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
a5e0: 20 2f 2a 20 33 20 72 65 67 69 73 74 65 72 73 20   /* 3 registers 
a5f0: 74 6f 20 68 6f 6c 64 20 61 20 72 65 73 75 6c 74  to hold a result
a600: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
a610: 72 65 67 4b 65 79 3b 20 20 20 20 20 20 20 20 20  regKey;         
a620: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
a630: 6f 20 68 6f 6c 64 20 6b 65 79 20 66 6f 72 20 63  o hold key for c
a640: 68 65 63 6b 69 6e 67 20 74 68 65 20 46 4b 20 2a  hecking the FK *
a650: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
a660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a670: 52 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  Registers to hol
a680: 64 20 61 20 72 6f 77 20 66 72 6f 6d 20 70 54 61  d a row from pTa
a690: 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  b */.    int add
a6a0: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
a6b0: 2f 2a 20 54 6f 70 20 6f 66 20 61 20 6c 6f 6f 70  /* Top of a loop
a6c0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 65 69 67   checking foreig
a6d0: 6e 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20 69 6e  n keys */.    in
a6e0: 74 20 61 64 64 72 4f 6b 3b 20 20 20 20 20 20 20  t addrOk;       
a6f0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
a700: 65 20 69 66 20 74 68 65 20 6b 65 79 20 69 73 20  e if the key is 
a710: 4f 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61  OK */.    int *a
a720: 69 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  iCols;          
a730: 20 2f 2a 20 63 68 69 6c 64 20 74 6f 20 70 61 72   /* child to par
a740: 65 6e 74 20 63 6f 6c 75 6d 6e 20 6d 61 70 70 69  ent column mappi
a750: 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52 65  ng */..    regRe
a760: 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
a770: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
a780: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20  e->nMem += 4;.  
a790: 20 20 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50 61    regKey = ++pPa
a7a0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
a7b0: 65 67 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  egRow = ++pParse
a7c0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 6b 20 3d 20  ->nMem;.    k = 
a7d0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
a7e0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
a7f0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
a800: 0a 20 20 20 20 77 68 69 6c 65 28 20 6b 20 29 7b  .    while( k ){
a810: 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 44  .      int iTabD
a820: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  b;.      if( zRi
a830: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ght ){.        p
a840: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
a850: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
a860: 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29   0, zRight, zDb)
a870: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b  ;.        k = 0;
a880: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a890: 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
a8a0: 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
a8b0: 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 20 20  ata(k);.        
a8c0: 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65  k = sqliteHashNe
a8d0: 78 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xt(k);.      }. 
a8e0: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
a8f0: 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79 3d   || pTab->pFKey=
a900: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
a910: 20 20 20 20 20 69 54 61 62 44 62 20 3d 20 73 71       iTabDb = sq
a920: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
a930: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
a940: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
a950: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
a960: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61  hema(pParse, iTa
a970: 62 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bDb);.      sqli
a980: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
a990: 72 73 65 2c 20 69 54 61 62 44 62 2c 20 70 54 61  rse, iTabDb, pTa
a9a0: 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
a9b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
a9c0: 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 72  if( pTab->nCol+r
a9d0: 65 67 52 6f 77 3e 70 50 61 72 73 65 2d 3e 6e 4d  egRow>pParse->nM
a9e0: 65 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em ) pParse->nMe
a9f0: 6d 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b  m = pTab->nCol +
aa00: 20 72 65 67 52 6f 77 3b 0a 20 20 20 20 20 20 73   regRow;.      s
aa10: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
aa20: 70 50 61 72 73 65 2c 20 30 2c 20 69 54 61 62 44  pParse, 0, iTabD
aa30: 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
aa40: 52 65 61 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  Read);.      sql
aa50: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
aa60: 6e 67 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2c  ng(v, regResult,
aa70: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
aa80: 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46       for(i=1, pF
aa90: 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70  K=pTab->pFKey; p
aaa0: 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b  FK; i++, pFK=pFK
aab0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
aac0: 20 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20        pParent = 
aad0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
aae0: 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a  (db, pFK->zTo, z
aaf0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Db);.        if(
ab00: 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 63 6f   pParent==0 ) co
ab10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
ab20: 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  pIdx = 0;.      
ab30: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
ab40: 63 6b 28 70 50 61 72 73 65 2c 20 69 54 61 62 44  ck(pParse, iTabD
ab50: 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e 75 6d  b, pParent->tnum
ab60: 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e 7a 4e  , 0, pParent->zN
ab70: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 78 20  ame);.        x 
ab80: 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74  = sqlite3FkLocat
ab90: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
aba0: 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49  Parent, pFK, &pI
abb0: 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  dx, 0);.        
abc0: 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20  if( x==0 ){.    
abd0: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d        if( pIdx==
abe0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
abf0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
ac00: 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 54 61  e(pParse, i, iTa
ac10: 62 44 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50  bDb, pParent, OP
ac20: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
ac30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ac40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ac50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
ac60: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20 70 49  _OpenRead, i, pI
ac70: 64 78 2d 3e 74 6e 75 6d 2c 20 69 54 61 62 44 62  dx->tnum, iTabDb
ac80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
ac90: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
aca0: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
acb0: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
acc0: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
acd0: 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30  .          k = 0
ace0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
acf0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
ad00: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
ad10: 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  t( pParse->nErr>
ad20: 30 20 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b 0a 20  0 || pFK==0 );. 
ad30: 20 20 20 20 20 69 66 28 20 70 46 4b 20 29 20 62       if( pFK ) b
ad40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
ad50: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3c 69 20 29  pParse->nTab<i )
ad60: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
ad70: 69 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  i;.      addrTop
ad80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ad90: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
ada0: 64 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  d, 0); VdbeCover
adb0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  age(v);.      fo
adc0: 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d  r(i=1, pFK=pTab-
add0: 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b  >pFKey; pFK; i++
ade0: 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74  , pFK=pFK->pNext
adf0: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70  From){.        p
ae00: 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  Parent = sqlite3
ae10: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46  FindTable(db, pF
ae20: 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20  K->zTo, zDb);.  
ae30: 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a        pIdx = 0;.
ae40: 20 20 20 20 20 20 20 20 61 69 43 6f 6c 73 20 3d          aiCols =
ae50: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
ae60: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20  pParent ){.     
ae70: 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
ae80: 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50  FkLocateIndex(pP
ae90: 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  arse, pParent, p
aea0: 46 4b 2c 20 26 70 49 64 78 2c 20 26 61 69 43 6f  FK, &pIdx, &aiCo
aeb0: 6c 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ls);.          a
aec0: 73 73 65 72 74 28 20 78 3d 3d 30 20 29 3b 0a 20  ssert( x==0 );. 
aed0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
aee0: 20 61 64 64 72 4f 6b 20 3d 20 73 71 6c 69 74 65   addrOk = sqlite
aef0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
af00: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 20  Parse);..       
af10: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
af20: 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 63 68  e to read the ch
af30: 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 73 20 69  ild key values i
af40: 6e 74 6f 20 72 65 67 69 73 74 65 72 73 0a 20 20  nto registers.  
af50: 20 20 20 20 20 20 2a 2a 20 72 65 67 52 6f 77 2e        ** regRow.
af60: 2e 72 65 67 52 6f 77 2b 6e 2e 20 49 66 20 61 6e  .regRow+n. If an
af70: 79 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b  y of the child k
af80: 65 79 20 76 61 6c 75 65 73 20 61 72 65 20 4e 55  ey values are NU
af90: 4c 4c 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20  LL, this .      
afa0: 20 20 2a 2a 20 72 6f 77 20 63 61 6e 6e 6f 74 20    ** row cannot 
afb0: 63 61 75 73 65 20 61 6e 20 46 4b 20 76 69 6f 6c  cause an FK viol
afc0: 61 74 69 6f 6e 2e 20 4a 75 6d 70 20 64 69 72 65  ation. Jump dire
afd0: 63 74 6c 79 20 74 6f 20 61 64 64 72 4f 6b 20 69  ctly to addrOk i
afe0: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  n .        ** th
aff0: 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  is case. */.    
b000: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
b010: 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  FK->nCol; j++){.
b020: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
b030: 6f 6c 20 3d 20 61 69 43 6f 6c 73 20 3f 20 61 69  ol = aiCols ? ai
b040: 43 6f 6c 73 5b 6a 5d 20 3a 20 70 46 4b 2d 3e 61  Cols[j] : pFK->a
b050: 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 3b 0a 20 20  Col[j].iFrom;.  
b060: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b070: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
b080: 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
b090: 20 30 2c 20 69 43 6f 6c 2c 20 72 65 67 52 6f 77   0, iCol, regRow
b0a0: 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  +j);.          s
b0b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b0c0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
b0d0: 65 67 52 6f 77 2b 6a 2c 20 61 64 64 72 4f 6b 29  egRow+j, addrOk)
b0e0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b0f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
b100: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
b110: 65 20 63 6f 64 65 20 74 6f 20 71 75 65 72 79 20  e code to query 
b120: 74 68 65 20 70 61 72 65 6e 74 20 69 6e 64 65 78  the parent index
b130: 20 66 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20   for a matching 
b140: 70 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  parent.        *
b150: 2a 20 6b 65 79 2e 20 49 66 20 61 20 6d 61 74 63  * key. If a matc
b160: 68 20 69 73 20 66 6f 75 6e 64 2c 20 6a 75 6d 70  h is found, jump
b170: 20 74 6f 20 61 64 64 72 4f 6b 2e 20 2a 2f 0a 20   to addrOk. */. 
b180: 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20         if( pIdx 
b190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
b1a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
b1b0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b1c0: 20 72 65 67 52 6f 77 2c 20 70 46 4b 2d 3e 6e 43   regRow, pFK->nC
b1d0: 6f 6c 2c 20 72 65 67 4b 65 79 2c 0a 20 20 20 20  ol, regKey,.    
b1e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b1f0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
b200: 72 28 64 62 2c 70 49 64 78 29 2c 20 70 46 4b 2d  r(db,pIdx), pFK-
b210: 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  >nCol);.        
b220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b230: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
b240: 6e 64 2c 20 69 2c 20 61 64 64 72 4f 6b 2c 20 72  nd, i, addrOk, r
b250: 65 67 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  egKey, 0);.     
b260: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
b270: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  e(v);.        }e
b280: 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 20  lse if( pParent 
b290: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
b2a0: 20 6a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64   jmp = sqlite3Vd
b2b0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
b2c0: 2b 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +2;.          sq
b2d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b2e0: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
b2f0: 20 69 2c 20 6a 6d 70 2c 20 72 65 67 52 6f 77 29   i, jmp, regRow)
b300: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
b320: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
b330: 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20  addrOk);.       
b340: 20 20 20 61 73 73 65 72 74 28 20 70 46 4b 2d 3e     assert( pFK->
b350: 6e 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nCol==1 );.     
b360: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
b370: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b380: 6f 20 72 65 70 6f 72 74 20 61 6e 20 46 4b 20 76  o report an FK v
b390: 69 6f 6c 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  iolation to the 
b3a0: 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20  caller. */.     
b3b0: 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
b3c0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
b3d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b3e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
b3f0: 2c 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31  , 0, regResult+1
b400: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b410: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
b420: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b430: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
b440: 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20  Result+1);.     
b450: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
b460: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
b470: 64 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2b 32  d(v, regResult+2
b480: 2c 20 22 73 69 58 22 2c 20 70 46 4b 2d 3e 7a 54  , "siX", pFK->zT
b490: 6f 2c 20 69 2d 31 29 3b 0a 20 20 20 20 20 20 20  o, i-1);.       
b4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b4b0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
b4c0: 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 34  ow, regResult, 4
b4d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b4e0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
b4f0: 65 6c 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20  el(v, addrOk);. 
b500: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
b510: 46 72 65 65 28 64 62 2c 20 61 69 43 6f 6c 73 29  Free(db, aiCols)
b520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b530: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b540: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c  2(v, OP_Next, 0,
b550: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
b560: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b580: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
b590: 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  op);.    }.  }. 
b5a0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
b5b0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
b5c0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
b5d0: 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  */.#endif /* !de
b5e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b5f0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
b600: 2f 0a 0a 20 20 2f 2a 20 52 65 69 6e 73 74 61 6c  /..  /* Reinstal
b610: 6c 20 74 68 65 20 4c 49 4b 45 20 61 6e 64 20 47  l the LIKE and G
b620: 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  LOB functions.  
b630: 54 68 65 20 76 61 72 69 61 6e 74 20 6f 66 20 4c  The variant of L
b640: 49 4b 45 0a 20 20 2a 2a 20 75 73 65 64 20 77 69  IKE.  ** used wi
b650: 6c 6c 20 62 65 20 63 61 73 65 20 73 65 6e 73 69  ll be case sensi
b660: 74 69 76 65 20 6f 72 20 6e 6f 74 20 64 65 70 65  tive or not depe
b670: 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 52 48 53  nding on the RHS
b680: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
b690: 61 67 54 79 70 5f 43 41 53 45 5f 53 45 4e 53 49  agTyp_CASE_SENSI
b6a0: 54 49 56 45 5f 4c 49 4b 45 3a 20 7b 0a 20 20 20  TIVE_LIKE: {.   
b6b0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
b6c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69       sqlite3Regi
b6d0: 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  sterLikeFunction
b6e0: 73 28 64 62 2c 20 73 71 6c 69 74 65 33 47 65 74  s(db, sqlite3Get
b6f0: 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20  Boolean(zRight, 
b700: 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  0));.    }.  }. 
b710: 20 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64 65 66   break;..#ifndef
b720: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54   SQLITE_INTEGRIT
b730: 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41  Y_CHECK_ERROR_MA
b740: 58 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  X.# define SQLIT
b750: 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  E_INTEGRITY_CHEC
b760: 4b 5f 45 52 52 4f 52 5f 4d 41 58 20 31 30 30 0a  K_ERROR_MAX 100.
b770: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
b780: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
b790: 47 52 49 54 59 5f 43 48 45 43 4b 0a 20 20 2f 2a  GRITY_CHECK.  /*
b7a0: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
b7b0: 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 2a 2a 20  rity_check.  ** 
b7c0: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
b7d0: 69 74 79 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a  ity_check(N).  *
b7e0: 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75 69 63  *    PRAGMA quic
b7f0: 6b 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 20 20 20  k_check.  **    
b800: 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65  PRAGMA quick_che
b810: 63 6b 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ck(N).  **.  ** 
b820: 56 65 72 69 66 79 20 74 68 65 20 69 6e 74 65 67  Verify the integ
b830: 72 69 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  rity of the data
b840: 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  base..  **.  ** 
b850: 54 68 65 20 22 71 75 69 63 6b 5f 63 68 65 63 6b  The "quick_check
b860: 22 20 69 73 20 72 65 64 75 63 65 64 20 76 65 72  " is reduced ver
b870: 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 69 6e  sion of .  ** in
b880: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 64 65  tegrity_check de
b890: 73 69 67 6e 65 64 20 74 6f 20 64 65 74 65 63 74  signed to detect
b8a0: 20 6d 6f 73 74 20 64 61 74 61 62 61 73 65 20 63   most database c
b8b0: 6f 72 72 75 70 74 69 6f 6e 0a 20 20 2a 2a 20 77  orruption.  ** w
b8c0: 69 74 68 6f 75 74 20 74 68 65 20 6f 76 65 72 68  ithout the overh
b8d0: 65 61 64 20 6f 66 20 63 72 6f 73 73 2d 63 68 65  ead of cross-che
b8e0: 63 6b 69 6e 67 20 69 6e 64 65 78 65 73 2e 20 20  cking indexes.  
b8f0: 51 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20 2a 2a  Quick_check.  **
b900: 20 69 73 20 6c 69 6e 65 61 72 20 74 69 6d 65 20   is linear time 
b910: 77 68 65 72 65 61 73 65 20 69 6e 74 65 67 72 69  wherease integri
b920: 74 79 5f 63 68 65 63 6b 20 69 73 20 4f 28 4e 6c  ty_check is O(Nl
b930: 6f 67 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ogN)..  */.  cas
b940: 65 20 50 72 61 67 54 79 70 5f 49 4e 54 45 47 52  e PragTyp_INTEGR
b950: 49 54 59 5f 43 48 45 43 4b 3a 20 7b 0a 20 20 20  ITY_CHECK: {.   
b960: 20 69 6e 74 20 69 2c 20 6a 2c 20 61 64 64 72 2c   int i, j, addr,
b970: 20 6d 78 45 72 72 3b 0a 0a 20 20 20 20 69 6e 74   mxErr;..    int
b980: 20 69 73 51 75 69 63 6b 20 3d 20 28 73 71 6c 69   isQuick = (sqli
b990: 74 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74  te3Tolower(zLeft
b9a0: 5b 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a 20 20 20  [0])=='q');..   
b9b0: 20 2f 2a 20 49 66 20 74 68 65 20 50 52 41 47 4d   /* If the PRAGM
b9c0: 41 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 6f 66  A command was of
b9d0: 20 74 68 65 20 66 6f 72 6d 20 22 50 52 41 47 4d   the form "PRAGM
b9e0: 41 20 3c 64 62 3e 2e 69 6e 74 65 67 72 69 74 79  A <db>.integrity
b9f0: 5f 63 68 65 63 6b 22 2c 0a 20 20 20 20 2a 2a 20  _check",.    ** 
ba00: 74 68 65 6e 20 69 44 62 20 69 73 20 73 65 74 20  then iDb is set 
ba10: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
ba20: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 64 65  the database ide
ba30: 6e 74 69 66 69 65 64 20 62 79 20 3c 64 62 3e 2e  ntified by <db>.
ba40: 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
ba50: 63 61 73 65 2c 20 74 68 65 20 69 6e 74 65 67 72  case, the integr
ba60: 69 74 79 20 6f 66 20 64 61 74 61 62 61 73 65 20  ity of database 
ba70: 69 44 62 20 6f 6e 6c 79 20 69 73 20 76 65 72 69  iDb only is veri
ba80: 66 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74  fied by.    ** t
ba90: 68 65 20 56 44 42 45 20 63 72 65 61 74 65 64 20  he VDBE created 
baa0: 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20  below..    **.  
bab0: 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
bac0: 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 77  if the command w
bad0: 61 73 20 73 69 6d 70 6c 79 20 22 50 52 41 47 4d  as simply "PRAGM
bae0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
baf0: 6b 22 20 28 6f 72 0a 20 20 20 20 2a 2a 20 22 50  k" (or.    ** "P
bb00: 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63  RAGMA quick_chec
bb10: 6b 22 29 2c 20 74 68 65 6e 20 69 44 62 20 69 73  k"), then iDb is
bb20: 20 73 65 74 20 74 6f 20 30 2e 20 49 6e 20 74 68   set to 0. In th
bb30: 69 73 20 63 61 73 65 2c 20 73 65 74 20 69 44 62  is case, set iDb
bb40: 0a 20 20 20 20 2a 2a 20 74 6f 20 2d 31 20 68 65  .    ** to -1 he
bb50: 72 65 2c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  re, to indicate 
bb60: 74 68 61 74 20 74 68 65 20 56 44 42 45 20 73 68  that the VDBE sh
bb70: 6f 75 6c 64 20 76 65 72 69 66 79 20 74 68 65 20  ould verify the 
bb80: 69 6e 74 65 67 72 69 74 79 0a 20 20 20 20 2a 2a  integrity.    **
bb90: 20 6f 66 20 61 6c 6c 20 61 74 74 61 63 68 65 64   of all attached
bba0: 20 64 61 74 61 62 61 73 65 73 2e 20 20 2a 2f 0a   databases.  */.
bbb0: 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e      assert( iDb>
bbc0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
bbd0: 28 20 69 44 62 3d 3d 30 20 7c 7c 20 70 49 64 32  ( iDb==0 || pId2
bbe0: 2d 3e 7a 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ->z );.    if( p
bbf0: 49 64 32 2d 3e 7a 3d 3d 30 20 29 20 69 44 62 20  Id2->z==0 ) iDb 
bc00: 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  = -1;..    /* In
bc10: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 56 44 42  itialize the VDB
bc20: 45 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 20  E program */.   
bc30: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
bc40: 36 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  6;..    /* Set t
bc50: 68 65 20 6d 61 78 69 6d 75 6d 20 65 72 72 6f 72  he maximum error
bc60: 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 6d 78   count */.    mx
bc70: 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  Err = SQLITE_INT
bc80: 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52  EGRITY_CHECK_ERR
bc90: 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 69 66 28 20  OR_MAX;.    if( 
bca0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
bcb0: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
bcc0: 7a 52 69 67 68 74 2c 20 26 6d 78 45 72 72 29 3b  zRight, &mxErr);
bcd0: 0a 20 20 20 20 20 20 69 66 28 20 6d 78 45 72 72  .      if( mxErr
bce0: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  <=0 ){.        m
bcf0: 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e  xErr = SQLITE_IN
bd00: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52  TEGRITY_CHECK_ER
bd10: 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 20 20 7d  ROR_MAX;.      }
bd20: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
bd30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bd40: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 78 45 72  OP_Integer, mxEr
bd50: 72 2d 31 2c 20 31 29 3b 20 2f 2a 20 72 65 67 5b  r-1, 1); /* reg[
bd60: 31 5d 20 68 6f 6c 64 73 20 65 72 72 6f 72 73 20  1] holds errors 
bd70: 6c 65 66 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  left */..    /* 
bd80: 44 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20  Do an integrity 
bd90: 63 68 65 63 6b 20 6f 6e 20 65 61 63 68 20 64 61  check on each da
bda0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
bdb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
bdc0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
bdd0: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 78 3b 20     HashElem *x; 
bde0: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
bdf0: 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
be00: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  n the schema */.
be10: 20 20 20 20 20 20 48 61 73 68 20 2a 70 54 62 6c        Hash *pTbl
be20: 73 3b 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66  s;     /* Set of
be30: 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   all tables in t
be40: 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  he schema */.   
be50: 20 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20     int *aRoot;  
be60: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
be70: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
be80: 73 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20  s of all btrees 
be90: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  */.      int cnt
bea0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
beb0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
bec0: 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 20  n aRoot[] */.   
bed0: 20 20 20 69 6e 74 20 6d 78 49 64 78 20 3d 20 30     int mxIdx = 0
bee0: 3b 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e  ;   /* Maximum n
bef0: 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73  umber of indexes
bf00: 20 66 6f 72 20 61 6e 79 20 74 61 62 6c 65 20 2a   for any table *
bf10: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 4f 4d 49  /..      if( OMI
bf20: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 3d 3d 31  T_TEMPDB && i==1
bf30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
bf40: 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 26 26     if( iDb>=0 &&
bf50: 20 69 21 3d 69 44 62 20 29 20 63 6f 6e 74 69 6e   i!=iDb ) contin
bf60: 75 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ue;..      sqlit
bf70: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
bf80: 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 0a  ma(pParse, i);..
bf90: 20 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69        /* Do an i
bfa0: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f  ntegrity check o
bfb0: 66 20 74 68 65 20 42 2d 54 72 65 65 0a 20 20 20  f the B-Tree.   
bfc0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
bfd0: 65 67 69 6e 20 62 79 20 66 69 6e 64 69 6e 67 20  egin by finding 
bfe0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 73 20 6e  the root pages n
bff0: 75 6d 62 65 72 73 0a 20 20 20 20 20 20 2a 2a 20  umbers.      ** 
c000: 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 61  for all tables a
c010: 6e 64 20 69 6e 64 69 63 65 73 20 69 6e 20 74 68  nd indices in th
c020: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
c030: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
c040: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
c050: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 2c  MutexHeld(db, i,
c060: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 54 62   0) );.      pTb
c070: 6c 73 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  ls = &db->aDb[i]
c080: 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
c090: 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74  h;.      for(cnt
c0a0: 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68  =0, x=sqliteHash
c0b0: 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b  First(pTbls); x;
c0c0: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   x=sqliteHashNex
c0d0: 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(x)){.        T
c0e0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
c0f0: 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 20  iteHashData(x); 
c100: 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 61 62 6c   /* Current tabl
c110: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  e */.        Ind
c120: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c140: 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54  * An index on pT
c150: 61 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ab */.        in
c160: 74 20 6e 49 64 78 3b 20 20 20 20 20 20 20 20 20  t nIdx;         
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64  /* Number of ind
c190: 65 78 65 73 20 6f 6e 20 70 54 61 62 20 2a 2f 0a  exes on pTab */.
c1a0: 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52          if( HasR
c1b0: 6f 77 69 64 28 70 54 61 62 29 20 29 20 63 6e 74  owid(pTab) ) cnt
c1c0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ++;.        for(
c1d0: 6e 49 64 78 3d 30 2c 20 70 49 64 78 3d 70 54 61  nIdx=0, pIdx=pTa
c1e0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
c1f0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
c200: 74 2c 20 6e 49 64 78 2b 2b 29 7b 20 63 6e 74 2b  t, nIdx++){ cnt+
c210: 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  +; }.        if(
c220: 20 6e 49 64 78 3e 6d 78 49 64 78 20 29 20 6d 78   nIdx>mxIdx ) mx
c230: 49 64 78 20 3d 20 6e 49 64 78 3b 0a 20 20 20 20  Idx = nIdx;.    
c240: 20 20 7d 0a 20 20 20 20 20 20 61 52 6f 6f 74 20    }.      aRoot 
c250: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c260: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
c270: 66 28 69 6e 74 29 2a 28 63 6e 74 2b 31 29 29 3b  f(int)*(cnt+1));
c280: 0a 20 20 20 20 20 20 69 66 28 20 61 52 6f 6f 74  .      if( aRoot
c290: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
c2a0: 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 78 3d     for(cnt=0, x=
c2b0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
c2c0: 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c  pTbls); x; x=sql
c2d0: 69 74 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b  iteHashNext(x)){
c2e0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
c2f0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
c300: 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20  hData(x);.      
c310: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
c320: 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f         if( HasRo
c330: 77 69 64 28 70 54 61 62 29 20 29 20 61 52 6f 6f  wid(pTab) ) aRoo
c340: 74 5b 2b 2b 63 6e 74 5d 20 3d 20 70 54 61 62 2d  t[++cnt] = pTab-
c350: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 66  >tnum;.        f
c360: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
c370: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
c380: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
c390: 20 20 20 20 20 20 20 20 20 61 52 6f 6f 74 5b 2b           aRoot[+
c3a0: 2b 63 6e 74 5d 20 3d 20 70 49 64 78 2d 3e 74 6e  +cnt] = pIdx->tn
c3b0: 75 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  um;.        }.  
c3c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 52 6f 6f      }.      aRoo
c3d0: 74 5b 30 5d 20 3d 20 63 6e 74 3b 0a 0a 20 20 20  t[0] = cnt;..   
c3e0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
c3f0: 73 75 66 66 69 63 69 65 6e 74 20 6e 75 6d 62 65  sufficient numbe
c400: 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68  r of registers h
c410: 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
c420: 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 72  ed */.      pPar
c430: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 20  se->nMem = MAX( 
c440: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 38 2b  pParse->nMem, 8+
c450: 6d 78 49 64 78 20 29 3b 0a 20 20 20 20 20 20 73  mxIdx );.      s
c460: 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
c470: 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
c480: 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 74 68  ..      /* Do th
c490: 65 20 62 2d 74 72 65 65 20 69 6e 74 65 67 72 69  e b-tree integri
c4a0: 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20 20 20  ty checks */.   
c4b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c4c0: 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp4(v, OP_Integ
c4d0: 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74 2c 20  rityCk, 2, cnt, 
c4e0: 31 2c 20 28 63 68 61 72 2a 29 61 52 6f 6f 74 2c  1, (char*)aRoot,
c4f0: 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20  P4_INTARRAY);.  
c500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
c510: 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 69  hangeP5(v, (u8)i
c520: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
c530: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c540: 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
c550: 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
c560: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
c570: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
c580: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33  OP_String8, 0, 3
c590: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71  , 0,.         sq
c5a0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
c5b0: 20 22 2a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73   "*** in databas
c5c0: 65 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64 62 2d  e %s ***\n", db-
c5d0: 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
c5e0: 29 2c 0a 20 20 20 20 20 20 20 20 20 50 34 5f 44  ),.         P4_D
c5f0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73  YNAMIC);.      s
c600: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c610: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32  (v, OP_Concat, 2
c620: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 69  , 3, 3);.      i
c630: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73  ntegrityCheckRes
c640: 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20  ultRow(v);.     
c650: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c660: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a  Here(v, addr);..
c670: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
c680: 72 65 20 61 6c 6c 20 74 68 65 20 69 6e 64 69 63  re all the indic
c690: 65 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74  es are construct
c6a0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ed correctly..  
c6b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72      */.      for
c6c0: 28 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (x=sqliteHashFir
c6d0: 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d  st(pTbls); x; x=
c6e0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78  sqliteHashNext(x
c6f0: 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  )){.        Tabl
c700: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
c710: 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20  HashData(x);.   
c720: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
c730: 2c 20 2a 70 50 6b 3b 0a 20 20 20 20 20 20 20 20  , *pPk;.        
c740: 49 6e 64 65 78 20 2a 70 50 72 69 6f 72 20 3d 20  Index *pPrior = 
c750: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  0;.        int l
c760: 6f 6f 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20  oopTop;.        
c770: 69 6e 74 20 69 44 61 74 61 43 75 72 2c 20 69 49  int iDataCur, iI
c780: 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 69  dxCur;.        i
c790: 6e 74 20 72 31 20 3d 20 2d 31 3b 0a 0a 20 20 20  nt r1 = -1;..   
c7a0: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74       if( pTab->t
c7b0: 6e 75 6d 3c 31 20 29 20 63 6f 6e 74 69 6e 75 65  num<1 ) continue
c7c0: 3b 20 20 2f 2a 20 53 6b 69 70 20 56 49 45 57 73  ;  /* Skip VIEWs
c7d0: 20 6f 72 20 56 49 52 54 55 41 4c 20 54 41 42 4c   or VIRTUAL TABL
c7e0: 45 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50  Es */.        pP
c7f0: 6b 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61  k = HasRowid(pTa
c800: 62 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  b) ? 0 : sqlite3
c810: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
c820: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 73  pTab);.        s
c830: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41  qlite3OpenTableA
c840: 6e 64 49 6e 64 69 63 65 73 28 70 50 61 72 73 65  ndIndices(pParse
c850: 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
c860: 65 61 64 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ead, 0,.        
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
c890: 20 26 69 44 61 74 61 43 75 72 2c 20 26 69 49 64   &iDataCur, &iId
c8a0: 78 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 2f  xCur);.        /
c8b0: 2a 20 72 65 67 5b 37 5d 20 63 6f 75 6e 74 73 20  * reg[7] counts 
c8c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
c8d0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 74 61 62  tries in the tab
c8e0: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  le..        ** r
c8f0: 65 67 5b 38 2b 69 5d 20 63 6f 75 6e 74 73 20 74  eg[8+i] counts t
c900: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
c910: 72 69 65 73 20 69 6e 20 74 68 65 20 69 2d 74 68  ries in the i-th
c920: 20 69 6e 64 65 78 20 0a 20 20 20 20 20 20 20 20   index .        
c930: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
c940: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c950: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 37  OP_Integer, 0, 7
c960: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
c970: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
c980: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
c990: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
c9a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
c9b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c9c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
c9d0: 30 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65  0, 8+j); /* inde
c9e0: 78 20 65 6e 74 72 69 65 73 20 63 6f 75 6e 74 65  x entries counte
c9f0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  r */.        }. 
ca00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ca10: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a  Parse->nMem>=8+j
ca20: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
ca30: 72 74 28 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d  rt( sqlite3NoTem
ca40: 70 73 49 6e 52 61 6e 67 65 28 70 50 61 72 73 65  psInRange(pParse
ca50: 2c 31 2c 37 2b 6a 29 20 29 3b 0a 20 20 20 20 20  ,1,7+j) );.     
ca60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ca70: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
ca80: 64 2c 20 69 44 61 74 61 43 75 72 2c 20 30 29 3b  d, iDataCur, 0);
ca90: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
caa0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6f 70 54 6f  ;.        loopTo
cab0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
cac0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
cad0: 6d 6d 2c 20 37 2c 20 31 29 3b 0a 20 20 20 20 20  mm, 7, 1);.     
cae0: 20 20 20 69 66 28 20 21 69 73 51 75 69 63 6b 20     if( !isQuick 
caf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
cb00: 53 61 6e 69 74 79 20 63 68 65 63 6b 20 6f 6e 20  Sanity check on 
cb10: 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 64 65  record header de
cb20: 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  coding */.      
cb30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cb40: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
cb50: 6d 6e 2c 20 69 44 61 74 61 43 75 72 2c 20 70 54  mn, iDataCur, pT
cb60: 61 62 2d 3e 6e 43 6f 6c 2d 31 2c 20 33 29 3b 0a  ab->nCol-1, 3);.
cb70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cb80: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
cb90: 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
cba0: 47 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  G);.        }.  
cbb0: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
cbc0: 74 68 61 74 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c  that all NOT NUL
cbd0: 4c 20 63 6f 6c 75 6d 6e 73 20 72 65 61 6c 6c 79  L columns really
cbe0: 20 61 72 65 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f   are NOT NULL */
cbf0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
cc00: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
cc10: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
cc20: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
cc30: 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 3b 0a        int jmp2;.
cc40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
cc50: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63  =pTab->iPKey ) c
cc60: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
cc70: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f     if( pTab->aCo
cc80: 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  l[j].notNull==0 
cc90: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
cca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ccb0: 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
ccc0: 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69  Table(v, pTab, i
ccd0: 44 61 74 61 43 75 72 2c 20 6a 2c 20 33 29 3b 0a  DataCur, j, 3);.
cce0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ccf0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
cd00: 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
cd10: 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d  G);.          jm
cd20: 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
cd30: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp1(v, OP_Not
cd40: 4e 75 6c 6c 2c 20 33 29 3b 20 56 64 62 65 43 6f  Null, 3); VdbeCo
cd50: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
cd60: 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69       zErr = sqli
cd70: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
cd80: 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 25 73  NULL value in %s
cd90: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
cda0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
cdd0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
cde0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cdf0: 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
ce00: 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c  , 0, 3, 0, zErr,
ce10: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
ce20: 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74          integrit
ce30: 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28  yCheckResultRow(
ce40: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
ce50: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ce60: 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20  e(v, jmp2);.    
ce70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
ce80: 20 56 65 72 69 66 79 20 43 48 45 43 4b 20 63 6f   Verify CHECK co
ce90: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
cea0: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
ceb0: 43 68 65 63 6b 20 26 26 20 28 64 62 2d 3e 66 6c  Check && (db->fl
cec0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 67 6e  ags & SQLITE_Ign
ced0: 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30 20 29 7b  oreChecks)==0 ){
cee0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c  .          ExprL
cef0: 69 73 74 20 2a 70 43 68 65 63 6b 20 3d 20 73 71  ist *pCheck = sq
cf00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
cf10: 28 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  (db, pTab->pChec
cf20: 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
cf30: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
cf40: 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
cf50: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
cf60: 43 6b 46 61 75 6c 74 20 3d 20 73 71 6c 69 74 65  CkFault = sqlite
cf70: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
cf80: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
cf90: 20 20 20 20 69 6e 74 20 61 64 64 72 43 6b 4f 6b      int addrCkOk
cfa0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
cfb0: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
cfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
cfd0: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20  r *zErr;.       
cfe0: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
cff0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
d000: 69 53 65 6c 66 54 61 62 20 3d 20 69 44 61 74 61  iSelfTab = iData
d010: 43 75 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  Cur + 1;.       
d020: 20 20 20 20 20 66 6f 72 28 6b 3d 70 43 68 65 63       for(k=pChec
d030: 6b 2d 3e 6e 45 78 70 72 2d 31 3b 20 6b 3e 30 3b  k->nExpr-1; k>0;
d040: 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20   k--){.         
d050: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d060: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
d070: 70 43 68 65 63 6b 2d 3e 61 5b 6b 5d 2e 70 45 78  pCheck->a[k].pEx
d080: 70 72 2c 20 61 64 64 72 43 6b 46 61 75 6c 74 2c  pr, addrCkFault,
d090: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
d0a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
d0b0: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
d0c0: 28 70 50 61 72 73 65 2c 20 70 43 68 65 63 6b 2d  (pParse, pCheck-
d0d0: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 64 64  >a[0].pExpr, add
d0e0: 72 43 6b 4f 6b 2c 20 0a 20 20 20 20 20 20 20 20  rCkOk, .        
d0f0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a          SQLITE_J
d100: 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
d110: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d120: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d130: 76 2c 20 61 64 64 72 43 6b 46 61 75 6c 74 29 3b  v, addrCkFault);
d140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
d150: 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20  rse->iSelfTab = 
d160: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  0;.            z
d170: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Err = sqlite3MPr
d180: 69 6e 74 66 28 64 62 2c 20 22 43 48 45 43 4b 20  intf(db, "CHECK 
d190: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
d1a0: 64 20 69 6e 20 25 73 22 2c 0a 20 20 20 20 20 20  d in %s",.      
d1b0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
d1c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
d1d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d1e0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
d1f0: 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45  ng8, 0, 3, 0, zE
d200: 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  rr, P4_DYNAMIC);
d210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d220: 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c  egrityCheckResul
d230: 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20 20  tRow(v);.       
d240: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d250: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
d260: 61 64 64 72 43 6b 4f 6b 29 3b 0a 20 20 20 20 20  addrCkOk);.     
d270: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d280: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d290: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 68 65 63  Delete(db, pChec
d2a0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  k);.        }.  
d2b0: 20 20 20 20 20 20 69 66 28 20 21 69 73 51 75 69        if( !isQui
d2c0: 63 6b 20 29 7b 20 2f 2a 20 4f 6d 69 74 20 74 68  ck ){ /* Omit th
d2d0: 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 65 73 74  e remaining test
d2e0: 73 20 66 6f 72 20 71 75 69 63 6b 5f 63 68 65 63  s for quick_chec
d2f0: 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2f  k */.          /
d300: 2a 20 56 61 6c 69 64 61 74 65 20 69 6e 64 65 78  * Validate index
d310: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
d320: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a   current row */.
d330: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
d340: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
d350: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
d360: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b  =pIdx->pNext, j+
d370: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
d380: 69 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20  int jmp2, jmp3, 
d390: 6a 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20 20 20 20  jmp4, jmp5;.    
d3a0: 20 20 20 20 20 20 20 20 69 6e 74 20 63 6b 55 6e          int ckUn
d3b0: 69 71 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  iq = sqlite3Vdbe
d3c0: 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
d3d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
d3e0: 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20 63  f( pPk==pIdx ) c
d3f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d400: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
d410: 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
d420: 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20  y(pParse, pIdx, 
d430: 69 44 61 74 61 43 75 72 2c 20 30 2c 20 30 2c 20  iDataCur, 0, 0, 
d440: 26 6a 6d 70 33 2c 0a 20 20 20 20 20 20 20 20 20  &jmp3,.         
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d470: 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20 20 20  pPrior, r1);.   
d480: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20           pPrior 
d490: 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
d4a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d4b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
d4c0: 6d 6d 2c 20 38 2b 6a 2c 20 31 29 3b 2f 2a 20 69  mm, 8+j, 1);/* i
d4d0: 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72 79 20 63  ncrement entry c
d4e0: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ount */.        
d4f0: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
d500: 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
d510: 79 20 65 78 69 73 74 73 20 66 6f 72 20 74 68 65  y exists for the
d520: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 72   current table r
d530: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ow */.          
d540: 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33    jmp2 = sqlite3
d550: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
d560: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 49 64 78 43   OP_Found, iIdxC
d570: 75 72 2b 6a 2c 20 63 6b 55 6e 69 71 2c 20 72 31  ur+j, ckUniq, r1
d580: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
d5b0: 6e 43 6f 6c 75 6d 6e 29 3b 20 56 64 62 65 43 6f  nColumn); VdbeCo
d5c0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
d5d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d5e0: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
d5f0: 33 2c 20 22 72 6f 77 20 22 29 3b 0a 20 20 20 20  3, "row ");.    
d600: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d610: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d620: 43 6f 6e 63 61 74 2c 20 37 2c 20 33 2c 20 33 29  Concat, 7, 3, 3)
d630: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d640: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
d650: 69 6e 67 28 76 2c 20 34 2c 20 22 20 6d 69 73 73  ing(v, 4, " miss
d660: 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78 20 22  ing from index "
d670: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d680: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d690: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34  (v, OP_Concat, 4
d6a0: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 3, 3);.       
d6b0: 20 20 20 20 20 6a 6d 70 35 20 3d 20 73 71 6c 69       jmp5 = sqli
d6c0: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
d6d0: 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e  g(v, 4, pIdx->zN
d6e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
d6f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d700: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
d710: 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20  , 4, 3, 3);.    
d720: 20 20 20 20 20 20 20 20 6a 6d 70 34 20 3d 20 69          jmp4 = i
d730: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73  ntegrityCheckRes
d740: 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20  ultRow(v);.     
d750: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d760: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
d770: 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p2);.           
d780: 20 2f 2a 20 46 6f 72 20 55 4e 49 51 55 45 20 69   /* For UNIQUE i
d790: 6e 64 65 78 65 73 2c 20 76 65 72 69 66 79 20 74  ndexes, verify t
d7a0: 68 61 74 20 6f 6e 6c 79 20 6f 6e 65 20 65 6e 74  hat only one ent
d7b0: 72 79 20 65 78 69 73 74 73 20 77 69 74 68 20 74  ry exists with t
d7c0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
d7d0: 2a 20 63 75 72 72 65 6e 74 20 6b 65 79 2e 20 20  * current key.  
d7e0: 54 68 65 20 65 6e 74 72 79 20 69 73 20 75 6e 69  The entry is uni
d7f0: 71 75 65 20 69 66 20 28 31 29 20 61 6e 79 20 63  que if (1) any c
d800: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 0a 20 20  olumn is NULL.  
d810: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
d820: 28 32 29 20 74 68 65 20 6e 65 78 74 20 65 6e 74  (2) the next ent
d830: 72 79 20 68 61 73 20 61 20 64 69 66 66 65 72 65  ry has a differe
d840: 6e 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20  nt key */.      
d850: 20 20 20 20 20 20 69 66 28 20 49 73 55 6e 69 71        if( IsUniq
d860: 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b  ueIndex(pIdx) ){
d870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
d880: 6e 74 20 75 6e 69 71 4f 6b 20 3d 20 73 71 6c 69  nt uniqOk = sqli
d890: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d8a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
d8b0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 36          int jmp6
d8c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d8d0: 69 6e 74 20 6b 6b 3b 0a 20 20 20 20 20 20 20 20  int kk;.        
d8e0: 20 20 20 20 20 20 66 6f 72 28 6b 6b 3d 30 3b 20        for(kk=0; 
d8f0: 6b 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  kk<pIdx->nKeyCol
d900: 3b 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; kk++){.       
d910: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f           int iCo
d920: 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
d930: 6d 6e 5b 6b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  mn[kk];.        
d940: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d950: 69 43 6f 6c 21 3d 58 4e 5f 52 4f 57 49 44 20 26  iCol!=XN_ROWID &
d960: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
d970: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l );.           
d980: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
d990: 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   && pTab->aCol[i
d9a0: 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 20 63  Col].notNull ) c
d9b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d9c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d9d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d9e0: 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b 6b 2c 20  _IsNull, r1+kk, 
d9f0: 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20  uniqOk);.       
da00: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
da10: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
da20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
da30: 20 20 20 20 20 20 20 20 6a 6d 70 36 20 3d 20 73          jmp6 = s
da40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
da50: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64  (v, OP_Next, iId
da60: 78 43 75 72 2b 6a 29 3b 20 56 64 62 65 43 6f 76  xCur+j); VdbeCov
da70: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
da80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
da90: 64 62 65 47 6f 74 6f 28 76 2c 20 75 6e 69 71 4f  dbeGoto(v, uniqO
daa0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
dab0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
dac0: 70 48 65 72 65 28 76 2c 20 6a 6d 70 36 29 3b 0a  pHere(v, jmp6);.
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
dae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
daf0: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 47 54 2c 20  nt(v, OP_IdxGT, 
db00: 69 49 64 78 43 75 72 2b 6a 2c 20 75 6e 69 71 4f  iIdxCur+j, uniqO
db10: 6b 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20  k, r1,.         
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
db40: 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f  nKeyCol); VdbeCo
db50: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
db60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
db70: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
db80: 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69 71 75 65  , 3, "non-unique
db90: 20 65 6e 74 72 79 20 69 6e 20 69 6e 64 65 78 20   entry in index 
dba0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
dbb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
dbc0: 6f 28 76 2c 20 6a 6d 70 35 29 3b 0a 20 20 20 20  o(v, jmp5);.    
dbd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dbe0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
dbf0: 6c 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20  l(v, uniqOk);.  
dc00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
dc10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dc20: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
dc30: 6d 70 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mp4);.          
dc40: 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
dc50: 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61  PartIdxLabel(pPa
dc60: 72 73 65 2c 20 6a 6d 70 33 29 3b 0a 20 20 20 20  rse, jmp3);.    
dc70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dc80: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
dc90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dca0: 50 5f 4e 65 78 74 2c 20 69 44 61 74 61 43 75 72  P_Next, iDataCur
dcb0: 2c 20 6c 6f 6f 70 54 6f 70 29 3b 20 56 64 62 65  , loopTop); Vdbe
dcc0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
dcd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dce0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6c 6f 6f 70  JumpHere(v, loop
dcf0: 54 6f 70 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20  Top-1);.#ifndef 
dd00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
dd10: 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 20 20 69  ECOUNT.        i
dd20: 66 28 20 21 69 73 51 75 69 63 6b 20 29 7b 0a 20  f( !isQuick ){. 
dd30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dd40: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
dd50: 2c 20 32 2c 20 22 77 72 6f 6e 67 20 23 20 6f 66  , 2, "wrong # of
dd60: 20 65 6e 74 72 69 65 73 20 69 6e 20 69 6e 64 65   entries in inde
dd70: 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  x ");.          
dd80: 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54  for(j=0, pIdx=pT
dd90: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
dda0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
ddb0: 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, j++){.      
ddc0: 20 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70        if( pPk==p
ddd0: 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Idx ) continue;.
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ddf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
de00: 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 49 64 78 43   OP_Count, iIdxC
de10: 75 72 2b 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20  ur+j, 3);.      
de20: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
de30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
de40: 2c 20 4f 50 5f 45 71 2c 20 38 2b 6a 2c 20 30 2c  , OP_Eq, 8+j, 0,
de50: 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   3); VdbeCoverag
de60: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
de70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
de80: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
de90: 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
dea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
deb0: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34  eLoadString(v, 4
dec0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pIdx->zName);.
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
dee0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
def0: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 32   OP_Concat, 4, 2
df00: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
df10: 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b    integrityCheck
df20: 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20  ResultRow(v);.  
df30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
df40: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
df50: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20   addr);.        
df60: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
df70: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
df80: 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a  MIT_BTREECOUNT *
df90: 2f 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d  /.      } .    }
dfa0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 74 61  .    {.      sta
dfb0: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c  tic const int iL
dfc0: 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f  n = VDBE_OFFSET_
dfd0: 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20  LINENO(2);.     
dfe0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
dff0: 62 65 4f 70 4c 69 73 74 20 65 6e 64 43 6f 64 65  beOpList endCode
e000: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
e010: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20   OP_AddImm,     
e020: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
e030: 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20  ,    /* 0 */.   
e040: 20 20 20 20 20 7b 20 4f 50 5f 49 66 4e 6f 74 5a       { OP_IfNotZ
e050: 65 72 6f 2c 20 20 20 31 2c 20 34 2c 20 20 20 20  ero,   1, 4,    
e060: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20      0},    /* 1 
e070: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
e080: 53 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20  String8,     0, 
e090: 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  3,        0},   
e0a0: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20   /* 2 */.       
e0b0: 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c   { OP_ResultRow,
e0c0: 20 20 20 33 2c 20 31 2c 20 20 20 20 20 20 20 20     3, 1,        
e0d0: 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20  0},    /* 3 */. 
e0e0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 48 61 6c 74         { OP_Halt
e0f0: 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20  ,        0, 0,  
e100: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
e110: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  4 */.        { O
e120: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20 30  P_String8,     0
e130: 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 3,        0}, 
e140: 20 20 20 2f 2a 20 35 20 2a 2f 0a 20 20 20 20 20     /* 5 */.     
e150: 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
e160: 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20       0, 3,      
e170: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 36 20 2a 2f    0},    /* 6 */
e180: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
e190: 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 0a 20 20  VdbeOp *aOp;..  
e1a0: 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65      aOp = sqlite
e1b0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
e1c0: 2c 20 41 72 72 61 79 53 69 7a 65 28 65 6e 64 43  , ArraySize(endC
e1d0: 6f 64 65 29 2c 20 65 6e 64 43 6f 64 65 2c 20 69  ode), endCode, i
e1e0: 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  Ln);.      if( a
e1f0: 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4f  Op ){.        aO
e200: 70 5b 30 5d 2e 70 32 20 3d 20 31 2d 6d 78 45 72  p[0].p2 = 1-mxEr
e210: 72 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32  r;.        aOp[2
e220: 5d 2e 70 34 74 79 70 65 20 3d 20 50 34 5f 53 54  ].p4type = P4_ST
e230: 41 54 49 43 3b 0a 20 20 20 20 20 20 20 20 61 4f  ATIC;.        aO
e240: 70 5b 32 5d 2e 70 34 2e 7a 20 3d 20 22 6f 6b 22  p[2].p4.z = "ok"
e250: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 35 5d  ;.        aOp[5]
e260: 2e 70 34 74 79 70 65 20 3d 20 50 34 5f 53 54 41  .p4type = P4_STA
e270: 54 49 43 3b 0a 20 20 20 20 20 20 20 20 61 4f 70  TIC;.        aOp
e280: 5b 35 5d 2e 70 34 2e 7a 20 3d 20 28 63 68 61 72  [5].p4.z = (char
e290: 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  *)sqlite3ErrStr(
e2a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 3b  SQLITE_CORRUPT);
e2b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e2c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
e2d0: 50 33 28 76 2c 20 30 2c 20 73 71 6c 69 74 65 33  P3(v, 0, sqlite3
e2e0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
e2f0: 76 29 2d 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v)-2);.    }.  }
e300: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
e310: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e320: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
e330: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
e340: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
e350: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
e360: 20 65 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 20   encoding.  **  
e370: 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67   PRAGMA encoding
e380: 20 3d 20 22 75 74 66 2d 38 22 7c 22 75 74 66 2d   = "utf-8"|"utf-
e390: 31 36 22 7c 22 75 74 66 2d 31 36 6c 65 22 7c 22  16"|"utf-16le"|"
e3a0: 75 74 66 2d 31 36 62 65 22 0a 20 20 2a 2a 0a 20  utf-16be".  **. 
e3b0: 20 2a 2a 20 49 6e 20 69 74 73 20 66 69 72 73 74   ** In its first
e3c0: 20 66 6f 72 6d 2c 20 74 68 69 73 20 70 72 61 67   form, this prag
e3d0: 6d 61 20 72 65 74 75 72 6e 73 20 74 68 65 20 65  ma returns the e
e3e0: 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 6d  ncoding of the m
e3f0: 61 69 6e 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  ain.  ** databas
e400: 65 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e. If the databa
e410: 73 65 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61  se is not initia
e420: 6c 69 7a 65 64 2c 20 69 74 20 69 73 20 69 6e 69  lized, it is ini
e430: 74 69 61 6c 69 7a 65 64 20 6e 6f 77 2e 0a 20 20  tialized now..  
e440: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
e450: 6e 64 20 66 6f 72 6d 20 6f 66 20 74 68 69 73 20  nd form of this 
e460: 70 72 61 67 6d 61 20 69 73 20 61 20 6e 6f 2d 6f  pragma is a no-o
e470: 70 20 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61  p if the main da
e480: 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
e490: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
e4a0: 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
e4b0: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
e4c0: 69 74 20 73 65 74 73 20 74 68 65 20 64 65 66 61  it sets the defa
e4d0: 75 6c 74 0a 20 20 2a 2a 20 65 6e 63 6f 64 69 6e  ult.  ** encodin
e4e0: 67 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  g that will be u
e4f0: 73 65 64 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  sed for the main
e500: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
e510: 66 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a  f a new file.  *
e520: 2a 20 69 73 20 63 72 65 61 74 65 64 2e 20 49 66  * is created. If
e530: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 61 69   an existing mai
e540: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
e550: 69 73 20 6f 70 65 6e 65 64 2c 20 74 68 65 6e 20  is opened, then 
e560: 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74  the.  ** default
e570: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 66   text encoding f
e580: 6f 72 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  or the existing 
e590: 64 61 74 61 62 61 73 65 20 69 73 20 75 73 65 64  database is used
e5a0: 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20  ..  ** .  ** In 
e5b0: 61 6c 6c 20 63 61 73 65 73 20 6e 65 77 20 64 61  all cases new da
e5c0: 74 61 62 61 73 65 73 20 63 72 65 61 74 65 64 20  tabases created 
e5d0: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
e5e0: 20 63 6f 6d 6d 61 6e 64 20 61 72 65 0a 20 20 2a   command are.  *
e5f0: 2a 20 63 72 65 61 74 65 64 20 74 6f 20 75 73 65  * created to use
e600: 20 74 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c   the same defaul
e610: 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  t text encoding 
e620: 61 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  as the main data
e630: 62 61 73 65 2e 20 49 66 0a 20 20 2a 2a 20 74 68  base. If.  ** th
e640: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
e650: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 69 6e 69  has not been ini
e660: 74 69 61 6c 69 7a 65 64 20 61 6e 64 2f 6f 72 20  tialized and/or 
e670: 63 72 65 61 74 65 64 20 77 68 65 6e 20 41 54 54  created when ATT
e680: 41 43 48 0a 20 20 2a 2a 20 69 73 20 65 78 65 63  ACH.  ** is exec
e690: 75 74 65 64 2c 20 74 68 69 73 20 69 73 20 64 6f  uted, this is do
e6a0: 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 41 54  ne before the AT
e6b0: 54 41 43 48 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  TACH operation..
e6c0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65    **.  ** In the
e6d0: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 68 69   second form thi
e6e0: 73 20 70 72 61 67 6d 61 20 73 65 74 73 20 74 68  s pragma sets th
e6f0: 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
e700: 74 6f 20 62 65 20 75 73 65 64 20 69 6e 0a 20 20  to be used in.  
e710: 2a 2a 20 6e 65 77 20 64 61 74 61 62 61 73 65 20  ** new database 
e720: 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 75 73  files created us
e730: 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73  ing this databas
e740: 65 20 68 61 6e 64 6c 65 2e 20 49 74 20 69 73 20  e handle. It is 
e750: 6f 6e 6c 79 0a 20 20 2a 2a 20 75 73 65 66 75 6c  only.  ** useful
e760: 20 69 66 20 69 6e 76 6f 6b 65 64 20 69 6d 6d 65   if invoked imme
e770: 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68  diately after th
e780: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
e790: 69 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  i.  */.  case Pr
e7a0: 61 67 54 79 70 5f 45 4e 43 4f 44 49 4e 47 3a 20  agTyp_ENCODING: 
e7b0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
e7c0: 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d  st struct EncNam
e7d0: 65 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  e {.      char *
e7e0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 75 38 20  zName;.      u8 
e7f0: 65 6e 63 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61  enc;.    } encna
e800: 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  mes[] = {.      
e810: 7b 20 22 55 54 46 38 22 2c 20 20 20 20 20 53 51  { "UTF8",     SQ
e820: 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20 20 20  LITE_UTF8       
e830: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46   },.      { "UTF
e840: 2d 38 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55  -8",    SQLITE_U
e850: 54 46 38 20 20 20 20 20 20 20 20 7d 2c 20 20 2f  TF8        },  /
e860: 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e  * Must be elemen
e870: 74 20 5b 31 5d 20 2a 2f 0a 20 20 20 20 20 20 7b  t [1] */.      {
e880: 20 22 55 54 46 2d 31 36 6c 65 22 2c 20 53 51 4c   "UTF-16le", SQL
e890: 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20  ITE_UTF16LE     
e8a0: 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65  },  /* Must be e
e8b0: 6c 65 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20  lement [2] */.  
e8c0: 20 20 20 20 7b 20 22 55 54 46 2d 31 36 62 65 22      { "UTF-16be"
e8d0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
e8e0: 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74       },  /* Must
e8f0: 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 33 5d 20   be element [3] 
e900: 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31  */.      { "UTF1
e910: 36 6c 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54  6le",  SQLITE_UT
e920: 46 31 36 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20  F16LE     },.   
e930: 20 20 20 7b 20 22 55 54 46 31 36 62 65 22 2c 20     { "UTF16be", 
e940: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
e950: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
e960: 55 54 46 2d 31 36 22 2c 20 20 20 30 20 20 20 20  UTF-16",   0    
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
e980: 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   /* SQLITE_UTF16
e990: 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20  NATIVE */.      
e9a0: 7b 20 22 55 54 46 31 36 22 2c 20 20 20 20 30 20  { "UTF16",    0 
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9c0: 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54   }, /* SQLITE_UT
e9d0: 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20  F16NATIVE */.   
e9e0: 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
e9f0: 7d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72  };.    const str
ea00: 75 63 74 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e  uct EncName *pEn
ea10: 63 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67  c;.    if( !zRig
ea20: 68 74 20 29 7b 20 20 20 20 2f 2a 20 22 50 52 41  ht ){    /* "PRA
ea30: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 22 20 2a 2f  GMA encoding" */
ea40: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
ea50: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
ea60: 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67  rse) ) goto prag
ea70: 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 61 73  ma_out;.      as
ea80: 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53  sert( encnames[S
ea90: 51 4c 49 54 45 5f 55 54 46 38 5d 2e 65 6e 63 3d  QLITE_UTF8].enc=
eaa0: 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a  =SQLITE_UTF8 );.
eab0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e        assert( en
eac0: 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54  cnames[SQLITE_UT
ead0: 46 31 36 4c 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49  F16LE].enc==SQLI
eae0: 54 45 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20 20  TE_UTF16LE );.  
eaf0: 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e      assert( encn
eb00: 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31  ames[SQLITE_UTF1
eb10: 36 42 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45  6BE].enc==SQLITE
eb20: 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20 20 20  _UTF16BE );.    
eb30: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65    returnSingleTe
eb40: 78 74 28 76 2c 20 65 6e 63 6e 61 6d 65 73 5b 45  xt(v, encnames[E
eb50: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 5d 2e  NC(pParse->db)].
eb60: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
eb70: 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
eb80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 50 52            /* "PR
eb90: 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20  AGMA encoding = 
eba0: 58 58 58 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  XXX" */.      /*
ebb0: 20 4f 6e 6c 79 20 63 68 61 6e 67 65 20 74 68 65   Only change the
ebc0: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
ebd0: 2e 65 6e 63 20 69 66 20 74 68 65 20 64 61 74 61  .enc if the data
ebe0: 62 61 73 65 20 68 61 6e 64 6c 65 20 69 73 20 6e  base handle is n
ebf0: 6f 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74  ot.      ** init
ec00: 69 61 6c 69 7a 65 64 2e 20 49 66 20 74 68 65 20  ialized. If the 
ec10: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 78  main database ex
ec20: 69 73 74 73 2c 20 74 68 65 20 6e 65 77 20 73 71  ists, the new sq
ec30: 6c 69 74 65 2e 65 6e 63 20 76 61 6c 75 65 0a 20  lite.enc value. 
ec40: 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
ec50: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
ec60: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 6e   the schema is n
ec70: 65 78 74 20 6c 6f 61 64 65 64 2e 20 49 66 20 69  ext loaded. If i
ec80: 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20  t does not.     
ec90: 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78 69 73   ** already exis
eca0: 74 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63  ts, it will be c
ecb0: 72 65 61 74 65 64 20 74 6f 20 75 73 65 20 74 68  reated to use th
ecc0: 65 20 6e 65 77 20 65 6e 63 6f 64 69 6e 67 20 76  e new encoding v
ecd0: 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  alue..      */. 
ece0: 20 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20       if( .      
ecf0: 20 20 21 28 44 62 48 61 73 50 72 6f 70 65 72 74    !(DbHasPropert
ed00: 79 28 64 62 2c 20 30 2c 20 44 42 5f 53 63 68 65  y(db, 0, DB_Sche
ed10: 6d 61 4c 6f 61 64 65 64 29 29 20 7c 7c 20 0a 20  maLoaded)) || . 
ed20: 20 20 20 20 20 20 20 44 62 48 61 73 50 72 6f 70         DbHasProp
ed30: 65 72 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 45  erty(db, 0, DB_E
ed40: 6d 70 74 79 29 20 0a 20 20 20 20 20 20 29 7b 0a  mpty) .      ){.
ed50: 20 20 20 20 20 20 20 20 66 6f 72 28 70 45 6e 63          for(pEnc
ed60: 3d 26 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20 70  =&encnames[0]; p
ed70: 45 6e 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63  Enc->zName; pEnc
ed80: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
ed90: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
eda0: 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 70 45 6e  ICmp(zRight, pEn
edb0: 63 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  c->zName) ){.   
edc0: 20 20 20 20 20 20 20 20 20 53 43 48 45 4d 41 5f           SCHEMA_
edd0: 45 4e 43 28 64 62 29 20 3d 20 45 4e 43 28 64 62  ENC(db) = ENC(db
ede0: 29 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) =.            
edf0: 20 20 20 20 70 45 6e 63 2d 3e 65 6e 63 20 3f 20      pEnc->enc ? 
ee00: 70 45 6e 63 2d 3e 65 6e 63 20 3a 20 53 51 4c 49  pEnc->enc : SQLI
ee10: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ee30: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
ee40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ee50: 20 69 66 28 20 21 70 45 6e 63 2d 3e 7a 4e 61 6d   if( !pEnc->zNam
ee60: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  e ){.          s
ee70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ee80: 50 61 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72  Parse, "unsuppor
ee90: 74 65 64 20 65 6e 63 6f 64 69 6e 67 3a 20 25 73  ted encoding: %s
eea0: 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  ", zRight);.    
eeb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
eec0: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
eed0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
eee0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
eef0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ef00: 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53  OMIT_SCHEMA_VERS
ef10: 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a  ION_PRAGMAS.  /*
ef20: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
ef30: 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76  schema.]schema_v
ef40: 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52  ersion.  **   PR
ef50: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63  AGMA [schema.]sc
ef60: 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 3c  hema_version = <
ef70: 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20  integer>.  **.  
ef80: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
ef90: 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f  ema.]user_versio
efa0: 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  n.  **   PRAGMA 
efb0: 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65  [schema.]user_ve
efc0: 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72  rsion = <integer
efd0: 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52  >.  **.  **   PR
efe0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 66 72  AGMA [schema.]fr
eff0: 65 65 6c 69 73 74 5f 63 6f 75 6e 74 0a 20 20 2a  eelist_count.  *
f000: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
f010: 5b 73 63 68 65 6d 61 2e 5d 64 61 74 61 5f 76 65  [schema.]data_ve
f020: 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rsion.  **.  ** 
f030: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
f040: 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64  .]application_id
f050: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
f060: 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74  schema.]applicat
f070: 69 6f 6e 5f 69 64 20 3d 20 3c 69 6e 74 65 67 65  ion_id = <intege
f080: 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r>.  **.  ** The
f090: 20 70 72 61 67 6d 61 27 73 20 73 63 68 65 6d 61   pragma's schema
f0a0: 5f 76 65 72 73 69 6f 6e 20 61 6e 64 20 75 73 65  _version and use
f0b0: 72 5f 76 65 72 73 69 6f 6e 20 61 72 65 20 75 73  r_version are us
f0c0: 65 64 20 74 6f 20 73 65 74 20 6f 72 20 67 65 74  ed to set or get
f0d0: 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
f0e0: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65  of the schema-ve
f0f0: 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 2d 76  rsion and user-v
f100: 65 72 73 69 6f 6e 2c 20 72 65 73 70 65 63 74 69  ersion, respecti
f110: 76 65 6c 79 2e 20 42 6f 74 68 0a 20 20 2a 2a 20  vely. Both.  ** 
f120: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
f130: 6f 6e 20 61 6e 64 20 74 68 65 20 75 73 65 72 2d  on and the user-
f140: 76 65 72 73 69 6f 6e 20 61 72 65 20 33 32 2d 62  version are 32-b
f150: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
f160: 72 73 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  rs.  ** stored i
f170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
f180: 65 61 64 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eader..  **.  **
f190: 20 54 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b   The schema-cook
f1a0: 69 65 20 69 73 20 75 73 75 61 6c 6c 79 20 6f 6e  ie is usually on
f1b0: 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 69  ly manipulated i
f1c0: 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c  nternally by SQL
f1d0: 69 74 65 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  ite. It.  ** is 
f1e0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 53  incremented by S
f1f0: 51 4c 69 74 65 20 77 68 65 6e 65 76 65 72 20 74  QLite whenever t
f200: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
f210: 6d 61 20 69 73 20 6d 6f 64 69 66 69 65 64 20 28  ma is modified (
f220: 62 79 0a 20 20 2a 2a 20 63 72 65 61 74 69 6e 67  by.  ** creating
f230: 20 6f 72 20 64 72 6f 70 70 69 6e 67 20 61 20 74   or dropping a t
f240: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 29 2e 20  able or index). 
f250: 54 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69  The schema versi
f260: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 0a 20 20  on is used by.  
f270: 2a 2a 20 53 51 4c 69 74 65 20 65 61 63 68 20 74  ** SQLite each t
f280: 69 6d 65 20 61 20 71 75 65 72 79 20 69 73 20 65  ime a query is e
f290: 78 65 63 75 74 65 64 20 74 6f 20 65 6e 73 75 72  xecuted to ensur
f2a0: 65 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 72  e that the inter
f2b0: 6e 61 6c 20 63 61 63 68 65 0a 20 20 2a 2a 20 6f  nal cache.  ** o
f2c0: 66 20 74 68 65 20 73 63 68 65 6d 61 20 75 73 65  f the schema use
f2d0: 64 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  d when compiling
f2e0: 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 6d   the SQL query m
f2f0: 61 74 63 68 65 73 20 74 68 65 20 73 63 68 65 6d  atches the schem
f300: 61 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61  a of.  ** the da
f310: 74 61 62 61 73 65 20 61 67 61 69 6e 73 74 20 77  tabase against w
f320: 68 69 63 68 20 74 68 65 20 63 6f 6d 70 69 6c 65  hich the compile
f330: 64 20 71 75 65 72 79 20 69 73 20 61 63 74 75 61  d query is actua
f340: 6c 6c 79 20 65 78 65 63 75 74 65 64 2e 0a 20 20  lly executed..  
f350: 2a 2a 20 53 75 62 76 65 72 74 69 6e 67 20 74 68  ** Subverting th
f360: 69 73 20 6d 65 63 68 61 6e 69 73 6d 20 62 79 20  is mechanism by 
f370: 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73 63  using "PRAGMA sc
f380: 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 20 74 6f  hema_version" to
f390: 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65   modify.  ** the
f3a0: 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20   schema-version 
f3b0: 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 64  is potentially d
f3c0: 61 6e 67 65 72 6f 75 73 20 61 6e 64 20 6d 61 79  angerous and may
f3d0: 20 6c 65 61 64 20 74 6f 20 70 72 6f 67 72 61 6d   lead to program
f3e0: 0a 20 20 2a 2a 20 63 72 61 73 68 65 73 20 6f 72  .  ** crashes or
f3f0: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
f400: 74 69 6f 6e 2e 20 55 73 65 20 77 69 74 68 20 63  tion. Use with c
f410: 61 75 74 69 6f 6e 21 0a 20 20 2a 2a 0a 20 20 2a  aution!.  **.  *
f420: 2a 20 54 68 65 20 75 73 65 72 2d 76 65 72 73 69  * The user-versi
f430: 6f 6e 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  on is not used i
f440: 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c  nternally by SQL
f450: 69 74 65 2e 20 49 74 20 6d 61 79 20 62 65 20 75  ite. It may be u
f460: 73 65 64 20 62 79 0a 20 20 2a 2a 20 61 70 70 6c  sed by.  ** appl
f470: 69 63 61 74 69 6f 6e 73 20 66 6f 72 20 61 6e 79  ications for any
f480: 20 70 75 72 70 6f 73 65 2e 0a 20 20 2a 2f 0a 20   purpose..  */. 
f490: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 48 45   case PragTyp_HE
f4a0: 41 44 45 52 5f 56 41 4c 55 45 3a 20 7b 0a 20 20  ADER_VALUE: {.  
f4b0: 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20    int iCookie = 
f4c0: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20  pPragma->iArg;  
f4d0: 2f 2a 20 57 68 69 63 68 20 63 6f 6f 6b 69 65 20  /* Which cookie 
f4e0: 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
f4f0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
f500: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
f510: 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  iDb);.    if( zR
f520: 69 67 68 74 20 26 26 20 28 70 50 72 61 67 6d 61  ight && (pPragma
f530: 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61  ->mPragFlg & Pra
f540: 67 46 6c 67 5f 52 65 61 64 4f 6e 6c 79 29 3d 3d  gFlg_ReadOnly)==
f550: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72  0 ){.      /* Wr
f560: 69 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ite the specifie
f570: 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  d cookie value *
f580: 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
f590: 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20  onst VdbeOpList 
f5a0: 73 65 74 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a  setCookie[] = {.
f5b0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61          { OP_Tra
f5c0: 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20  nsaction,    0, 
f5d0: 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30   1,  0},    /* 0
f5e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
f5f0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20  _SetCookie,     
f600: 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20   0,  0,  0},    
f610: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7d 3b  /* 1 */.      };
f620: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61  .      VdbeOp *a
f630: 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Op;.      sqlite
f640: 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c  3VdbeVerifyNoMal
f650: 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41  locRequired(v, A
f660: 72 72 61 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b  rraySize(setCook
f670: 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20  ie));.      aOp 
f680: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f690: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
f6a0: 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 2c 20  ize(setCookie), 
f6b0: 73 65 74 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20  setCookie, 0);. 
f6c0: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
f6d0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
f6e0: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
f6f0: 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31  .      aOp[0].p1
f700: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
f710: 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[1].p1 = iDb;. 
f720: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d       aOp[1].p2 =
f730: 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20   iCookie;.      
f740: 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 73 71 6c 69  aOp[1].p3 = sqli
f750: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b  te3Atoi(zRight);
f760: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f770: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 70    /* Read the sp
f780: 65 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76  ecified cookie v
f790: 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74  alue */.      st
f7a0: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
f7b0: 70 4c 69 73 74 20 72 65 61 64 43 6f 6f 6b 69 65  pList readCookie
f7c0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
f7d0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
f7e0: 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c       0,  0,  0},
f7f0: 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20      /* 0 */.    
f800: 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f      { OP_ReadCoo
f810: 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 31 2c  kie,      0,  1,
f820: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f    0},    /* 1 */
f830: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  .        { OP_Re
f840: 73 75 6c 74 52 6f 77 2c 20 20 20 20 20 20 20 31  sultRow,       1
f850: 2c 20 20 31 2c 20 20 30 7d 0a 20 20 20 20 20 20  ,  1,  0}.      
f860: 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  };.      VdbeOp 
f870: 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  *aOp;.      sqli
f880: 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d  te3VdbeVerifyNoM
f890: 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c  allocRequired(v,
f8a0: 20 41 72 72 61 79 53 69 7a 65 28 72 65 61 64 43   ArraySize(readC
f8b0: 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61  ookie));.      a
f8c0: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
f8d0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
f8e0: 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69  aySize(readCooki
f8f0: 65 29 2c 72 65 61 64 43 6f 6f 6b 69 65 2c 30 29  e),readCookie,0)
f900: 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59  ;.      if( ONLY
f910: 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  _IF_REALLOC_STRE
f920: 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65  SS(aOp==0) ) bre
f930: 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d  ak;.      aOp[0]
f940: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
f950: 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62   aOp[1].p1 = iDb
f960: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70  ;.      aOp[1].p
f970: 33 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20  3 = iCookie;.   
f980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
f990: 75 73 61 62 6c 65 28 76 29 3b 0a 20 20 20 20 7d  usable(v);.    }
f9a0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
f9b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
f9c0: 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  MIT_SCHEMA_VERSI
f9d0: 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23  ON_PRAGMAS */..#
f9e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f9f0: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
fa00: 5f 44 49 41 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a  _DIAGS.  /*.  **
fa10: 20 20 20 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c     PRAGMA compil
fa20: 65 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20  e_options.  **. 
fa30: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
fa40: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6d 70  ames of all comp
fa50: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
fa60: 20 75 73 65 64 20 69 6e 20 74 68 69 73 20 62 75   used in this bu
fa70: 69 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70  ild,.  ** one op
fa80: 74 69 6f 6e 20 70 65 72 20 72 6f 77 2e 0a 20 20  tion per row..  
fa90: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
faa0: 70 5f 43 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e  p_COMPILE_OPTION
fab0: 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  S: {.    int i =
fac0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
fad0: 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 70 50  ar *zOpt;.    pP
fae0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a  arse->nMem = 1;.
faf0: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4f 70 74      while( (zOpt
fb00: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69   = sqlite3_compi
fb10: 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69 2b 2b  leoption_get(i++
fb20: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
fb30: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
fb40: 72 69 6e 67 28 76 2c 20 31 2c 20 7a 4f 70 74 29  ring(v, 1, zOpt)
fb50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fb60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fb70: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29  ResultRow, 1, 1)
fb80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
fb90: 74 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28  te3VdbeReusable(
fba0: 76 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  v);.  }.  break;
fbb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
fbc0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
fbd0: 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 23  TION_DIAGS */..#
fbe0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fbf0: 49 54 5f 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a  IT_WAL.  /*.  **
fc00: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
fc10: 61 2e 5d 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  a.]wal_checkpoin
fc20: 74 20 3d 20 70 61 73 73 69 76 65 7c 66 75 6c 6c  t = passive|full
fc30: 7c 72 65 73 74 61 72 74 7c 74 72 75 6e 63 61 74  |restart|truncat
fc40: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63  e.  **.  ** Chec
fc50: 6b 70 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62  kpoint the datab
fc60: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
fc70: 20 50 72 61 67 54 79 70 5f 57 41 4c 5f 43 48 45   PragTyp_WAL_CHE
fc80: 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69  CKPOINT: {.    i
fc90: 6e 74 20 69 42 74 20 3d 20 28 70 49 64 32 2d 3e  nt iBt = (pId2->
fca0: 7a 3f 69 44 62 3a 53 51 4c 49 54 45 5f 4d 41 58  z?iDb:SQLITE_MAX
fcb0: 5f 41 54 54 41 43 48 45 44 29 3b 0a 20 20 20 20  _ATTACHED);.    
fcc0: 69 6e 74 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49  int eMode = SQLI
fcd0: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
fce0: 53 53 49 56 45 3b 0a 20 20 20 20 69 66 28 20 7a  SSIVE;.    if( z
fcf0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69  Right ){.      i
fd00: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
fd10: 70 28 7a 52 69 67 68 74 2c 20 22 66 75 6c 6c 22  p(zRight, "full"
fd20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
fd30: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
fd40: 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a  HECKPOINT_FULL;.
fd50: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
fd60: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
fd70: 52 69 67 68 74 2c 20 22 72 65 73 74 61 72 74 22  Right, "restart"
fd80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
fd90: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
fda0: 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
fdb0: 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  T;.      }else i
fdc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
fdd0: 70 28 7a 52 69 67 68 74 2c 20 22 74 72 75 6e 63  p(zRight, "trunc
fde0: 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ate")==0 ){.    
fdf0: 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49      eMode = SQLI
fe00: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52  TE_CHECKPOINT_TR
fe10: 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a  UNCATE;.      }.
fe20: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
fe30: 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20  ->nMem = 3;.    
fe40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fe50: 33 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69  3(v, OP_Checkpoi
fe60: 6e 74 2c 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20  nt, iBt, eMode, 
fe70: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
fe80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fe90: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29  ResultRow, 1, 3)
fea0: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  ;.  }.  break;..
feb0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
fec0: 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  MA wal_autocheck
fed0: 70 6f 69 6e 74 0a 20 20 2a 2a 20 20 20 50 52 41  point.  **   PRA
fee0: 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  GMA wal_autochec
fef0: 6b 70 6f 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a  kpoint = N.  **.
ff00: 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61    ** Configure a
ff10: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
ff20: 74 69 6f 6e 20 74 6f 20 61 75 74 6f 6d 61 74 69  tion to automati
ff30: 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74  cally checkpoint
ff40: 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a   a database.  **
ff50: 20 61 66 74 65 72 20 61 63 63 75 6d 75 6c 61 74   after accumulat
ff60: 69 6e 67 20 4e 20 66 72 61 6d 65 73 20 69 6e 20  ing N frames in 
ff70: 74 68 65 20 6c 6f 67 2e 20 4f 72 20 71 75 65 72  the log. Or quer
ff80: 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
ff90: 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20  t value.  ** of 
ffa0: 4e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  N..  */.  case P
ffb0: 72 61 67 54 79 70 5f 57 41 4c 5f 41 55 54 4f 43  ragTyp_WAL_AUTOC
ffc0: 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20  HECKPOINT: {.   
ffd0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
ffe0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c       sqlite3_wal
fff0: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
10000 64 62 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28  db, sqlite3Atoi(
10010 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a  zRight));.    }.
10020 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
10030 49 6e 74 28 76 2c 20 0a 20 20 20 20 20 20 20 64  Int(v, .       d
10040 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 3d  b->xWalCallback=
10050 3d 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75  =sqlite3WalDefau
10060 6c 74 48 6f 6f 6b 20 3f 20 0a 20 20 20 20 20 20  ltHook ? .      
10070 20 20 20 20 20 53 51 4c 49 54 45 5f 50 54 52 5f       SQLITE_PTR_
10080 54 4f 5f 49 4e 54 28 64 62 2d 3e 70 57 61 6c 41  TO_INT(db->pWalA
10090 72 67 29 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20  rg) : 0);.  }.  
100a0 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20  break;.#endif.. 
100b0 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
100c0 20 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20   shrink_memory. 
100d0 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
100e0 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33  NTATION-OF: R-23
100f0 34 34 35 2d 34 36 31 30 39 20 54 68 69 73 20 70  445-46109 This p
10100 72 61 67 6d 61 20 63 61 75 73 65 73 20 74 68 65  ragma causes the
10110 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 63   database.  ** c
10120 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 77 68 69  onnection on whi
10130 63 68 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64  ch it is invoked
10140 20 74 6f 20 66 72 65 65 20 75 70 20 61 73 20 6d   to free up as m
10150 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 69 74  uch memory as it
10160 0a 20 20 2a 2a 20 63 61 6e 2c 20 62 79 20 63 61  .  ** can, by ca
10170 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 62  lling sqlite3_db
10180 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
10190 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  )..  */.  case P
101a0 72 61 67 54 79 70 5f 53 48 52 49 4e 4b 5f 4d 45  ragTyp_SHRINK_ME
101b0 4d 4f 52 59 3a 20 7b 0a 20 20 20 20 73 71 6c 69  MORY: {.    sqli
101c0 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
101d0 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 20 20 62  emory(db);.    b
101e0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
101f0 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70 74    **  PRAGMA opt
10200 69 6d 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  imize.  **  PRAG
10210 4d 41 20 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b  MA optimize(MASK
10220 29 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73  ).  **  PRAGMA s
10230 63 68 65 6d 61 2e 6f 70 74 69 6d 69 7a 65 0a 20  chema.optimize. 
10240 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65   **  PRAGMA sche
10250 6d 61 2e 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b  ma.optimize(MASK
10260 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 74 65  ).  **.  ** Atte
10270 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  mpt to optimize 
10280 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
10290 6c 6c 20 73 63 68 65 6d 61 73 20 61 72 65 20 6f  ll schemas are o
102a0 70 74 69 6d 69 7a 65 64 20 69 6e 20 74 68 65 20  ptimized in the 
102b0 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 66  first.  ** two f
102c0 6f 72 6d 73 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  orms, and only t
102d0 68 65 20 73 70 65 63 69 66 69 65 64 20 73 63 68  he specified sch
102e0 65 6d 61 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ema is optimized
102f0 20 69 6e 20 74 68 65 20 6c 61 74 74 65 72 20 74   in the latter t
10300 77 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  wo..  **.  ** Th
10310 65 20 64 65 74 61 69 6c 73 20 6f 66 20 6f 70 74  e details of opt
10320 69 6d 69 7a 61 74 69 6f 6e 73 20 70 65 72 66 6f  imizations perfo
10330 72 6d 65 64 20 62 79 20 74 68 69 73 20 70 72 61  rmed by this pra
10340 67 6d 61 20 61 72 65 20 65 78 70 65 63 74 65 64  gma are expected
10350 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  .  ** to change 
10360 61 6e 64 20 69 6d 70 72 6f 76 65 20 6f 76 65 72  and improve over
10370 20 74 69 6d 65 2e 20 20 41 70 70 6c 69 63 61 74   time.  Applicat
10380 69 6f 6e 73 20 73 68 6f 75 6c 64 20 61 6e 74 69  ions should anti
10390 63 69 70 61 74 65 20 74 68 61 74 0a 20 20 2a 2a  cipate that.  **
103a0 20 74 68 69 73 20 70 72 61 67 6d 61 20 77 69 6c   this pragma wil
103b0 6c 20 70 65 72 66 6f 72 6d 20 6e 65 77 20 6f 70  l perform new op
103c0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 66  timizations in f
103d0 75 74 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a  uture releases..
103e0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 70    **.  ** The op
103f0 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20  tional argument 
10400 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
10410 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
10420 20 70 65 72 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20   perform:.  **. 
10430 20 2a 2a 20 20 20 20 30 78 30 30 30 31 20 20 20   **    0x0001   
10440 20 44 65 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e   Debugging mode.
10450 20 20 44 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c    Do not actuall
10460 79 20 70 65 72 66 6f 72 6d 20 61 6e 79 20 6f 70  y perform any op
10470 74 69 6d 69 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a  timizations.  **
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
10490 74 20 69 6e 73 74 65 61 64 20 72 65 74 75 72 6e  t instead return
104a0 20 6f 6e 65 20 6c 69 6e 65 20 6f 66 20 74 65 78   one line of tex
104b0 74 20 66 6f 72 20 65 61 63 68 20 6f 70 74 69 6d  t for each optim
104c0 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20  ization.  **    
104d0 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 77            that w
104e0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 64  ould have been d
104f0 6f 6e 65 2e 20 20 4f 66 66 20 62 79 20 64 65 66  one.  Off by def
10500 61 75 6c 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ault..  **.  ** 
10510 20 20 20 30 78 30 30 30 32 20 20 20 20 52 75 6e     0x0002    Run
10520 20 41 4e 41 4c 59 5a 45 20 6f 6e 20 74 61 62 6c   ANALYZE on tabl
10530 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  es that might be
10540 6e 65 66 69 74 2e 20 20 4f 6e 20 62 79 20 64 65  nefit.  On by de
10550 66 61 75 6c 74 2e 0a 20 20 2a 2a 20 20 20 20 20  fault..  **     
10560 20 20 20 20 20 20 20 20 20 53 65 65 20 62 65 6c           See bel
10570 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ow for additiona
10580 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
10590 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30   **.  **    0x00
105a0 30 34 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69  04    (Not yet i
105b0 6d 70 6c 65 6d 65 6e 74 65 64 29 20 52 65 63 6f  mplemented) Reco
105c0 72 64 20 75 73 61 67 65 20 61 6e 64 20 70 65 72  rd usage and per
105d0 66 6f 72 6d 61 6e 63 65 20 0a 20 20 2a 2a 20 20  formance .  **  
105e0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 66 6f              info
105f0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
10600 20 63 75 72 72 65 6e 74 20 73 65 73 73 69 6f 6e   current session
10610 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 20 20 20   in the.  **    
10620 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
10630 73 65 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  se file so that 
10640 69 74 20 77 69 6c 6c 20 62 65 20 61 76 61 69 6c  it will be avail
10650 61 62 6c 65 20 74 6f 20 22 6f 70 74 69 6d 69 7a  able to "optimiz
10660 65 22 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  e".  **         
10670 20 20 20 20 20 70 72 61 67 6d 61 73 20 72 75 6e       pragmas run
10680 20 62 79 20 66 75 74 75 72 65 20 64 61 74 61 62   by future datab
10690 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
106a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78  .  **.  **    0x
106b0 30 30 30 38 20 20 20 20 28 4e 6f 74 20 79 65 74  0008    (Not yet
106c0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 20 43 72   implemented) Cr
106d0 65 61 74 65 20 69 6e 64 65 78 65 73 20 74 68 61  eate indexes tha
106e0 74 20 6d 69 67 68 74 20 68 61 76 65 0a 20 20 2a  t might have.  *
106f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  *              b
10700 65 65 6e 20 68 65 6c 70 66 75 6c 20 74 6f 20 72  een helpful to r
10710 65 63 65 6e 74 20 71 75 65 72 69 65 73 0a 20 20  ecent queries.  
10720 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 66 61  **.  ** The defa
10730 75 6c 74 20 4d 41 53 4b 20 69 73 20 61 6e 64 20  ult MASK is and 
10740 61 6c 77 61 79 73 20 73 68 61 6c 6c 20 62 65 20  always shall be 
10750 30 78 66 66 66 65 2e 20 20 30 78 66 66 66 65 20  0xfffe.  0xfffe 
10760 6d 65 61 6e 73 20 70 65 72 66 6f 72 6d 20 61 6c  means perform al
10770 6c 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70  l.  ** of the op
10780 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 73 74  timizations list
10790 65 64 20 61 62 6f 76 65 20 65 78 63 65 70 74 20  ed above except 
107a0 44 65 62 75 67 20 4d 6f 64 65 2c 20 69 6e 63 6c  Debug Mode, incl
107b0 75 64 69 6e 67 20 6e 65 77 0a 20 20 2a 2a 20 6f  uding new.  ** o
107c0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 68 61  ptimizations tha
107d0 74 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  t have not yet b
107e0 65 65 6e 20 69 6e 76 65 6e 74 65 64 2e 20 20 49  een invented.  I
107f0 66 20 6e 65 77 20 6f 70 74 69 6d 69 7a 61 74 69  f new optimizati
10800 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20 65 76 65  ons are.  ** eve
10810 72 20 61 64 64 65 64 20 74 68 61 74 20 73 68 6f  r added that sho
10820 75 6c 64 20 62 65 20 6f 66 66 20 62 79 20 64 65  uld be off by de
10830 66 61 75 6c 74 2c 20 74 68 6f 73 65 20 6f 66 66  fault, those off
10840 2d 62 79 2d 64 65 66 61 75 6c 74 20 0a 20 20 2a  -by-default .  *
10850 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  * optimizations 
10860 77 69 6c 6c 20 68 61 76 65 20 62 69 74 6d 61 73  will have bitmas
10870 6b 73 20 6f 66 20 30 78 31 30 30 30 30 20 6f 72  ks of 0x10000 or
10880 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 0a 20 20   larger..  **.  
10890 2a 2a 20 44 45 54 45 52 4d 49 4e 41 54 49 4f 4e  ** DETERMINATION
108a0 20 4f 46 20 57 48 45 4e 20 54 4f 20 52 55 4e 20   OF WHEN TO RUN 
108b0 41 4e 41 4c 59 5a 45 0a 20 20 2a 2a 0a 20 20 2a  ANALYZE.  **.  *
108c0 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
108d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
108e0 20 61 20 74 61 62 6c 65 20 69 73 20 61 6e 61 6c   a table is anal
108f0 79 7a 65 64 20 69 66 20 6f 6e 6c 79 20 69 66 20  yzed if only if 
10900 61 6c 6c 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  all of.  ** the 
10910 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
10920 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31  ue:.  **.  ** (1
10930 29 20 4d 41 53 4b 20 62 69 74 20 30 78 30 32 20  ) MASK bit 0x02 
10940 69 73 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  is set..  **.  *
10950 2a 20 28 32 29 20 54 68 65 20 71 75 65 72 79 20  * (2) The query 
10960 70 6c 61 6e 6e 65 72 20 75 73 65 64 20 73 71 6c  planner used sql
10970 69 74 65 5f 73 74 61 74 31 2d 73 74 79 6c 65 20  ite_stat1-style 
10980 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 6f  statistics for o
10990 6e 65 20 6f 72 0a 20 20 2a 2a 20 20 20 20 20 6d  ne or.  **     m
109a0 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74  ore indexes of t
109b0 68 65 20 74 61 62 6c 65 20 61 74 20 73 6f 6d 65  he table at some
109c0 20 70 6f 69 6e 74 20 64 75 72 69 6e 67 20 74 68   point during th
109d0 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 20 20  e lifetime of.  
109e0 2a 2a 20 20 20 20 20 74 68 65 20 63 75 72 72 65  **     the curre
109f0 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  nt connection.. 
10a00 20 2a 2a 0a 20 20 2a 2a 20 28 33 29 20 4f 6e 65   **.  ** (3) One
10a10 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73   or more indexes
10a20 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72   of the table ar
10a30 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 61 6e  e currently unan
10a40 61 6c 79 7a 65 64 20 4f 52 0a 20 20 2a 2a 20 20  alyzed OR.  **  
10a50 20 20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66     the number of
10a60 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
10a70 6c 65 20 68 61 73 20 69 6e 63 72 65 61 73 65 64  le has increased
10a80 20 62 79 20 32 35 20 74 69 6d 65 73 20 6f 72 20   by 25 times or 
10a90 6d 6f 72 65 0a 20 20 2a 2a 20 20 20 20 20 73 69  more.  **     si
10aa0 6e 63 65 20 74 68 65 20 6c 61 73 74 20 74 69 6d  nce the last tim
10ab0 65 20 41 4e 41 4c 59 5a 45 20 77 61 73 20 72 75  e ANALYZE was ru
10ac0 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n..  **.  ** The
10ad0 20 72 75 6c 65 73 20 66 6f 72 20 77 68 65 6e 20   rules for when 
10ae0 74 61 62 6c 65 73 20 61 72 65 20 61 6e 61 6c 79  tables are analy
10af0 7a 65 64 20 61 72 65 20 6c 69 6b 65 6c 79 20 74  zed are likely t
10b00 6f 20 63 68 61 6e 67 65 20 69 6e 0a 20 20 2a 2a  o change in.  **
10b10 20 66 75 74 75 72 65 20 72 65 6c 65 61 73 65 73   future releases
10b20 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
10b30 61 67 54 79 70 5f 4f 50 54 49 4d 49 5a 45 3a 20  agTyp_OPTIMIZE: 
10b40 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 4c 61 73  {.    int iDbLas
10b50 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
10b60 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  Loop termination
10b70 20 70 6f 69 6e 74 20 66 6f 72 20 74 68 65 20 73   point for the s
10b80 63 68 65 6d 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20  chema loop */.  
10b90 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20    int iTabCur;  
10ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
10bb0 6f 72 20 66 6f 72 20 61 20 74 61 62 6c 65 20 77  or for a table w
10bc0 68 6f 73 65 20 73 69 7a 65 20 6e 65 65 64 73 20  hose size needs 
10bd0 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20  checking */.    
10be0 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
10bf0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f         /* Loop o
10c00 76 65 72 20 74 61 62 6c 65 73 20 6f 66 20 61 20  ver tables of a 
10c10 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 53 63  schema */.    Sc
10c20 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 3b 20 20  hema *pSchema;  
10c30 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72       /* The curr
10c40 65 6e 74 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  ent schema */.  
10c50 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
10c60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
10c70 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d  ble in the schem
10c80 61 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  a */.    Index *
10c90 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
10ca0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 66 20 74  /* An index of t
10cb0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
10cc0 4c 6f 67 45 73 74 20 73 7a 54 68 72 65 73 68 6f  LogEst szThresho
10cd0 6c 64 3b 20 20 20 20 2f 2a 20 53 69 7a 65 20 74  ld;    /* Size t
10ce0 68 72 65 73 68 6f 6c 64 20 61 62 6f 76 65 20 77  hreshold above w
10cf0 68 69 63 68 20 72 65 61 6e 61 6c 79 73 69 73 20  hich reanalysis 
10d00 69 73 20 6e 65 65 64 64 20 2a 2f 0a 20 20 20 20  is needd */.    
10d10 63 68 61 72 20 2a 7a 53 75 62 53 71 6c 3b 20 20  char *zSubSql;  
10d20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
10d30 61 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 65 20  atement for the 
10d40 4f 50 5f 53 71 6c 45 78 65 63 20 6f 70 63 6f 64  OP_SqlExec opcod
10d50 65 20 2a 2f 0a 20 20 20 20 75 33 32 20 6f 70 4d  e */.    u32 opM
10d60 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
10d70 2f 2a 20 4d 61 73 6b 20 6f 66 20 6f 70 65 72 61  /* Mask of opera
10d80 74 69 6f 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d  tions to perform
10d90 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52 69   */..    if( zRi
10da0 67 68 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 4d  ght ){.      opM
10db0 61 73 6b 20 3d 20 28 75 33 32 29 73 71 6c 69 74  ask = (u32)sqlit
10dc0 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
10dd0 20 20 20 20 20 20 69 66 28 20 28 6f 70 4d 61 73        if( (opMas
10de0 6b 20 26 20 30 78 30 32 29 3d 3d 30 20 29 20 62  k & 0x02)==0 ) b
10df0 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
10e00 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  .      opMask = 
10e10 30 78 66 66 66 65 3b 0a 20 20 20 20 7d 0a 20 20  0xfffe;.    }.  
10e20 20 20 69 54 61 62 43 75 72 20 3d 20 70 50 61 72    iTabCur = pPar
10e30 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
10e40 66 6f 72 28 69 44 62 4c 61 73 74 20 3d 20 7a 44  for(iDbLast = zD
10e50 62 3f 69 44 62 3a 64 62 2d 3e 6e 44 62 2d 31 3b  b?iDb:db->nDb-1;
10e60 20 69 44 62 3c 3d 69 44 62 4c 61 73 74 3b 20 69   iDb<=iDbLast; i
10e70 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Db++){.      if(
10e80 20 69 44 62 3d 3d 31 20 29 20 63 6f 6e 74 69 6e   iDb==1 ) contin
10e90 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ue;.      sqlite
10ea0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
10eb0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
10ec0 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20        pSchema = 
10ed0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
10ee0 68 65 6d 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  hema;.      for(
10ef0 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
10f00 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
10f10 61 73 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74  ash); k; k=sqlit
10f20 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
10f30 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54         pTab = (T
10f40 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
10f50 44 61 74 61 28 6b 29 3b 0a 0a 20 20 20 20 20 20  Data(k);..      
10f60 20 20 2f 2a 20 49 66 20 74 61 62 6c 65 20 70 54    /* If table pT
10f70 61 62 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ab has not been 
10f80 75 73 65 64 20 69 6e 20 61 20 77 61 79 20 74 68  used in a way th
10f90 61 74 20 77 6f 75 6c 64 20 62 65 6e 65 66 69 74  at would benefit
10fa0 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
10fb0 20 68 61 76 69 6e 67 20 61 6e 61 6c 79 73 69 73   having analysis
10fc0 20 73 74 61 74 69 73 74 69 63 73 20 64 75 72 69   statistics duri
10fd0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
10fe0 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 6b 69  ession, then ski
10ff0 70 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  p it..        **
11000 20 54 68 69 73 20 61 6c 73 6f 20 68 61 73 20 74   This also has t
11010 68 65 20 65 66 66 65 63 74 20 6f 66 20 73 6b 69  he effect of ski
11020 70 70 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61  pping virtual ta
11030 62 6c 65 73 20 61 6e 64 20 76 69 65 77 73 20 2a  bles and views *
11040 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  /.        if( (p
11050 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
11060 54 46 5f 53 74 61 74 73 55 73 65 64 29 3d 3d 30  TF_StatsUsed)==0
11070 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
11080 20 20 20 20 20 20 2f 2a 20 52 65 61 6e 61 6c 79        /* Reanaly
11090 7a 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ze if the table 
110a0 69 73 20 32 35 20 74 69 6d 65 73 20 6c 61 72 67  is 25 times larg
110b0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 73 74  er than the last
110c0 20 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20   analysis */.   
110d0 20 20 20 20 20 73 7a 54 68 72 65 73 68 6f 6c 64       szThreshold
110e0 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
110f0 45 73 74 20 2b 20 34 36 3b 20 61 73 73 65 72 74  Est + 46; assert
11100 28 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ( sqlite3LogEst(
11110 32 35 29 3d 3d 34 36 20 29 3b 0a 20 20 20 20 20  25)==46 );.     
11120 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
11130 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
11140 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
11150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
11160 20 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31   !pIdx->hasStat1
11170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11180 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 30 3b  szThreshold = 0;
11190 20 2f 2a 20 41 6c 77 61 79 73 20 61 6e 61 6c 79   /* Always analy
111a0 7a 65 20 69 66 20 61 6e 79 20 69 6e 64 65 78 20  ze if any index 
111b0 6c 61 63 6b 73 20 73 74 61 74 69 73 74 69 63 73  lacks statistics
111c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
111d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
111e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
111f0 20 20 20 20 20 69 66 28 20 73 7a 54 68 72 65 73       if( szThres
11200 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  hold ){.        
11210 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
11220 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 43  le(pParse, iTabC
11230 75 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ur, iDb, pTab, O
11240 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
11250 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11260 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
11270 66 53 6d 61 6c 6c 65 72 2c 20 69 54 61 62 43 75  fSmaller, iTabCu
11280 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
112a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
112b0 64 64 72 28 76 29 2b 32 2b 28 6f 70 4d 61 73 6b  ddr(v)+2+(opMask
112c0 26 31 29 2c 20 73 7a 54 68 72 65 73 68 6f 6c 64  &1), szThreshold
112d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
112e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
112f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11300 7a 53 75 62 53 71 6c 20 3d 20 73 71 6c 69 74 65  zSubSql = sqlite
11310 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 41 4e  3MPrintf(db, "AN
11320 41 4c 59 5a 45 20 5c 22 25 77 5c 22 2e 5c 22 25  ALYZE \"%w\".\"%
11330 77 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  w\"",.          
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11350 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
11360 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 70 54  Db].zDbSName, pT
11370 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
11380 20 20 20 20 69 66 28 20 6f 70 4d 61 73 6b 20 26      if( opMask &
11390 20 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20   0x01 ){.       
113a0 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
113b0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
113c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
113d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
113e0 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
113f0 2c 20 30 2c 20 72 31 2c 20 30 2c 20 7a 53 75 62  , 0, r1, 0, zSub
11400 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Sql, P4_DYNAMIC)
11410 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11420 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11430 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
11440 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  1, 1);.        }
11450 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11470 34 28 76 2c 20 4f 50 5f 53 71 6c 45 78 65 63 2c  4(v, OP_SqlExec,
11480 20 30 2c 20 30 2c 20 30 2c 20 7a 53 75 62 53 71   0, 0, 0, zSubSq
11490 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  l, P4_DYNAMIC);.
114a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
114b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
114c0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
114d0 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20   OP_Expire);.   
114e0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
114f0 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
11500 62 75 73 79 5f 74 69 6d 65 6f 75 74 0a 20 20 2a  busy_timeout.  *
11510 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f  *   PRAGMA busy_
11520 74 69 6d 65 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a  timeout = N.  **
11530 0a 20 20 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  .  ** Call sqlit
11540 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
11550 64 62 2c 20 4e 29 2e 20 20 52 65 74 75 72 6e 20  db, N).  Return 
11560 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
11570 6f 75 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69  out value.  ** i
11580 66 20 6f 6e 65 20 69 73 20 73 65 74 2e 20 20 49  f one is set.  I
11590 66 20 6e 6f 20 62 75 73 79 20 68 61 6e 64 6c 65  f no busy handle
115a0 72 20 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74  r or a different
115b0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 69 73   busy handler is
115c0 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 6e 20 30   set.  ** then 0
115d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 53   is returned.  S
115e0 65 74 74 69 6e 67 20 74 68 65 20 62 75 73 79 5f  etting the busy_
115f0 74 69 6d 65 6f 75 74 20 74 6f 20 30 20 6f 72 20  timeout to 0 or 
11600 6e 65 67 61 74 69 76 65 0a 20 20 2a 2a 20 64 69  negative.  ** di
11610 73 61 62 6c 65 73 20 74 68 65 20 74 69 6d 65 6f  sables the timeo
11620 75 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61 73  ut..  */.  /*cas
11630 65 20 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54  e PragTyp_BUSY_T
11640 49 4d 45 4f 55 54 2a 2f 20 64 65 66 61 75 6c 74  IMEOUT*/ default
11650 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  : {.    assert( 
11660 70 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79  pPragma->ePragTy
11670 70 3d 3d 50 72 61 67 54 79 70 5f 42 55 53 59 5f  p==PragTyp_BUSY_
11680 54 49 4d 45 4f 55 54 20 29 3b 0a 20 20 20 20 69  TIMEOUT );.    i
11690 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
116a0 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
116b0 74 69 6d 65 6f 75 74 28 64 62 2c 20 73 71 6c 69  timeout(db, sqli
116c0 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29  te3Atoi(zRight))
116d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
116e0 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64  rnSingleInt(v, d
116f0 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 29 3b  b->busyTimeout);
11700 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11710 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
11720 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69  GMA soft_heap_li
11730 6d 69 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  mit.  **   PRAGM
11740 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  A soft_heap_limi
11750 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t = N.  **.  ** 
11760 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
11770 46 3a 20 52 2d 32 36 33 34 33 2d 34 35 39 33 30  F: R-26343-45930
11780 20 54 68 69 73 20 70 72 61 67 6d 61 20 69 6e 76   This pragma inv
11790 6f 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 71  okes the.  ** sq
117a0 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
117b0 6c 69 6d 69 74 36 34 28 29 20 69 6e 74 65 72 66  limit64() interf
117c0 61 63 65 20 77 69 74 68 20 74 68 65 20 61 72 67  ace with the arg
117d0 75 6d 65 6e 74 20 4e 2c 20 69 66 20 4e 20 69 73  ument N, if N is
117e0 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
117f0 61 6e 64 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67  and is a non-neg
11800 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20  ative integer.. 
11810 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
11820 4f 4e 2d 4f 46 3a 20 52 2d 36 34 34 35 31 2d 30  ON-OF: R-64451-0
11830 37 31 36 33 20 54 68 65 20 73 6f 66 74 5f 68 65  7163 The soft_he
11840 61 70 5f 6c 69 6d 69 74 20 70 72 61 67 6d 61 20  ap_limit pragma 
11850 61 6c 77 61 79 73 0a 20 20 2a 2a 20 72 65 74 75  always.  ** retu
11860 72 6e 73 20 74 68 65 20 73 61 6d 65 20 69 6e 74  rns the same int
11870 65 67 65 72 20 74 68 61 74 20 77 6f 75 6c 64 20  eger that would 
11880 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
11890 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  he.  ** sqlite3_
118a0 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
118b0 34 28 2d 31 29 20 43 2d 6c 61 6e 67 75 61 67 65  4(-1) C-language
118c0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
118d0 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53    case PragTyp_S
118e0 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 3a 20  OFT_HEAP_LIMIT: 
118f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
11900 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a  t64 N;.    if( z
11910 52 69 67 68 74 20 26 26 20 73 71 6c 69 74 65 33  Right && sqlite3
11920 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52  DecOrHexToI64(zR
11930 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54  ight, &N)==SQLIT
11940 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
11950 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
11960 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 20 20  limit64(N);.    
11970 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
11980 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33  leInt(v, sqlite3
11990 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
119a0 36 34 28 2d 31 29 29 3b 0a 20 20 20 20 62 72 65  64(-1));.    bre
119b0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
119c0 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72 65  **   PRAGMA thre
119d0 61 64 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ads.  **   PRAGM
119e0 41 20 74 68 72 65 61 64 73 20 3d 20 4e 0a 20 20  A threads = N.  
119f0 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72  **.  ** Configur
11a00 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
11a10 6d 62 65 72 20 6f 66 20 77 6f 72 6b 65 72 20 74  mber of worker t
11a20 68 72 65 61 64 73 2e 20 20 52 65 74 75 72 6e 20  hreads.  Return 
11a30 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78  the new.  ** max
11a40 69 6d 75 6d 2c 20 77 68 69 63 68 20 6d 69 67 68  imum, which migh
11a50 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 72  t be less than r
11a60 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
11a70 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 54 48   case PragTyp_TH
11a80 52 45 41 44 53 3a 20 7b 0a 20 20 20 20 73 71 6c  READS: {.    sql
11a90 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20  ite3_int64 N;.  
11aa0 20 20 69 66 28 20 7a 52 69 67 68 74 0a 20 20 20    if( zRight.   
11ab0 20 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f    && sqlite3DecO
11ac0 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74  rHexToI64(zRight
11ad0 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &N)==SQLITE_OK
11ae0 0a 20 20 20 20 20 26 26 20 4e 3e 3d 30 0a 20 20  .     && N>=0.  
11af0 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
11b00 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c  e3_limit(db, SQL
11b10 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
11b20 5f 54 48 52 45 41 44 53 2c 20 28 69 6e 74 29 28  _THREADS, (int)(
11b30 4e 26 30 78 37 66 66 66 66 66 66 66 29 29 3b 0a  N&0x7fffffff));.
11b40 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
11b50 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c  SingleInt(v, sql
11b60 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53  ite3_limit(db, S
11b70 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
11b80 45 52 5f 54 48 52 45 41 44 53 2c 20 2d 31 29 29  ER_THREADS, -1))
11b90 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
11ba0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
11bb0 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
11bc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
11bd0 53 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65  ST).  /*.  ** Re
11be0 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74  port the current
11bf0 20 73 74 61 74 65 20 6f 66 20 66 69 6c 65 20 6c   state of file l
11c00 6f 67 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  ogs for all data
11c10 62 61 73 65 73 0a 20 20 2a 2f 0a 20 20 63 61 73  bases.  */.  cas
11c20 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 53  e PragTyp_LOCK_S
11c30 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 73 74 61  TATUS: {.    sta
11c40 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
11c50 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65  const azLockName
11c60 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e  [] = {.      "un
11c70 6c 6f 63 6b 65 64 22 2c 20 22 73 68 61 72 65 64  locked", "shared
11c80 22 2c 20 22 72 65 73 65 72 76 65 64 22 2c 20 22  ", "reserved", "
11c90 70 65 6e 64 69 6e 67 22 2c 20 22 65 78 63 6c 75  pending", "exclu
11ca0 73 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20  sive".    };.   
11cb0 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72   int i;.    pPar
11cc0 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20  se->nMem = 2;.  
11cd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
11ce0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
11cf0 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
11d00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11d10 7a 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e 6f 77  zState = "unknow
11d20 6e 22 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  n";.      int j;
11d30 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
11d40 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d  Db[i].zDbSName==
11d50 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
11d60 20 20 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44      pBt = db->aD
11d70 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
11d80 69 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71  if( pBt==0 || sq
11d90 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
11da0 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pBt)==0 ){.     
11db0 20 20 20 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f     zState = "clo
11dc0 73 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  sed";.      }els
11dd0 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69  e if( sqlite3_fi
11de0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69  le_control(db, i
11df0 20 3f 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44   ? db->aDb[i].zD
11e00 62 53 4e 61 6d 65 20 3a 20 30 2c 20 0a 20 20 20  bSName : 0, .   
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e30 20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c    SQLITE_FCNTL_L
11e40 4f 43 4b 53 54 41 54 45 2c 20 26 6a 29 3d 3d 53  OCKSTATE, &j)==S
11e50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11e60 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20 61 7a       zState = az
11e70 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20  LockName[j];.   
11e80 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
11e90 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
11ea0 76 2c 20 31 2c 20 22 73 73 22 2c 20 64 62 2d 3e  v, 1, "ss", db->
11eb0 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c  aDb[i].zDbSName,
11ec0 20 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 7d 0a   zState);.    }.
11ed0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
11ee0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
11ef0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
11f00 20 2f 2a 20 50 72 61 67 6d 61 20 20 20 20 20 20   /* Pragma      
11f10 20 20 69 41 72 67 0a 20 20 2a 2a 20 2d 2d 2d 2d    iArg.  ** ----
11f20 2d 2d 2d 2d 2d 2d 20 20 20 2d 2d 2d 2d 2d 2d 0a  ------   ------.
11f30 20 20 2a 2a 20 20 6b 65 79 20 20 20 20 20 20 20    **  key       
11f40 20 20 20 20 30 0a 20 20 2a 2a 20 20 72 65 6b 65      0.  **  reke
11f50 79 20 20 20 20 20 20 20 20 20 31 0a 20 20 2a 2a  y         1.  **
11f60 20 20 68 65 78 6b 65 79 20 20 20 20 20 20 20 20    hexkey        
11f70 32 0a 20 20 2a 2a 20 20 68 65 78 72 65 6b 65 79  2.  **  hexrekey
11f80 20 20 20 20 20 20 33 0a 20 20 2a 2a 20 20 74 65        3.  **  te
11f90 78 74 6b 65 79 20 20 20 20 20 20 20 34 0a 20 20  xtkey       4.  
11fa0 2a 2a 20 20 74 65 78 74 72 65 6b 65 79 20 20 20  **  textrekey   
11fb0 20 20 35 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20    5.  */.  case 
11fc0 50 72 61 67 54 79 70 5f 4b 45 59 3a 20 7b 0a 20  PragTyp_KEY: {. 
11fd0 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
11fe0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  .      int n = p
11ff0 50 72 61 67 6d 61 2d 3e 69 41 72 67 3c 34 20 3f  Pragma->iArg<4 ?
12000 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
12010 28 7a 52 69 67 68 74 29 20 3a 20 2d 31 3b 0a 20  (zRight) : -1;. 
12020 20 20 20 20 20 69 66 28 20 28 70 50 72 61 67 6d       if( (pPragm
12030 61 2d 3e 69 41 72 67 20 26 20 31 29 3d 3d 30 20  a->iArg & 1)==0 
12040 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12050 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  e3_key_v2(db, zD
12060 62 2c 20 7a 52 69 67 68 74 2c 20 6e 29 3b 0a 20  b, zRight, n);. 
12070 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12080 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65      sqlite3_reke
12090 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52  y_v2(db, zDb, zR
120a0 69 67 68 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ight, n);.      
120b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
120c0 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65 20 50 72  k;.  }.  case Pr
120d0 61 67 54 79 70 5f 48 45 58 4b 45 59 3a 20 7b 0a  agTyp_HEXKEY: {.
120e0 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
120f0 7b 0a 20 20 20 20 20 20 75 38 20 69 42 79 74 65  {.      u8 iByte
12100 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
12110 20 20 20 20 20 63 68 61 72 20 7a 4b 65 79 5b 34       char zKey[4
12120 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0];.      for(i=
12130 30 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69  0, iByte=0; i<si
12140 7a 65 6f 66 28 7a 4b 65 79 29 2a 32 20 26 26 20  zeof(zKey)*2 && 
12150 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
12160 7a 52 69 67 68 74 5b 69 5d 29 3b 20 69 2b 2b 29  zRight[i]); i++)
12170 7b 0a 20 20 20 20 20 20 20 20 69 42 79 74 65 20  {.        iByte 
12180 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b 20 73  = (iByte<<4) + s
12190 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
121a0 52 69 67 68 74 5b 69 5d 29 3b 0a 20 20 20 20 20  Right[i]);.     
121b0 20 20 20 69 66 28 20 28 69 26 31 29 21 3d 30 20     if( (i&1)!=0 
121c0 29 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42  ) zKey[i/2] = iB
121d0 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  yte;.      }.   
121e0 20 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d     if( (pPragma-
121f0 3e 69 41 72 67 20 26 20 31 29 3d 3d 30 20 29 7b  >iArg & 1)==0 ){
12200 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12210 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  _key_v2(db, zDb,
12220 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20   zKey, i/2);.   
12230 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12240 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f    sqlite3_rekey_
12250 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79  v2(db, zDb, zKey
12260 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d 0a  , i/2);.      }.
12270 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
12280 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20  .  }.#endif.#if 
12290 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
122a0 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66  AS_CODEC) || def
122b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
122c0 4c 45 5f 43 45 52 4f 44 29 0a 20 20 63 61 73 65  LE_CEROD).  case
122d0 20 50 72 61 67 54 79 70 5f 41 43 54 49 56 41 54   PragTyp_ACTIVAT
122e0 45 5f 45 58 54 45 4e 53 49 4f 4e 53 3a 20 69 66  E_EXTENSIONS: if
122f0 28 20 7a 52 69 67 68 74 20 29 7b 0a 23 69 66 64  ( zRight ){.#ifd
12300 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
12310 44 45 43 0a 20 20 20 20 69 66 28 20 73 71 6c 69  DEC.    if( sqli
12320 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67  te3StrNICmp(zRig
12330 68 74 2c 20 22 73 65 65 2d 22 2c 20 34 29 3d 3d  ht, "see-", 4)==
12340 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12350 65 33 5f 61 63 74 69 76 61 74 65 5f 73 65 65 28  e3_activate_see(
12360 26 7a 52 69 67 68 74 5b 34 5d 29 3b 0a 20 20 20  &zRight[4]);.   
12370 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
12380 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
12390 45 52 4f 44 0a 20 20 20 20 69 66 28 20 73 71 6c  EROD.    if( sql
123a0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69  ite3StrNICmp(zRi
123b0 67 68 74 2c 20 22 63 65 72 6f 64 2d 22 2c 20 36  ght, "cerod-", 6
123c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
123d0 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f 63  lite3_activate_c
123e0 65 72 6f 64 28 26 7a 52 69 67 68 74 5b 36 5d 29  erod(&zRight[6])
123f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
12400 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
12410 69 66 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f  if..  } /* End o
12420 66 20 74 68 65 20 50 52 41 47 4d 41 20 73 77 69  f the PRAGMA swi
12430 74 63 68 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  tch */..  /* The
12440 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
12450 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
12460 73 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ss SQLITE_DEBUG 
12470 69 73 20 64 65 66 69 6e 65 64 2e 20 49 74 73 20  is defined. Its 
12480 6f 6e 6c 79 0a 20 20 2a 2a 20 70 75 72 70 6f 73  only.  ** purpos
12490 65 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  e is to execute 
124a0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
124b0 6e 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  nts to verify th
124c0 61 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 50  at if the.  ** P
124d0 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73  ragFlg_NoColumns
124e0 31 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  1 flag is set an
124f0 64 20 74 68 65 20 63 61 6c 6c 65 72 20 73 70 65  d the caller spe
12500 63 69 66 69 65 64 20 61 6e 20 61 72 67 75 6d 65  cified an argume
12510 6e 74 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 50  nt.  ** to the P
12520 52 41 47 4d 41 2c 20 74 68 65 20 69 6d 70 6c 65  RAGMA, the imple
12530 6d 65 6e 74 61 74 69 6f 6e 20 68 61 73 20 6e 6f  mentation has no
12540 74 20 61 64 64 65 64 20 61 6e 79 20 4f 50 5f 52  t added any OP_R
12550 65 73 75 6c 74 52 6f 77 20 0a 20 20 2a 2a 20 69  esultRow .  ** i
12560 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 6f 20 74  nstructions to t
12570 68 65 20 56 4d 2e 20 20 2a 2f 0a 20 20 69 66 28  he VM.  */.  if(
12580 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67   (pPragma->mPrag
12590 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f  Flg & PragFlg_No
125a0 43 6f 6c 75 6d 6e 73 31 29 20 26 26 20 7a 52 69  Columns1) && zRi
125b0 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
125c0 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65  e3VdbeVerifyNoRe
125d0 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 7d 0a  sultRow(v);.  }.
125e0 0a 70 72 61 67 6d 61 5f 6f 75 74 3a 0a 20 20 73  .pragma_out:.  s
125f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12600 20 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74   zLeft);.  sqlit
12610 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 52 69  e3DbFree(db, zRi
12620 67 68 74 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20  ght);.}.#ifndef 
12630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12640 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a  UALTABLE./******
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12690 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65  *******.** Imple
126a0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20  mentation of an 
126b0 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
126c0 6c 20 74 61 62 6c 65 20 74 68 61 74 20 72 75 6e  l table that run
126d0 73 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a  s a pragma..**.*
126e0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
126f0 20 50 72 61 67 6d 61 56 74 61 62 20 50 72 61 67   PragmaVtab Prag
12700 6d 61 56 74 61 62 3b 0a 74 79 70 65 64 65 66 20  maVtab;.typedef 
12710 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61  struct PragmaVta
12720 62 43 75 72 73 6f 72 20 50 72 61 67 6d 61 56 74  bCursor PragmaVt
12730 61 62 43 75 72 73 6f 72 3b 0a 73 74 72 75 63 74  abCursor;.struct
12740 20 50 72 61 67 6d 61 56 74 61 62 20 7b 0a 20 20   PragmaVtab {.  
12750 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73  sqlite3_vtab bas
12760 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73  e;        /* Bas
12770 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62  e class.  Must b
12780 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c  e first */.  sql
12790 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
127a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
127b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
127c0 6e 20 74 6f 20 77 68 69 63 68 20 69 74 20 62 65  n to which it be
127d0 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  longs */.  const
127e0 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 4e 61   PragmaName *pNa
127f0 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me;  /* Name of 
12800 74 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 20 20  the pragma */.  
12810 75 38 20 6e 48 69 64 64 65 6e 3b 20 20 20 20 20  u8 nHidden;     
12820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12830 62 65 72 20 6f 66 20 68 69 64 64 65 6e 20 63 6f  ber of hidden co
12840 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 48  lumns */.  u8 iH
12850 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20 20 20  idden;          
12860 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
12870 20 74 68 65 20 66 69 72 73 74 20 68 69 64 64 65   the first hidde
12880 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73  n column */.};.s
12890 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62  truct PragmaVtab
128a0 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74  Cursor {.  sqlit
128b0 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
128c0 61 73 65 3b 20 2f 2a 20 42 61 73 65 20 63 6c 61  ase; /* Base cla
128d0 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72  ss.  Must be fir
128e0 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
128f0 73 74 6d 74 20 2a 70 50 72 61 67 6d 61 3b 20 20  stmt *pPragma;  
12900 20 20 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20    /* The pragma 
12910 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 75 6e  statement to run
12920 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74   */.  sqlite_int
12930 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20  64 iRowid;      
12940 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64  /* Current rowid
12950 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 7a 41 72   */.  char *azAr
12960 67 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  g[2];           
12970 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20  /* Value of the 
12980 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 63 68  argument and sch
12990 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ema */.};../* .*
129a0 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c  * Pragma virtual
129b0 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43   table module xC
129c0 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a  onnect method..*
129d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
129e0 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74 28 0a  gmaVtabConnect(.
129f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
12a00 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69   void *pAux,.  i
12a10 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
12a20 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c  har *const*argv,
12a30 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
12a40 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72  **ppVtab,.  char
12a50 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 63 6f   **pzErr.){.  co
12a60 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a  nst PragmaName *
12a70 70 50 72 61 67 6d 61 20 3d 20 28 63 6f 6e 73 74  pPragma = (const
12a80 20 50 72 61 67 6d 61 4e 61 6d 65 2a 29 70 41 75   PragmaName*)pAu
12a90 78 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  x;.  PragmaVtab 
12aa0 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 69 6e 74  *pTab = 0;.  int
12ab0 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   rc;.  int i, j;
12ac0 0a 20 20 63 68 61 72 20 63 53 65 70 20 3d 20 27  .  char cSep = '
12ad0 28 27 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61  (';.  StrAccum a
12ae0 63 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  cc;.  char zBuf[
12af0 32 30 30 5d 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  200];..  UNUSED_
12b00 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
12b10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12b20 54 45 52 28 61 72 67 76 29 3b 0a 20 20 73 71 6c  TER(argv);.  sql
12b30 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
12b40 28 26 61 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20  (&acc, 0, zBuf, 
12b50 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 30 29  sizeof(zBuf), 0)
12b60 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f  ;.  sqlite3_str_
12b70 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20  appendall(&acc, 
12b80 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 22  "CREATE TABLE x"
12b90 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  );.  for(i=0, j=
12ba0 70 50 72 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e  pPragma->iPragCN
12bb0 61 6d 65 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e  ame; i<pPragma->
12bc0 6e 50 72 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c  nPragCName; i++,
12bd0 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   j++){.    sqlit
12be0 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
12bf0 61 63 63 2c 20 22 25 63 5c 22 25 73 5c 22 22 2c  acc, "%c\"%s\"",
12c00 20 63 53 65 70 2c 20 70 72 61 67 43 4e 61 6d 65   cSep, pragCName
12c10 5b 6a 5d 29 3b 0a 20 20 20 20 63 53 65 70 20 3d  [j]);.    cSep =
12c20 20 27 2c 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20   ',';.  }.  if( 
12c30 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  i==0 ){.    sqli
12c40 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
12c50 26 61 63 63 2c 20 22 28 5c 22 25 73 5c 22 22 2c  &acc, "(\"%s\"",
12c60 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29   pPragma->zName)
12c70 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20  ;.    i++;.  }. 
12c80 20 6a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50   j = 0;.  if( pP
12c90 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
12ca0 26 20 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74  & PragFlg_Result
12cb0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
12cc0 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26  _str_appendall(&
12cd0 61 63 63 2c 20 22 2c 61 72 67 20 48 49 44 44 45  acc, ",arg HIDDE
12ce0 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  N");.    j++;.  
12cf0 7d 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d  }.  if( pPragma-
12d00 3e 6d 50 72 61 67 46 6c 67 20 26 20 28 50 72 61  >mPragFlg & (Pra
12d10 67 46 6c 67 5f 53 63 68 65 6d 61 4f 70 74 7c 50  gFlg_SchemaOpt|P
12d20 72 61 67 46 6c 67 5f 53 63 68 65 6d 61 52 65 71  ragFlg_SchemaReq
12d30 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
12d40 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26  _str_appendall(&
12d50 61 63 63 2c 20 22 2c 73 63 68 65 6d 61 20 48 49  acc, ",schema HI
12d60 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b  DDEN");.    j++;
12d70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
12d80 74 72 5f 61 70 70 65 6e 64 28 26 61 63 63 2c 20  tr_append(&acc, 
12d90 22 29 22 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  ")", 1);.  sqlit
12da0 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
12db0 28 26 61 63 63 29 3b 0a 20 20 61 73 73 65 72 74  (&acc);.  assert
12dc0 28 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c  ( strlen(zBuf) <
12dd0 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20   sizeof(zBuf)-1 
12de0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
12df0 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64  3_declare_vtab(d
12e00 62 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20  b, zBuf);.  if( 
12e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12e20 0a 20 20 20 20 70 54 61 62 20 3d 20 28 50 72 61  .    pTab = (Pra
12e30 67 6d 61 56 74 61 62 2a 29 73 71 6c 69 74 65 33  gmaVtab*)sqlite3
12e40 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50  _malloc(sizeof(P
12e50 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20  ragmaVtab));.   
12e60 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
12e70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12e80 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
12e90 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
12ea0 28 70 54 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66  (pTab, 0, sizeof
12eb0 28 50 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20  (PragmaVtab));. 
12ec0 20 20 20 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65       pTab->pName
12ed0 20 3d 20 70 50 72 61 67 6d 61 3b 0a 20 20 20 20   = pPragma;.    
12ee0 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b    pTab->db = db;
12ef0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 48 69  .      pTab->iHi
12f00 64 64 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20  dden = i;.      
12f10 70 54 61 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20  pTab->nHidden = 
12f20 6a 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  j;.    }.  }else
12f30 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73  {.    *pzErr = s
12f40 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
12f50 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
12f60 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20  msg(db));.  }.. 
12f70 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69   *ppVtab = (sqli
12f80 74 65 33 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a  te3_vtab*)pTab;.
12f90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12fa0 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69  /* .** Pragma vi
12fb0 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
12fc0 6c 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d  le xDisconnect m
12fd0 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
12fe0 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 44   int pragmaVtabD
12ff0 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65  isconnect(sqlite
13000 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
13010 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54    PragmaVtab *pT
13020 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  ab = (PragmaVtab
13030 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74  *)pVtab;.  sqlit
13040 65 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20  e3_free(pTab);. 
13050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13060 4b 3b 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20  K;.}../* Figure 
13070 6f 75 74 20 74 68 65 20 62 65 73 74 20 69 6e 64  out the best ind
13080 65 78 20 74 6f 20 75 73 65 20 74 6f 20 73 65 61  ex to use to sea
13090 72 63 68 20 61 20 70 72 61 67 6d 61 20 76 69 72  rch a pragma vir
130a0 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
130b0 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 74 20  * There are not 
130c0 72 65 61 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78  really any index
130d0 20 63 68 6f 69 63 65 73 2e 20 20 42 75 74 20 77   choices.  But w
130e0 65 20 77 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72  e want to encour
130f0 61 67 65 20 74 68 65 0a 2a 2a 20 71 75 65 72 79  age the.** query
13100 20 70 6c 61 6e 6e 65 72 20 74 6f 20 67 69 76 65   planner to give
13110 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
13120 6f 6e 20 61 73 20 6d 61 6e 79 20 68 69 64 64 65  on as many hidde
13130 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 0a  n parameters as.
13140 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64  ** possible, and
13150 20 65 73 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74   especially on t
13160 68 65 20 66 69 72 73 74 20 68 69 64 64 65 6e 20  he first hidden 
13170 70 61 72 61 6d 65 74 65 72 2e 20 20 53 6f 20 72  parameter.  So r
13180 65 74 75 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20  eturn a.** high 
13190 63 6f 73 74 20 69 66 20 68 69 64 64 65 6e 20 70  cost if hidden p
131a0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 75 6e  arameters are un
131b0 63 6f 6e 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a  constrained..*/.
131c0 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
131d0 61 56 74 61 62 42 65 73 74 49 6e 64 65 78 28 73  aVtabBestIndex(s
131e0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62  qlite3_vtab *tab
131f0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
13200 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b  info *pIdxInfo){
13210 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70  .  PragmaVtab *p
13220 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Tab = (PragmaVta
13230 62 2a 29 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20  b*)tab;.  const 
13240 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
13250 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
13260 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  *pConstraint;.  
13270 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
13280 73 65 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78  seen[2];..  pIdx
13290 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
132a0 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  ost = (double)1;
132b0 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 48 69  .  if( pTab->nHi
132c0 64 64 65 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72  dden==0 ){ retur
132d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20  n SQLITE_OK; }. 
132e0 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   pConstraint = p
132f0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
13300 61 69 6e 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20  aint;.  seen[0] 
13310 3d 20 30 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d  = 0;.  seen[1] =
13320 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
13330 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
13340 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f  traint; i++, pCo
13350 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20  nstraint++){.   
13360 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
13370 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f  ->usable==0 ) co
13380 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
13390 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21  pConstraint->op!
133a0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
133b0 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 20 63 6f  NSTRAINT_EQ ) co
133c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
133d0 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f  pConstraint->iCo
133e0 6c 75 6d 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69  lumn < pTab->iHi
133f0 64 64 65 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  dden ) continue;
13400 0a 20 20 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72  .    j = pConstr
13410 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20  aint->iColumn - 
13420 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20  pTab->iHidden;. 
13430 20 20 20 61 73 73 65 72 74 28 20 6a 20 3c 20 32     assert( j < 2
13440 20 29 3b 0a 20 20 20 20 73 65 65 6e 5b 6a 5d 20   );.    seen[j] 
13450 3d 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28  = i+1;.  }.  if(
13460 20 73 65 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20   seen[0]==0 ){. 
13470 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
13480 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f  imatedCost = (do
13490 75 62 6c 65 29 32 31 34 37 34 38 33 36 34 37 3b  uble)2147483647;
134a0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
134b0 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32  stimatedRows = 2
134c0 31 34 37 34 38 33 36 34 37 3b 0a 20 20 20 20 72  147483647;.    r
134d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
134e0 0a 20 20 7d 0a 20 20 6a 20 3d 20 73 65 65 6e 5b  .  }.  j = seen[
134f0 30 5d 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f  0]-1;.  pIdxInfo
13500 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
13510 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[j].argvIndex 
13520 3d 20 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 1;.  pIdxInfo-
13530 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
13540 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20  e[j].omit = 1;. 
13550 20 69 66 28 20 73 65 65 6e 5b 31 5d 3d 3d 30 20   if( seen[1]==0 
13560 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13570 4f 4b 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  OK;.  pIdxInfo->
13580 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
13590 28 64 6f 75 62 6c 65 29 32 30 3b 0a 20 20 70 49  (double)20;.  pI
135a0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
135b0 64 52 6f 77 73 20 3d 20 32 30 3b 0a 20 20 6a 20  dRows = 20;.  j 
135c0 3d 20 73 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70  = seen[1]-1;.  p
135d0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
135e0 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67  aintUsage[j].arg
135f0 76 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 70 49  vIndex = 2;.  pI
13600 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
13610 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74  intUsage[j].omit
13620 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
13630 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
13640 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
13650 73 6f 72 20 66 6f 72 20 74 68 65 20 70 72 61 67  sor for the prag
13660 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
13670 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
13680 72 61 67 6d 61 56 74 61 62 4f 70 65 6e 28 73 71  ragmaVtabOpen(sq
13690 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
136a0 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  b, sqlite3_vtab_
136b0 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f  cursor **ppCurso
136c0 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  r){.  PragmaVtab
136d0 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20  Cursor *pCsr;.  
136e0 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74  pCsr = (PragmaVt
136f0 61 62 43 75 72 73 6f 72 2a 29 73 71 6c 69 74 65  abCursor*)sqlite
13700 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
13710 2a 70 43 73 72 29 29 3b 0a 20 20 69 66 28 20 70  *pCsr));.  if( p
13720 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Csr==0 ) return 
13730 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13740 6d 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20  memset(pCsr, 0, 
13750 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61  sizeof(PragmaVta
13760 62 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 43 73  bCursor));.  pCs
13770 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20  r->base.pVtab = 
13780 70 56 74 61 62 3b 0a 20 20 2a 70 70 43 75 72 73  pVtab;.  *ppCurs
13790 6f 72 20 3d 20 26 70 43 73 72 2d 3e 62 61 73 65  or = &pCsr->base
137a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
137b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61  E_OK;.}../* Clea
137c0 72 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 66 72  r all content fr
137d0 6f 6d 20 70 72 61 67 6d 61 20 76 69 72 74 75 61  om pragma virtua
137e0 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20  l table cursor. 
137f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
13800 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43  ragmaVtabCursorC
13810 6c 65 61 72 28 50 72 61 67 6d 61 56 74 61 62 43  lear(PragmaVtabC
13820 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20  ursor *pCsr){.  
13830 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
13840 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e  _finalize(pCsr->
13850 70 50 72 61 67 6d 61 29 3b 0a 20 20 70 43 73 72  pPragma);.  pCsr
13860 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20  ->pPragma = 0;. 
13870 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
13880 79 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72  ySize(pCsr->azAr
13890 67 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  g); i++){.    sq
138a0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d  lite3_free(pCsr-
138b0 3e 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  >azArg[i]);.    
138c0 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d  pCsr->azArg[i] =
138d0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c   0;.  }.}../* Cl
138e0 6f 73 65 20 61 20 70 72 61 67 6d 61 20 76 69 72  ose a pragma vir
138f0 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f  tual table curso
13900 72 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r */.static int 
13910 70 72 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 28  pragmaVtabClose(
13920 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
13930 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 50 72 61  sor *cur){.  Pra
13940 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
13950 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
13960 62 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20  bCursor*)cur;.  
13970 70 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  pragmaVtabCursor
13980 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20 73  Clear(pCsr);.  s
13990 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72  qlite3_free(pCsr
139a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
139b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76  TE_OK;.}../* Adv
139c0 61 6e 63 65 20 74 68 65 20 70 72 61 67 6d 61 20  ance the pragma 
139d0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
139e0 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
139f0 20 72 6f 77 20 2a 2f 0a 73 74 61 74 69 63 20 69   row */.static i
13a00 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78  nt pragmaVtabNex
13a10 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  t(sqlite3_vtab_c
13a20 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
13a30 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  or){.  PragmaVta
13a40 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  bCursor *pCsr = 
13a50 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
13a60 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r*)pVtabCursor;.
13a70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13a80 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  E_OK;..  /* Incr
13a90 65 6d 65 6e 74 20 74 68 65 20 78 52 6f 77 69 64  ement the xRowid
13aa0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 70 43 73 72   value */.  pCsr
13ab0 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 61 73  ->iRowid++;.  as
13ac0 73 65 72 74 28 20 70 43 73 72 2d 3e 70 50 72 61  sert( pCsr->pPra
13ad0 67 6d 61 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  gma );.  if( SQL
13ae0 49 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33  ITE_ROW!=sqlite3
13af0 5f 73 74 65 70 28 70 43 73 72 2d 3e 70 50 72 61  _step(pCsr->pPra
13b00 67 6d 61 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  gma) ){.    rc =
13b10 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
13b20 65 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29  e(pCsr->pPragma)
13b30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 50 72 61  ;.    pCsr->pPra
13b40 67 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 72 61  gma = 0;.    pra
13b50 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65  gmaVtabCursorCle
13b60 61 72 28 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20  ar(pCsr);.  }.  
13b70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13b80 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74   .** Pragma virt
13b90 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
13ba0 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e   xFilter method.
13bb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
13bc0 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72 28  ragmaVtabFilter(
13bd0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
13be0 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
13bf0 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e  sor, .  int idxN
13c00 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  um, const char *
13c10 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72  idxStr,.  int ar
13c20 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
13c30 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72  e **argv.){.  Pr
13c40 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a  agmaVtabCursor *
13c50 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74  pCsr = (PragmaVt
13c60 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43  abCursor*)pVtabC
13c70 75 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56  ursor;.  PragmaV
13c80 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61  tab *pTab = (Pra
13c90 67 6d 61 56 74 61 62 2a 29 28 70 56 74 61 62 43  gmaVtab*)(pVtabC
13ca0 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20  ursor->pVtab);. 
13cb0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
13cc0 2c 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  , j;.  StrAccum 
13cd0 61 63 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  acc;.  char *zSq
13ce0 6c 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  l;..  UNUSED_PAR
13cf0 41 4d 45 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a  AMETER(idxNum);.
13d00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
13d10 45 52 28 69 64 78 53 74 72 29 3b 0a 20 20 70 72  ER(idxStr);.  pr
13d20 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c  agmaVtabCursorCl
13d30 65 61 72 28 70 43 73 72 29 3b 0a 20 20 6a 20 3d  ear(pCsr);.  j =
13d40 20 28 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d   (pTab->pName->m
13d50 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
13d60 67 5f 52 65 73 75 6c 74 31 29 21 3d 30 20 3f 20  g_Result1)!=0 ? 
13d70 30 20 3a 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  0 : 1;.  for(i=0
13d80 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 2c 20 6a  ; i<argc; i++, j
13d90 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
13da0 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f  har *zText = (co
13db0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
13dc0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
13dd0 76 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  v[i]);.    asser
13de0 74 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 70  t( j<ArraySize(p
13df0 43 73 72 2d 3e 61 7a 41 72 67 29 20 29 3b 0a 20  Csr->azArg) );. 
13e00 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d     assert( pCsr-
13e10 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 3b 0a  >azArg[j]==0 );.
13e20 20 20 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b      if( zText ){
13e30 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61 7a 41  .      pCsr->azA
13e40 72 67 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 5f  rg[j] = sqlite3_
13e50 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 54  mprintf("%s", zT
13e60 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
13e70 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d  pCsr->azArg[j]==
13e80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
13e90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13ea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13eb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
13ec0 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c 20  AccumInit(&acc, 
13ed0 30 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 64  0, 0, 0, pTab->d
13ee0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
13ef0 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
13f00 48 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  H]);.  sqlite3_s
13f10 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63  tr_appendall(&ac
13f20 63 2c 20 22 50 52 41 47 4d 41 20 22 29 3b 0a 20  c, "PRAGMA ");. 
13f30 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67   if( pCsr->azArg
13f40 5b 31 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  [1] ){.    sqlit
13f50 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
13f60 61 63 63 2c 20 22 25 51 2e 22 2c 20 70 43 73 72  acc, "%Q.", pCsr
13f70 2d 3e 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  ->azArg[1]);.  }
13f80 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61  .  sqlite3_str_a
13f90 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 70  ppendall(&acc, p
13fa0 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 7a 4e 61 6d  Tab->pName->zNam
13fb0 65 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  e);.  if( pCsr->
13fc0 61 7a 41 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20  azArg[0] ){.    
13fd0 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
13fe0 6e 64 66 28 26 61 63 63 2c 20 22 3d 25 51 22 2c  ndf(&acc, "=%Q",
13ff0 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 29   pCsr->azArg[0])
14000 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73  ;.  }.  zSql = s
14010 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
14020 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20 69 66  nish(&acc);.  if
14030 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75  ( zSql==0 ) retu
14040 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
14050 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
14060 70 72 65 70 61 72 65 5f 76 32 28 70 54 61 62 2d  prepare_v2(pTab-
14070 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
14080 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 30  pCsr->pPragma, 0
14090 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
140a0 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72  e(zSql);.  if( r
140b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
140c0 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a      pTab->base.z
140d0 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
140e0 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
140f0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 54  qlite3_errmsg(pT
14100 61 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 72 65  ab->db));.    re
14110 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
14120 65 74 75 72 6e 20 70 72 61 67 6d 61 56 74 61 62  eturn pragmaVtab
14130 4e 65 78 74 28 70 56 74 61 62 43 75 72 73 6f 72  Next(pVtabCursor
14140 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67  );.}../*.** Prag
14150 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
14160 20 6d 6f 64 75 6c 65 20 78 45 6f 66 20 6d 65 74   module xEof met
14170 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
14180 6e 74 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66  nt pragmaVtabEof
14190 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
141a0 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
141b0 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  r){.  PragmaVtab
141c0 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
141d0 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
141e0 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
141f0 20 72 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 70   return (pCsr->p
14200 50 72 61 67 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f  Pragma==0);.}../
14210 2a 20 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65  * The xColumn me
14220 74 68 6f 64 20 73 69 6d 70 6c 79 20 72 65 74 75  thod simply retu
14230 72 6e 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f  rns the correspo
14240 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 72 6f  nding column fro
14250 6d 0a 2a 2a 20 74 68 65 20 50 52 41 47 4d 41 2e  m.** the PRAGMA.
14260 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
14270 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d   pragmaVtabColum
14280 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  n(.  sqlite3_vta
14290 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
142a0 75 72 73 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65  ursor, .  sqlite
142b0 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
142c0 0a 20 20 69 6e 74 20 69 0a 29 7b 0a 20 20 50 72  .  int i.){.  Pr
142d0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a  agmaVtabCursor *
142e0 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74  pCsr = (PragmaVt
142f0 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43  abCursor*)pVtabC
14300 75 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56  ursor;.  PragmaV
14310 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61  tab *pTab = (Pra
14320 67 6d 61 56 74 61 62 2a 29 28 70 56 74 61 62 43  gmaVtab*)(pVtabC
14330 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20  ursor->pVtab);. 
14340 20 69 66 28 20 69 3c 70 54 61 62 2d 3e 69 48 69   if( i<pTab->iHi
14350 64 64 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  dden ){.    sqli
14360 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
14370 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f  (ctx, sqlite3_co
14380 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d  lumn_value(pCsr-
14390 3e 70 50 72 61 67 6d 61 2c 20 69 29 29 3b 0a 20  >pPragma, i));. 
143a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
143b0 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
143c0 63 74 78 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67  ctx, pCsr->azArg
143d0 5b 69 2d 70 54 61 62 2d 3e 69 48 69 64 64 65 6e  [i-pTab->iHidden
143e0 5d 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e  ],-1,SQLITE_TRAN
143f0 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 72 65  SIENT);.  }.  re
14400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14410 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61  }../* .** Pragma
14420 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
14430 6f 64 75 6c 65 20 78 52 6f 77 69 64 20 6d 65 74  odule xRowid met
14440 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
14450 6e 74 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77  nt pragmaVtabRow
14460 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  id(sqlite3_vtab_
14470 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
14480 73 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36  sor, sqlite_int6
14490 34 20 2a 70 29 7b 0a 20 20 50 72 61 67 6d 61 56  4 *p){.  PragmaV
144a0 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20  tabCursor *pCsr 
144b0 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  = (PragmaVtabCur
144c0 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72  sor*)pVtabCursor
144d0 3b 0a 20 20 2a 70 20 3d 20 70 43 73 72 2d 3e 69  ;.  *p = pCsr->i
144e0 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  Rowid;.  return 
144f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14500 20 54 68 65 20 70 72 61 67 6d 61 20 76 69 72 74   The pragma virt
14510 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  ual table object
14520 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
14530 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
14540 70 72 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65  pragmaVtabModule
14550 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20   = {.  0,       
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
14580 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145a0 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 63    /* xCreate - c
145b0 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 2a 2f  reate a table */
145c0 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e  .  pragmaVtabCon
145d0 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  nect,           
145e0 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f  /* xConnect - co
145f0 6e 6e 65 63 74 20 74 6f 20 61 6e 20 65 78 69 73  nnect to an exis
14600 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ting table */.  
14610 70 72 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e  pragmaVtabBestIn
14620 64 65 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  dex,         /* 
14630 78 42 65 73 74 49 6e 64 65 78 20 2d 20 44 65 74  xBestIndex - Det
14640 65 72 6d 69 6e 65 20 73 65 61 72 63 68 20 73 74  ermine search st
14650 72 61 74 65 67 79 20 2a 2f 0a 20 20 70 72 61 67  rategy */.  prag
14660 6d 61 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74  maVtabDisconnect
14670 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73  ,        /* xDis
14680 63 6f 6e 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e  connect - Discon
14690 6e 65 63 74 20 66 72 6f 6d 20 61 20 74 61 62 6c  nect from a tabl
146a0 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146c0 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20      /* xDestroy 
146d0 2d 20 44 72 6f 70 20 61 20 74 61 62 6c 65 20 2a  - Drop a table *
146e0 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4f 70  /.  pragmaVtabOp
146f0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
14700 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e   /* xOpen - open
14710 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70   a cursor */.  p
14720 72 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 2c 20  ragmaVtabClose, 
14730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14740 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20  Close - close a 
14750 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67  cursor */.  prag
14760 6d 61 56 74 61 62 46 69 6c 74 65 72 2c 20 20 20  maVtabFilter,   
14770 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
14780 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20  ter - configure 
14790 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73  scan constraints
147a0 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
147b0 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  Next,           
147c0 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64     /* xNext - ad
147d0 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a  vance a cursor *
147e0 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 45 6f  /.  pragmaVtabEo
147f0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
14800 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 70 72   /* xEof */.  pr
14810 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 2c 20  agmaVtabColumn, 
14820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
14830 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74  olumn - read dat
14840 61 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61  a */.  pragmaVta
14850 62 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  bRowid,         
14860 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20      /* xRowid - 
14870 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30  read data */.  0
14880 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
148a0 55 70 64 61 74 65 20 2d 20 77 72 69 74 65 20 64  Update - write d
148b0 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ata */.  0,     
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148d0 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20        /* xBegin 
148e0 2d 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74  - begin transact
148f0 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ion */.  0,     
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d        /* xSync -
14920 20 73 79 6e 63 20 74 72 61 6e 73 61 63 74 69 6f   sync transactio
14930 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d      /* xCommit -
14960 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74   commit transact
14970 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ion */.  0,     
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14990 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61        /* xRollba
149a0 63 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72  ck - rollback tr
149b0 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30  ansaction */.  0
149c0 2c 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 20 20 20 2f 2a 20 78              /* x
149e0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66  FindFunction - f
149f0 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
14a00 69 6e 67 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ing */.  0,     
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65        /* xRename
14a30 20 2d 20 72 65 6e 61 6d 65 20 74 68 65 20 74 61   - rename the ta
14a40 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ble */.  0,     
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f        /* xSavepo
14a70 69 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  int */.  0,     
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a90 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73        /* xReleas
14aa0 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
14ad0 54 6f 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  To */.  0       
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14af0 20 20 20 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e       /* xShadowN
14b00 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ame */.};../*.**
14b10 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
14b20 20 7a 54 61 62 4e 61 6d 65 20 69 73 20 72 65 61   zTabName is rea
14b30 6c 6c 79 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lly the name of 
14b40 61 20 70 72 61 67 6d 61 2e 20 20 49 66 20 69 74  a pragma.  If it
14b50 20 69 73 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 67   is,.** then reg
14b60 69 73 74 65 72 20 61 6e 20 65 70 6f 6e 79 6d 6f  ister an eponymo
14b70 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
14b80 20 66 6f 72 20 74 68 61 74 20 70 72 61 67 6d 61   for that pragma
14b90 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61   and return.** a
14ba0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
14bb0 4d 6f 64 75 6c 65 20 6f 62 6a 65 63 74 20 66 6f  Module object fo
14bc0 72 20 74 68 65 20 6e 65 77 20 76 69 72 74 75 61  r the new virtua
14bd0 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75  l table..*/.Modu
14be0 6c 65 20 2a 73 71 6c 69 74 65 33 50 72 61 67 6d  le *sqlite3Pragm
14bf0 61 56 74 61 62 52 65 67 69 73 74 65 72 28 73 71  aVtabRegister(sq
14c00 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
14c10 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
14c20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d   const PragmaNam
14c30 65 20 2a 70 4e 61 6d 65 3b 0a 20 20 61 73 73 65  e *pName;.  asse
14c40 72 74 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  rt( sqlite3_strn
14c50 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61  icmp(zName, "pra
14c60 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 3b 0a  gma_", 7)==0 );.
14c70 20 20 70 4e 61 6d 65 20 3d 20 70 72 61 67 6d 61    pName = pragma
14c80 4c 6f 63 61 74 65 28 7a 4e 61 6d 65 2b 37 29 3b  Locate(zName+7);
14c90 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20  .  if( pName==0 
14ca0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
14cb0 28 20 28 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46  ( (pName->mPragF
14cc0 6c 67 20 26 20 28 50 72 61 67 46 6c 67 5f 52 65  lg & (PragFlg_Re
14cd0 73 75 6c 74 30 7c 50 72 61 67 46 6c 67 5f 52 65  sult0|PragFlg_Re
14ce0 73 75 6c 74 31 29 29 3d 3d 30 20 29 20 72 65 74  sult1))==0 ) ret
14cf0 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
14d00 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
14d10 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a  (&db->aModule, z
14d20 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65  Name)==0 );.  re
14d30 74 75 72 6e 20 73 71 6c 69 74 65 33 56 74 61 62  turn sqlite3Vtab
14d40 43 72 65 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c  CreateModule(db,
14d50 20 7a 4e 61 6d 65 2c 20 26 70 72 61 67 6d 61 56   zName, &pragmaV
14d60 74 61 62 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64  tabModule, (void
14d70 2a 29 70 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a  *)pName, 0);.}..
14d80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14d90 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
14da0 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  LE */..#endif /*
14db0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41   SQLITE_OMIT_PRA
14dc0 47 4d 41 20 2a 2f 0a                             GMA */.