/ Hex Artifact Content
Login

Artifact 9e31ee952cd70b6976a73967a93e4305cbb54ddd92112af8f0b46eb81006b10c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  K );.    while( 
1ba0: 28 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20  (n--) > 0 ){.   
1bb0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
1bc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bd0: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
1be0: 6c 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20  lags(pDb->pBt,. 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76  (pDb->safety_lev
1c10: 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  el & PAGER_SYNCH
1c20: 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 0a 20 20 20  RONOUS_MASK).   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50  | (db->flags & P
1c50: 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29  AGER_FLAGS_MASK)
1c60: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1c70: 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20    pDb++;.    }. 
1c80: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
1c90: 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72 46  ine setAllPagerF
1ca0: 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d 6f  lags(X)  /* no-o
1cb0: 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  p */.#endif.../*
1cc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75 6d  .** Return a hum
1cd0: 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d 65  an-readable name
1ce0: 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   for a constrain
1cf0: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63 74  t resolution act
1d00: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
1d10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
1d20: 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20 63  IGN_KEY.static c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69 6f  onst char *actio
1d40: 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e 29  nName(u8 action)
1d50: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1d60: 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68 28  zName;.  switch(
1d70: 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 63   action ){.    c
1d80: 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a 20  ase OE_SetNull: 
1d90: 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e 55   zName = "SET NU
1da0: 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  LL";        brea
1db0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 53  k;.    case OE_S
1dc0: 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20 3d  etDflt:  zName =
1dd0: 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b 20   "SET DEFAULT"; 
1de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1df0: 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a 20  ase OE_Cascade: 
1e00: 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41 44   zName = "CASCAD
1e10: 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61  E";         brea
1e20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52  k;.    case OE_R
1e30: 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20 3d  estrict: zName =
1e40: 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20 20   "RESTRICT";    
1e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
1e60: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
1e70: 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43 54   zName = "NO ACT
1e80: 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20 20  ION";  .        
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1ea0: 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f 45  sert( action==OE
1eb0: 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b 0a  _None ); break;.
1ec0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
1ed0: 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  me;.}.#endif.../
1ee0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
1ef0: 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
1f00: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
1f10: 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63 6f  URNALMODE_XXX co
1f20: 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69 6e  nstants.** defin
1f30: 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20 54  ed in pager.h. T
1f40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1f50: 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69 61  urns the associa
1f60: 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a 2a  ted lowercase.**
1f70: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e 61   journal-mode na
1f80: 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  me..*/.const cha
1f90: 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  r *sqlite3Journa
1fa0: 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65 4d  lModename(int eM
1fb0: 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ode){.  static c
1fc0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d 6f  har * const azMo
1fd0: 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20  deName[] = {.   
1fe0: 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72 73   "delete", "pers
1ff0: 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74 72  ist", "off", "tr
2000: 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72 79  uncate", "memory
2010: 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ".#ifndef SQLITE
2020: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 2c  _OMIT_WAL.     ,
2030: 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20 20   "wal".#endif.  
2040: 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  };.  assert( PAG
2050: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
2060: 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61 73  ELETE==0 );.  as
2070: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
2080: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 3d  NALMODE_PERSIST=
2090: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
20a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20b0: 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61 73  E_OFF==2 );.  as
20c0: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
20d0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
20e0: 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==3 );.  assert(
20f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2100: 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b 0a  DE_MEMORY==4 );.
2110: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2120: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 3d  JOURNALMODE_WAL=
2130: 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =5 );.  assert( 
2140: 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f 64  eMode>=0 && eMod
2150: 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 4d  e<=ArraySize(azM
2160: 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20 69  odeName) );..  i
2170: 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79 53  f( eMode==ArrayS
2180: 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29 20  ize(azModeName) 
2190: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
21a0: 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65 5b  turn azModeName[
21b0: 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eMode];.}../*.**
21c0: 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d 61   Locate a pragma
21d0: 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61 4e   in the aPragmaN
21e0: 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ame[] array..*/.
21f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72 61  static const Pra
2200: 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61 4c  gmaName *pragmaL
2210: 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72  ocate(const char
2220: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
2230: 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d 20  upr, lwr, mid = 
2240: 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20 30  0, rc;.  lwr = 0
2250: 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79 53  ;.  upr = ArrayS
2260: 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65 29  ize(aPragmaName)
2270: 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77 72  -1;.  while( lwr
2280: 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69 64  <=upr ){.    mid
2290: 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a   = (lwr+upr)/2;.
22a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22b0: 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  _stricmp(zName, 
22c0: 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64 5d  aPragmaName[mid]
22d0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
22e0: 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a   rc==0 ) break;.
22f0: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a      if( rc<0 ){.
2300: 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64 20        upr = mid 
2310: 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 1;.    }else{.
2320: 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 20        lwr = mid 
2330: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
2340: 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72 20   return lwr>upr 
2350: 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e 61  ? 0 : &aPragmaNa
2360: 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  me[mid];.}../*.*
2370: 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75 74  * Helper subrout
2380: 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20 69  ine for PRAGMA i
2390: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a 0a  ntegrity_check:.
23a0: 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  **.** Generate c
23b0: 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61 20  ode to output a 
23c0: 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72 65  single-column re
23d0: 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 61 20  sult row with a 
23e0: 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
23f0: 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20 72  string held in r
2400: 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63 72  egister 3.  Decr
2410: 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74  ement the result
2420: 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73 74   count in regist
2430: 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c 74  er 1.** and halt
2440: 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   if the maximum 
2450: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
2460: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
2470: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
2480: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
2490: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24a0: 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61 64  be *v){.  int ad
24b0: 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dr;.  sqlite3Vdb
24c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
24d0: 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b 0a  sultRow, 3, 1);.
24e0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
24f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2500: 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69 74  _IfPos, 1, sqlit
2510: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2520: 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56 64  r(v)+2, 1);.  Vd
2530: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2540: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2550: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a  p0(v, OP_Halt);.
2560: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
2570: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
2580: 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  a pragma stateme
2590: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67  nt.  .**.** Prag
25a0: 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73 20  mas are of this 
25b0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
25c0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
25d0: 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a  ]id [= value].**
25e0: 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69  .** The identifi
25f0: 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  er might also be
2600: 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20   a string.  The 
2610: 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
2620: 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69  g, and.** identi
2630: 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65  fier, or a numbe
2640: 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67  r.  If minusFlag
2650: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2660: 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  he value is.** a
2670: 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61 73   number that was
2680: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
2690: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a  inus sign..**.**
26a0: 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69 64   If the left sid
26b0: 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e 69  e is "database.i
26c0: 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73 20  d" then pId1 is 
26d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
26e0: 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69 73  e.** and pId2 is
26f0: 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68 65   the id.  If the
2700: 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a 75   left side is ju
2710: 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49 64  st "id" then pId
2720: 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20 61  1 is the.** id a
2730: 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20 65  nd pId2 is any e
2740: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  mpty string..*/.
2750: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61 67  void sqlite3Prag
2760: 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ma(.  Parse *pPa
2770: 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70  rse, .  Token *p
2780: 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20 46  Id1,        /* F
2790: 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73 63  irst part of [sc
27a0: 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a  hema.]id field *
27b0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c  /.  Token *pId2,
27c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
27d0: 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  d part of [schem
27e0: 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72 20  a.]id field, or 
27f0: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
2800: 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a  *pValue,      /*
2810: 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75   Token for <valu
2820: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2830: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20 20   int minusFlag  
2840: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2850: 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63 65  a '-' sign prece
2860: 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29  ded <value> */.)
2870: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20  {.  char *zLeft 
2880: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2890: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
28a0: 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a  -8 string <id> *
28b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74  /.  char *zRight
28c0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
28d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
28e0: 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75 65  -8 string <value
28f0: 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  >, or NULL */.  
2900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
2910: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  = 0;   /* The da
2920: 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
2930: 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20   Token *pId;    
2940: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2950: 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e  er to <id> token
2960: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63 6e   */.  char *aFcn
2970: 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20  tl[4];       /* 
2980: 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49  Argument to SQLI
2990: 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20  TE_FCNTL_PRAGMA 
29a0: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
29c0: 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66 6f  atabase index fo
29d0: 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a  r <database> */.
29e0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * return value f
2a10: 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  orm SQLITE_FCNTL
2a20: 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c  _PRAGMA */.  sql
2a30: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
2a40: 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68 65  e->db;    /* The
2a50: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2a60: 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44  tion */.  Db *pD
2a70: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2a80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
2a90: 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20  ecific database 
2aa0: 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20 2a  being pragmaed *
2ab0: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
2ac0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
2ad0: 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61 72  rse);  /* Prepar
2ae0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
2af0: 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61    const PragmaNa
2b00: 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f  me *pPragma;   /
2b10: 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a  * The pragma */.
2b20: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
2b30: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
2b40: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76  dbeRunOnlyOnce(v
2b50: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  );.  pParse->nMe
2b60: 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74  m = 2;..  /* Int
2b70: 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68 65  erpret the [sche
2b80: 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68 65  ma.] part of the
2b90: 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e   pragma statemen
2ba0: 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20 20  t. iDb is the.  
2bb0: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
2bc0: 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70 72  database this pr
2bd0: 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61 70  agma is being ap
2be0: 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e 61  plied to in db.a
2bf0: 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d  Db[]. */.  iDb =
2c00: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
2c10: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64 31  ame(pParse, pId1
2c20: 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a 20  , pId2, &pId);. 
2c30: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
2c40: 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  urn;.  pDb = &db
2c50: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f  ->aDb[iDb];..  /
2c60: 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64 61  * If the temp da
2c70: 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
2c80: 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64  explicitly named
2c90: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
2ca0: 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61  .  ** pragma, ma
2cb0: 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f 70  ke sure it is op
2cc0: 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  en. .  */.  if( 
2cd0: 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  iDb==1 && sqlite
2ce0: 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
2cf0: 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  e(pParse) ){.   
2d00: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
2d10: 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 4e  zLeft = sqlite3N
2d20: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2d30: 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c   pId);.  if( !zL
2d40: 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  eft ) return;.  
2d50: 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
2d60: 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71  .    zRight = sq
2d70: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
2d80: 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29 3b   "-%T", pValue);
2d90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52  .  }else{.    zR
2da0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e 61  ight = sqlite3Na
2db0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
2dc0: 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  pValue);.  }..  
2dd0: 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b 0a  assert( pId2 );.
2de0: 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e    zDb = pId2->n>
2df0: 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  0 ? pDb->zDbSNam
2e00: 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  e : 0;.  if( sql
2e10: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2e20: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52 41  arse, SQLITE_PRA
2e30: 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67  GMA, zLeft, zRig
2e40: 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  ht, zDb) ){.    
2e50: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
2e60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20  .  }..  /* Send 
2e70: 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  an SQLITE_FCNTL_
2e80: 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74  PRAGMA file-cont
2e90: 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65 72  rol to the under
2ea0: 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63  lying VFS.  ** c
2eb0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20 69  onnection.  If i
2ec0: 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
2ed0: 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  _OK, then assume
2ee0: 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20 20   that the VFS.  
2ef0: 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20 70  ** handled the p
2f00: 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72 61  ragma and genera
2f10: 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61  te a no-op prepa
2f20: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
2f30: 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
2f40: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32  NTATION-OF: R-12
2f50: 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65 76  238-55120 Whenev
2f60: 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61 74  er a PRAGMA stat
2f70: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
2f80: 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f  .  ** an SQLITE_
2f90: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c  FCNTL_PRAGMA fil
2fa0: 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e  e control is sen
2fb0: 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73 71  t to the open sq
2fc0: 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20  lite3_file.  ** 
2fd0: 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
2fe0: 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ding to the data
2ff0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68 69  base file to whi
3000: 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20 20  ch the pragma.  
3010: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 66  ** statement ref
3020: 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ers..  **.  ** I
3030: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
3040: 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38 20  : R-29875-31678 
3050: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
3060: 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
3070: 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c  _PRAGMA.  ** fil
3080: 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20  e control is an 
3090: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
30a0: 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63 68  s to strings (ch
30b0: 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20 74  ar**) in which t
30c0: 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65  he.  ** second e
30d0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 72  lement of the ar
30e0: 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ray is the name 
30f0: 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61 6e  of the pragma an
3100: 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a 2a  d the third.  **
3110: 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65 20   element is the 
3120: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
3130: 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69  pragma or NULL i
3140: 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61 73  f the pragma has
3150: 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e   no.  ** argumen
3160: 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c  t..  */.  aFcntl
3170: 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74  [0] = 0;.  aFcnt
3180: 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20  l[1] = zLeft;.  
3190: 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67  aFcntl[2] = zRig
31a0: 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20  ht;.  aFcntl[3] 
31b0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  = 0;.  db->busyH
31c0: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
31d0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
31e0: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
31f0: 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
3200: 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69  NTL_PRAGMA, (voi
3210: 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66  d*)aFcntl);.  if
3220: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3230: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
3240: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
3250: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
3260: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
3270: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
3280: 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c  , aFcntl[0], SQL
3290: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
32a0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
32b0: 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30  Text(v, aFcntl[0
32c0: 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
32d0: 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b  free(aFcntl[0]);
32e0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61  .    goto pragma
32f0: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
3300: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc!=SQLITE_NOTFO
3310: 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 61  UND ){.    if( a
3320: 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20  Fcntl[0] ){.    
3330: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3340: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
3350: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
3360: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
3370: 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d  Fcntl[0]);.    }
3380: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
3390: 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  r++;.    pParse-
33a0: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f  >rc = rc;.    go
33b0: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
33c0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
33d0: 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74 68  the pragma in th
33e0: 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a  e lookup table *
33f0: 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70 72  /.  pPragma = pr
3400: 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74  agmaLocate(zLeft
3410: 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61  );.  if( pPragma
3420: 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67 6d  ==0 ) goto pragm
3430: 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  a_out;..  /* Mak
3440: 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
3450: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c 6f  ase schema is lo
3460: 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61 67  aded if the prag
3470: 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ma requires that
3480: 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61 67   */.  if( (pPrag
3490: 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  ma->mPragFlg & P
34a0: 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d  ragFlg_NeedSchem
34b0: 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  a)!=0 ){.    if(
34c0: 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
34d0: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
34e0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
34f0: 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
3500: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
3510: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 70 72 61  mn names for pra
3520: 67 6d 61 73 20 74 68 61 74 20 72 65 74 75 72 6e  gmas that return
3530: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66   results */.  if
3540: 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61  ( (pPragma->mPra
3550: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
3560: 6f 43 6f 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20  oColumns)==0 .  
3570: 20 26 26 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d   && ((pPragma->m
3580: 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
3590: 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30  g_NoColumns1)==0
35a0: 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20   || zRight==0). 
35b0: 20 29 7b 0a 20 20 20 20 73 65 74 50 72 61 67 6d   ){.    setPragm
35c0: 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d  aResultColumnNam
35d0: 65 73 28 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a  es(v, pPragma);.
35e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
35f0: 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
3600: 65 20 70 72 61 67 6d 61 20 68 61 6e 64 6c 65 72  e pragma handler
3610: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 50   */.  switch( pP
3620: 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 20  ragma->ePragTyp 
3630: 29 7b 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e  ){.  .#if !defin
3640: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
3650: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 26 26  AGER_PRAGMAS) &&
3660: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3670: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
3680: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ).  /*.  **  PRA
3690: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66  GMA [schema.]def
36a0: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a  ault_cache_size.
36b0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
36c0: 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61  hema.]default_ca
36d0: 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a  che_size=N.  **.
36e0: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
36f0: 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20  orm reports the 
3700: 63 75 72 72 65 6e 74 20 70 65 72 73 69 73 74 65  current persiste
3710: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
3720: 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63  he.  ** page cac
3730: 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76 61  he size.  The va
3740: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
3750: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
3760: 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73  er of.  ** pages
3770: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
3780: 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  he.  The second 
3790: 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20 74  form sets both t
37a0: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
37b0: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
37c0: 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 65  value and the pe
37d0: 72 73 69 73 74 65 6e 74 20 70 61 67 65 20 63 61  rsistent page ca
37e0: 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a 20  che size value. 
37f0: 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68   ** stored in th
3800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3810: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72  .  **.  ** Older
3820: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
3830: 69 74 65 20 77 6f 75 6c 64 20 73 65 74 20 74 68  ite would set th
3840: 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 20  e default cache 
3850: 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e  size to a.  ** n
3860: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 74  egative number t
3870: 6f 20 69 6e 64 69 63 61 74 65 20 73 79 6e 63 68  o indicate synch
3880: 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65  ronous=OFF.  The
3890: 73 65 20 64 61 79 73 2c 20 73 79 6e 63 68 72 6f  se days, synchro
38a0: 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77  nous.  ** is alw
38b0: 61 79 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c  ays on by defaul
38c0: 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  t regardless of 
38d0: 74 68 65 20 73 69 67 6e 20 6f 66 20 74 68 65 20  the sign of the 
38e0: 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a 20 20  default cache.  
38f0: 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74 20 63 6f  ** size.  But co
3900: 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b 65 20 74  ntinue to take t
3910: 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75  he absolute valu
3920: 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  e of the default
3930: 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65   cache.  ** size
3940: 20 6f 66 20 68 69 73 74 6f 72 69 63 61 6c 20 63   of historical c
3950: 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 20 20  ompatibility..  
3960: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
3970: 70 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  p_DEFAULT_CACHE_
3980: 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 74 61 74  SIZE: {.    stat
3990: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e  ic const int iLn
39a0: 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c   = VDBE_OFFSET_L
39b0: 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74  INENO(2);.    st
39c0: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
39d0: 70 4c 69 73 74 20 67 65 74 43 61 63 68 65 53 69  pList getCacheSi
39e0: 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ze[] = {.      {
39f0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
3a00: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
3a10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2a            /* 0 *
3a30: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61  /.      { OP_Rea
3a40: 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20  dCookie,  0, 1, 
3a50: 20 20 20 20 20 20 20 42 54 52 45 45 5f 44 45 46         BTREE_DEF
3a60: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d  AULT_CACHE_SIZE}
3a70: 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  ,  /* 1 */.     
3a80: 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20   { OP_IfPos,    
3a90: 20 20 20 31 2c 20 38 2c 20 20 20 20 20 20 20 20     1, 8,        
3aa0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  0},.      { OP_I
3ab0: 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 32  nteger,     0, 2
3ac0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3ad0: 20 20 20 7b 20 4f 50 5f 53 75 62 74 72 61 63 74     { OP_Subtract
3ae0: 2c 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20 20  ,    1, 2,      
3af0: 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    1},.      { OP
3b00: 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c  _IfPos,       1,
3b10: 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   8,        0},. 
3b20: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
3b30: 72 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20  r,     0, 1,    
3b40: 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20 20 20      0},         
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 6 */.      { 
3b70: 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20  OP_Noop,        
3b80: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
3b90: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75  .      { OP_Resu
3ba0: 6c 74 52 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20  ltRow,   1, 1,  
3bb0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
3bc0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  .    VdbeOp *aOp
3bd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3be0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
3bf0: 62 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  b);.    if( !zRi
3c00: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ght ){.      pPa
3c10: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a  rse->nMem += 2;.
3c20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3c30: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
3c40: 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79  equired(v, Array
3c50: 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a  Size(getCacheSiz
3c60: 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d  e));.      aOp =
3c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3c80: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
3c90: 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29  ze(getCacheSize)
3ca0: 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 2c 20  , getCacheSize, 
3cb0: 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  iLn);.      if( 
3cc0: 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f  ONLY_IF_REALLOC_
3cd0: 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29  STRESS(aOp==0) )
3ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f   break;.      aO
3cf0: 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[0].p1 = iDb;. 
3d00: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d       aOp[1].p1 =
3d10: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
3d20: 36 5d 2e 70 31 20 3d 20 53 51 4c 49 54 45 5f 44  6].p1 = SQLITE_D
3d30: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
3d40: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
3d50: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 73      int size = s
3d60: 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 73  qlite3AbsInt32(s
3d70: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
3d80: 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
3d90: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
3da0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
3db0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
3dc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
3dd0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
3de0: 69 44 62 2c 20 42 54 52 45 45 5f 44 45 46 41 55  iDb, BTREE_DEFAU
3df0: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 73  LT_CACHE_SIZE, s
3e00: 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ize);.      asse
3e10: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3e20: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3e30: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20  Db, 0) );.      
3e40: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
3e50: 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b  che_size = size;
3e60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
3e70: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
3e80: 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70  pDb->pBt, pDb->p
3e90: 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69  Schema->cache_si
3ea0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ze);.    }.    b
3eb0: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
3ec0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3ed0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 26  _PAGER_PRAGMAS &
3ee0: 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  & !SQLITE_OMIT_D
3ef0: 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69  EPRECATED */..#i
3f00: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3f10: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
3f20: 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  GMAS).  /*.  ** 
3f30: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
3f40: 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20  ]page_size.  ** 
3f50: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
3f60: 5d 70 61 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a  ]page_size=N.  *
3f70: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
3f80: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
3f90: 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
3fa0: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64  g for the.  ** d
3fb0: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
3fc0: 65 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 65  e in bytes.  The
3fd0: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74   second form set
3fe0: 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  s the.  ** datab
3ff0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 76 61  ase page size va
4000: 6c 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  lue.  The value 
4010: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 73 65 74 20  can only be set 
4020: 69 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  if.  ** the data
4030: 62 61 73 65 20 68 61 73 20 6e 6f 74 20 79 65 74  base has not yet
4040: 20 62 65 65 6e 20 63 72 65 61 74 65 64 2e 0a 20   been created.. 
4050: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
4060: 79 70 5f 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a  yp_PAGE_SIZE: {.
4070: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
4080: 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61   pDb->pBt;.    a
4090: 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b  ssert( pBt!=0 );
40a0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
40b0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69   ){.      int si
40c0: 7a 65 20 3d 20 41 4c 57 41 59 53 28 70 42 74 29  ze = ALWAYS(pBt)
40d0: 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   ? sqlite3BtreeG
40e0: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 29 20  etPageSize(pBt) 
40f0: 3a 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  : 0;.      retur
4100: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69  nSingleInt(v, si
4110: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
4120: 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20        /* Malloc 
4130: 6d 61 79 20 66 61 69 6c 20 77 68 65 6e 20 73 65  may fail when se
4140: 74 74 69 6e 67 20 74 68 65 20 70 61 67 65 2d 73  tting the page-s
4150: 69 7a 65 2c 20 61 73 20 74 68 65 72 65 20 69 73  ize, as there is
4160: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20   an internal.   
4170: 20 20 20 2a 2a 20 62 75 66 66 65 72 20 74 68 61     ** buffer tha
4180: 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f 64 75  t the pager modu
4190: 6c 65 20 72 65 73 69 7a 65 73 20 75 73 69 6e 67  le resizes using
41a0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
41b0: 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ()..      */.   
41c0: 20 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73     db->nextPages
41d0: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74 6f  ize = sqlite3Ato
41e0: 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
41f0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
4200: 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
4210: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
4220: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4230: 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  ,-1,0) ){.      
4240: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
4250: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t(db);.      }. 
4260: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
4270: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
4280: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4290: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20  secure_delete.  
42a0: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
42b0: 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65 74  ma.]secure_delet
42c0: 65 3d 4f 4e 2f 4f 46 46 2f 46 41 53 54 0a 20 20  e=ON/OFF/FAST.  
42d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
42e0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
42f0: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
4300: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
4310: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 66 6c  secure_delete fl
4320: 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  ag.  The second 
4330: 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65  form changes the
4340: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
4350: 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69 6e 67   ** flag setting
4360: 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74 68 65   and reports the
4370: 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a 2f   new value..  */
4380: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4390: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20 7b  SECURE_DELETE: {
43a0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
43b0: 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20  = pDb->pBt;.    
43c0: 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20 20  int b = -1;.    
43d0: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
43e0: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
43f0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
4400: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 52  lite3_stricmp(zR
4410: 69 67 68 74 2c 20 22 66 61 73 74 22 29 3d 3d 30  ight, "fast")==0
4420: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 20 3d 20   ){.        b = 
4430: 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
4440: 20 20 20 20 20 20 20 20 62 20 3d 20 73 71 6c 69          b = sqli
4450: 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
4460: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
4470: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4480: 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e  pId2->n==0 && b>
4490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
44a0: 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
44b0: 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20  =0; ii<db->nDb; 
44c0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
44d0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
44e0: 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b  eDelete(db->aDb[
44f0: 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20  ii].pBt, b);.   
4500: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
4510: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
4520: 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74 2c  ecureDelete(pBt,
4530: 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53   b);.    returnS
4540: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b 0a  ingleInt(v, b);.
4550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4560: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
4570: 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70  A [schema.]max_p
4580: 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20  age_count.  **  
4590: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
45a0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e  max_page_count=N
45b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
45c0: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
45d0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  s the current se
45e0: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
45f0: 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  ** maximum numbe
4600: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
4610: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
4620: 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f    The .  ** seco
4630: 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74 73  nd form attempts
4640: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73 20   to change this 
4650: 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20  setting.  Both. 
4660: 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72 6e   ** forms return
4670: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
4680: 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ting..  **.  ** 
4690: 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  The absolute val
46a0: 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64 2e  ue of N is used.
46b0: 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75    This is undocu
46c0: 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68 74  mented and might
46d0: 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54  .  ** change.  T
46e0: 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20  he only purpose 
46f0: 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  is to provide an
4700: 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65 73   easy way to tes
4710: 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  t.  ** the sqlit
4720: 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75 6e  e3AbsInt32() fun
4730: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ction..  **.  **
4740: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4750: 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a  .]page_count.  *
4760: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
4770: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
4780: 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  s in the specifi
4790: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
47a0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
47b0: 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20  _PAGE_COUNT: {. 
47c0: 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20 20     int iReg;.   
47d0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
47e0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
47f0: 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67 20   iDb);.    iReg 
4800: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
4810: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
4820: 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30  3Tolower(zLeft[0
4830: 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20  ])=='p' ){.     
4840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4850: 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f 75  p2(v, OP_Pagecou
4860: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b 0a  nt, iDb, iReg);.
4870: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4880: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4890: 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63 6e  p3(v, OP_MaxPgcn
48a0: 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a 20  t, iDb, iReg, . 
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62         sqlite3Ab
48d0: 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41 74  sInt32(sqlite3At
48e0: 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20 20  oi(zRight)));.  
48f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
4900: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4910: 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67 2c  ResultRow, iReg,
4920: 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a   1);.    break;.
4930: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
4940: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4950: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a  locking_mode.  *
4960: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4970: 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  a.]locking_mode 
4980: 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73  = (normal|exclus
4990: 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ive).  */.  case
49a0: 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47   PragTyp_LOCKING
49b0: 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e  _MODE: {.    con
49c0: 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  st char *zRet = 
49d0: 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e  "normal";.    in
49e0: 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63  t eMode = getLoc
49f0: 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74 29  kingMode(zRight)
4a00: 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d  ;..    if( pId2-
4a10: 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d  >n==0 && eMode==
4a20: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
4a30: 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20 20  E_QUERY ){.     
4a40: 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41 47   /* Simple "PRAG
4a50: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b  MA locking_mode;
4a60: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  " statement. Thi
4a70: 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f 72  s is a query for
4a80: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
4a90: 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f  rrent default lo
4aa0: 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69 63  cking mode (whic
4ab0: 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  h may be differe
4ac0: 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  nt to.      ** t
4ad0: 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
4ae0: 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
4af0: 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  base)..      */.
4b00: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64 62        eMode = db
4b10: 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a  ->dfltLockMode;.
4b20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4b30: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
4b40: 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e        if( pId2->
4b50: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
4b60: 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  /* This indicate
4b70: 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62 61  s that no databa
4b80: 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65 63  se name was spec
4b90: 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20 20  ified as part.  
4ba0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
4bb0: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20  PRAGMA command. 
4bc0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
4bd0: 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75   locking-mode mu
4be0: 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
4bf0: 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61   set on all atta
4c00: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c 20  ched databases, 
4c10: 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d  as well as the m
4c20: 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20 20  ain db file..   
4c30: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
4c40: 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c  ** Also, the sql
4c50: 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64  ite3.dfltLockMod
4c60: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  e variable is se
4c70: 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20  t so that.      
4c80: 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71 75    ** any subsequ
4c90: 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20 64  ently attached d
4ca0: 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75 73  atabases also us
4cb0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  e the specified.
4cc0: 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69          ** locki
4cd0: 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20  ng mode..       
4ce0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
4cf0: 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
4d00: 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62  rt(pDb==&db->aDb
4d10: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
4d20: 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e  r(ii=2; ii<db->n
4d30: 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  Db; ii++){.     
4d40: 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
4d50: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
4d60: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29  db->aDb[ii].pBt)
4d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
4d80: 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
4d90: 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f 64  ode(pPager, eMod
4da0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
4db0: 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f        db->dfltLo
4dc0: 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  ckMode = (u8)eMo
4dd0: 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
4de0: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
4df0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62  e3BtreePager(pDb
4e00: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65 4d  ->pBt);.      eM
4e10: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ode = sqlite3Pag
4e20: 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50  erLockingMode(pP
4e30: 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  ager, eMode);.  
4e40: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
4e50: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4e60: 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
4e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
4e80: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
4e90: 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
4ea0: 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d  VE );.    if( eM
4eb0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
4ec0: 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
4ed0: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d   ){.      zRet =
4ee0: 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20 20   "exclusive";.  
4ef0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
4f00: 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65 74  ngleText(v, zRet
4f10: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
4f20: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  }..  /*.  **  PR
4f30: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f  AGMA [schema.]jo
4f40: 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20  urnal_mode.  ** 
4f50: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4f60: 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a  ]journal_mode =.
4f70: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
4f80: 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65 74            (delet
4f90: 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74 72  e|persist|off|tr
4fa0: 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77 61  uncate|memory|wa
4fb0: 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63 61  l|off).  */.  ca
4fc0: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
4fd0: 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 69  AL_MODE: {.    i
4fe0: 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  nt eMode;       
4ff0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
5000: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
5010: 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  _XXX symbols */.
5020: 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
5030: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
5040: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69 66  unter */..    if
5050: 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( zRight==0 ){. 
5060: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
5070: 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70   is no "=MODE" p
5080: 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67 6d  art of the pragm
5090: 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66 6f  a, do a query fo
50a0: 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  r the.      ** c
50b0: 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20  urrent mode */. 
50c0: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
50d0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
50e0: 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  UERY;.    }else{
50f0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
5100: 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20  r *zMode;.      
5110: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
5120: 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 3b  trlen30(zRight);
5130: 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64 65  .      for(eMode
5140: 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c  =0; (zMode = sql
5150: 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e  ite3JournalModen
5160: 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20  ame(eMode))!=0; 
5170: 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20  eMode++){.      
5180: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
5190: 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d  NICmp(zRight, zM
51a0: 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65  ode, n)==0 ) bre
51b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
51c0: 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a    if( !zMode ){.
51d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
51e0: 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 64  e "=MODE" part d
51f0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
5200: 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20  y known journal 
5210: 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  mode,.        **
5220: 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72 79   then do a query
5230: 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   */.        eMod
5240: 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
5250: 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20 20  LMODE_QUERY;.   
5260: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5270: 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  f( eMode==PAGER_
5280: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
5290: 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30 20  Y && pId2->n==0 
52a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ){.      /* Conv
52b0: 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  ert "PRAGMA jour
52c0: 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20 22  nal_mode" into "
52d0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72  PRAGMA main.jour
52e0: 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20 20  nal_mode" */.   
52f0: 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20 20     iDb = 0;.    
5300: 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20    pId2->n = 1;. 
5310: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
5320: 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30  db->nDb-1; ii>=0
5330: 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  ; ii--){.      i
5340: 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  f( db->aDb[ii].p
5350: 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c  Bt && (ii==iDb |
5360: 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b  | pId2->n==0) ){
5370: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5380: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
5390: 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71   ii);.        sq
53a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
53b0: 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64  v, OP_JournalMod
53c0: 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29  e, ii, 1, eMode)
53d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
53e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
53f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
5400: 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20  ltRow, 1, 1);.  
5410: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
5420: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
5430: 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c  [schema.]journal
5440: 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a 2a  _size_limit.  **
5450: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
5460: 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c  .]journal_size_l
5470: 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  imit=N.  **.  **
5480: 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65 20   Get or set the 
5490: 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72 6f  size limit on ro
54a0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
54b0: 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  iles..  */.  cas
54c0: 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41  e PragTyp_JOURNA
54d0: 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b 0a  L_SIZE_LIMIT: {.
54e0: 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
54f0: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
5500: 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Pager(pDb->pBt);
5510: 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20  .    i64 iLimit 
5520: 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a 52  = -2;.    if( zR
5530: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
5540: 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
5550: 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d  64(zRight, &iLim
5560: 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  it);.      if( i
5570: 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d 69  Limit<-1 ) iLimi
5580: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  t = -1;.    }.  
5590: 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74    iLimit = sqlit
55a0: 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
55b0: 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c 20  zeLimit(pPager, 
55c0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65 74  iLimit);.    ret
55d0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
55e0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72 65  iLimit);.    bre
55f0: 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20  ak;.  }..#endif 
5600: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  /* SQLITE_OMIT_P
5610: 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  AGER_PRAGMAS */.
5620: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
5630: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f  MA [schema.]auto
5640: 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50 52  _vacuum.  **  PR
5650: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75  AGMA [schema.]au
5660: 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a 2a  to_vacuum=N.  **
5670: 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65 74  .  ** Get or set
5680: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
5690: 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74 6f  e database 'auto
56a0: 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65 74  -vacuum' paramet
56b0: 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  er..  ** The val
56c0: 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20 30  ue is one of:  0
56d0: 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20 49   NONE 1 FULL 2 I
56e0: 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f 0a  NCREMENTAL.  */.
56f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5700: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
5710: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41 55   case PragTyp_AU
5720: 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20  TO_VACUUM: {.   
5730: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
5740: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  b->pBt;.    asse
5750: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
5760: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
5770: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
5780: 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65  gleInt(v, sqlite
5790: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
57a0: 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20 7d  uum(pBt));.    }
57b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
57c0: 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f 56  eAuto = getAutoV
57d0: 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a 20  acuum(zRight);. 
57e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41 75       assert( eAu
57f0: 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c 3d  to>=0 && eAuto<=
5800: 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  2 );.      db->n
5810: 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75 38  extAutovac = (u8
5820: 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f 2a  )eAuto;.      /*
5830: 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61 63   Call SetAutoVac
5840: 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e 69  uum() to set ini
5850: 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74 65  tialize the inte
5860: 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20 20  rnal auto and.  
5870: 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63 75      ** incr-vacu
5880: 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20 69  um flags. This i
5890: 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61  s required in ca
58a0: 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  se this connecti
58b0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61  on.      ** crea
58c0: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
58d0: 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d 70   file. It is imp
58e0: 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20 69  ortant that it i
58f0: 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20 20  s created.      
5900: 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76 61  ** as an auto-va
5910: 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62 2e  cuum capable db.
5920: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5930: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
5940: 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70  eSetAutoVacuum(p
5950: 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20 20  Bt, eAuto);.    
5960: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5970: 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d 31  _OK && (eAuto==1
5980: 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29 7b   || eAuto==2) ){
5990: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  .        /* When
59a0: 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75 74   setting the aut
59b0: 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 6f  o_vacuum mode to
59c0: 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20 6f   either "full" o
59d0: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 69  r .        ** "i
59e0: 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72 69  ncremental", wri
59f0: 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
5a00: 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20 64  meta[6] in the d
5a10: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20  atabase.        
5a20: 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65 20  ** file. Before 
5a30: 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61 5b  writing to meta[
5a40: 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20 6d  6], check that m
5a50: 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65 73  eta[3] indicates
5a60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
5a70: 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20   this really is 
5a80: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  an auto-vacuum c
5a90: 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65 2e  apable database.
5aa0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
5ab0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
5ac0: 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f   int iLn = VDBE_
5ad0: 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29  OFFSET_LINENO(2)
5ae0: 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63  ;.        static
5af0: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
5b00: 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20 7b  t setMeta6[] = {
5b10: 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  .          { OP_
5b20: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
5b30: 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20 20  0,         1,   
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d                0}
5b50: 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20  ,    /* 0 */.   
5b60: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64         { OP_Read
5b70: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20 20  Cookie,     0,  
5b80: 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20         1,       
5b90: 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f    BTREE_LARGEST_
5ba0: 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20 20  ROOT_PAGE},.    
5bb0: 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20 20        { OP_If,  
5bc0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20 20             1,   
5bd0: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
5be0: 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20           0},    
5bf0: 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 2 */.        
5c00: 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20    { OP_Halt,    
5c10: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
5c20: 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20 20  , OE_Abort,     
5c30: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33       0},    /* 3
5c40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20   */.          { 
5c50: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20  OP_SetCookie,   
5c60: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42 54     0,         BT
5c70: 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d 2c  REE_INCR_VACUUM,
5c80: 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a   0},    /* 4 */.
5c90: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
5ca0: 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a     VdbeOp *aOp;.
5cb0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
5cc0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
5cd0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
5ce0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5cf0: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
5d00: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
5d10: 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29 29  ySize(setMeta6))
5d20: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d 20  ;.        aOp = 
5d30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d40: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
5d50: 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65 74  e(setMeta6), set
5d60: 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20 20  Meta6, iLn);.   
5d70: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
5d80: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
5d90: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
5da0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  .        aOp[0].
5db0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5dc0: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
5dd0: 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32  b;.        aOp[2
5de0: 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b 0a  ].p2 = iAddr+4;.
5df0: 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e 70          aOp[4].p
5e00: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20  1 = iDb;.       
5e10: 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41 75   aOp[4].p3 = eAu
5e20: 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  to - 1;.        
5e30: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
5e40: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
5e50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5e60: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
5e70: 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  f..  /*.  **  PR
5e80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 6e  AGMA [schema.]in
5e90: 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
5ea0: 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f  (N).  **.  ** Do
5eb0: 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63 72   N steps of incr
5ec0: 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69 6e  emental vacuumin
5ed0: 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 2e  g on a database.
5ee0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
5ef0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
5f00: 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61 67  CUUM.  case Prag
5f10: 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c 5f  Typ_INCREMENTAL_
5f20: 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69 6e  VACUUM: {.    in
5f30: 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b 0a  t iLimit, addr;.
5f40: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d 3d      if( zRight==
5f50: 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65 74  0 || !sqlite3Get
5f60: 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 69  Int32(zRight, &i
5f70: 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69 74  Limit) || iLimit
5f80: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 69  <=0 ){.      iLi
5f90: 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66 66  mit = 0x7fffffff
5fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5fb0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
5fc0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
5fd0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
5fe0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5ff0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c 69   OP_Integer, iLi
6000: 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64 64  mit, 1);.    add
6010: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
6020: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63 72  ddOp1(v, OP_Incr
6030: 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56 64  Vacuum, iDb); Vd
6040: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6060: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp1(v, OP_Resul
6070: 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73 71  tRow, 1);.    sq
6080: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6090: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c  v, OP_AddImm, 1,
60a0: 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   -1);.    sqlite
60b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
60c0: 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64 72  P_IfPos, 1, addr
60d0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
60e0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
60f0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
6100: 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ddr);.    break;
6110: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
6120: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6130: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 20  _PAGER_PRAGMAS. 
6140: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
6150: 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f   [schema.]cache_
6160: 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d  size.  **  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 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
6190: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
61a0: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
61b0: 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69  rent local setti
61c0: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
61d0: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e  page cache size.
61e0: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
61f0: 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a   sets the local.
6200: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
6210: 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66 20  size value.  If 
6220: 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74 68  N is positive th
6230: 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a 20  en that is the. 
6240: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
6250: 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
6260: 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74  .  If N is negat
6270: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ive, then the.  
6280: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
6290: 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20 73  es is adjusted s
62a0: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
62b0: 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74   uses -N kibibyt
62c0: 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72  es.  ** of memor
62d0: 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  y..  */.  case P
62e0: 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49 5a  ragTyp_CACHE_SIZ
62f0: 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E: {.    assert(
6300: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
6310: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
6320: 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21   0) );.    if( !
6330: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
6340: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
6350: 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  v, pDb->pSchema-
6360: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
6370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
6380: 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65  nt size = sqlite
6390: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20  3Atoi(zRight);. 
63a0: 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d       pDb->pSchem
63b0: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  a->cache_size = 
63c0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
63d0: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
63e0: 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20 70  Size(pDb->pBt, p
63f0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63  Db->pSchema->cac
6400: 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  he_size);.    }.
6410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6420: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6430: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6440: 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52 41  _spill.  **  PRA
6450: 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d  GMA cache_spill=
6460: 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50 52  BOOLEAN.  **  PR
6470: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61  AGMA [schema.]ca
6480: 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a 2a  che_spill=N.  **
6490: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
64a0: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
64b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73   current local s
64c0: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
64d0: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
64e0: 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20 73  pill size. The s
64f0: 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e 73  econd form turns
6500: 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e 0a   cache spill on.
6510: 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57 68    ** or off.  Wh
6520: 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63 68  en turnning cach
6530: 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65 20  e spill on, the 
6540: 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  size is set to t
6550: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
6560: 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68 65  cache_size.  The
6570: 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74 73   third form sets
6580: 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74 68   a spill size th
6590: 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 64  at.  ** may be d
65a0: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74 68  ifferent form th
65b0: 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  e cache size..  
65c0: 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69 74  ** If N is posit
65d0: 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69 73  ive then that is
65e0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
65f0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6600: 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69 73   cache.  If N is
6610: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
6620: 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
6630: 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a 75  of pages is adju
6640: 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  sted so that the
6650: 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20 6b   cache uses -N k
6660: 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f 66  ibibytes.  ** of
6670: 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20   memory..  **.  
6680: 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
6690: 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c 20   of cache_spill 
66a0: 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74 68  pages is less th
66b0: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
66c0: 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a 65  .  ** cache_size
66d0: 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c 6c   pages, no spill
66e0: 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69 6c  ing occurs until
66f0: 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 20   the page count 
6700: 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68 65  exceeds.  ** the
6710: 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   number of cache
6720: 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20 2a  _size pages..  *
6730: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68 65  *.  ** The cache
6740: 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20 73  _spill=BOOLEAN s
6750: 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20 74  etting applies t
6760: 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 73  o all attached s
6770: 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f 74  chemas,.  ** not
6780: 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d 61   just the schema
6790: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f   specified..  */
67a0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
67b0: 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a 20  CACHE_SPILL: {. 
67c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
67d0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
67e0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
67f0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
6800: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
6810: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20 20  SingleInt(v,.   
6820: 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73        (db->flags
6830: 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53   & SQLITE_CacheS
6840: 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20 0a  pill)==0 ? 0 : .
6850: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6860: 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c  te3BtreeSetSpill
6870: 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30 29  Size(pDb->pBt,0)
6880: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6890: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 31      int size = 1
68a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
68b0: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67  te3GetInt32(zRig
68c0: 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20 20  ht, &size) ){.  
68d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
68e0: 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70  eeSetSpillSize(p
68f0: 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b 0a  Db->pBt, size);.
6900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6910: 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  ( sqlite3GetBool
6920: 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a 65  ean(zRight, size
6930: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
6940: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
6950: 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a  ITE_CacheSpill;.
6960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6970: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
6980: 3d 20 7e 53 51 4c 49 54 45 5f 43 61 63 68 65 53  = ~SQLITE_CacheS
6990: 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pill;.      }.  
69a0: 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46      setAllPagerF
69b0: 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  lags(db);.    }.
69c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
69d0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
69e0: 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f  A [schema.]mmap_
69f0: 73 69 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a  size(N).  **.  *
6a00: 2a 20 55 73 65 64 20 74 6f 20 73 65 74 20 6d 61  * Used to set ma
6a10: 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74  pping size limit
6a20: 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 73 69  . The mapping si
6a30: 7a 65 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a  ze limit is.  **
6a40: 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 74   used to limit t
6a50: 68 65 20 61 67 67 72 65 67 61 74 65 20 73 69 7a  he aggregate siz
6a60: 65 20 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  e of all memory 
6a70: 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20 6f  mapped regions o
6a80: 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  f the.  ** datab
6a90: 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 69  ase file. If thi
6aa0: 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73  s parameter is s
6ab0: 65 74 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  et to zero, then
6ac0: 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a   memory mapping.
6ad0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64    ** is not used
6ae0: 20 61 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69   at all.  If N i
6af0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
6b00: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 65 6d   the default mem
6b10: 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d  ory map.  ** lim
6b20: 69 74 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  it determined by
6b30: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
6b40: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
6b50: 41 50 5f 53 49 5a 45 29 20 69 73 20 73 65 74 2e  AP_SIZE) is set.
6b60: 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 61 6d 65  .  ** The parame
6b70: 74 65 72 20 4e 20 69 73 20 6d 65 61 73 75 72 65  ter N is measure
6b80: 64 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a  d in bytes..  **
6b90: 0a 20 20 2a 2a 20 54 68 69 73 20 76 61 6c 75 65  .  ** This value
6ba0: 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54   is advisory.  T
6bb0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46  he underlying VF
6bc0: 53 20 69 73 20 66 72 65 65 20 74 6f 20 6d 65 6d  S is free to mem
6bd0: 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20  ory map.  ** as 
6be0: 6c 69 74 74 6c 65 20 6f 72 20 61 73 20 6d 75 63  little or as muc
6bf0: 68 20 61 73 20 69 74 20 77 61 6e 74 73 2e 20 20  h as it wants.  
6c00: 45 78 63 65 70 74 2c 20 69 66 20 4e 20 69 73 20  Except, if N is 
6c10: 73 65 74 20 74 6f 20 30 20 74 68 65 6e 20 74 68  set to 0 then th
6c20: 65 0a 20 20 2a 2a 20 75 70 70 65 72 20 6c 61 79  e.  ** upper lay
6c30: 65 72 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 69  ers will never i
6c40: 6e 76 6f 6b 65 20 74 68 65 20 78 46 65 74 63 68  nvoke the xFetch
6c50: 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20 74   interfaces to t
6c60: 68 65 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63  he VFS..  */.  c
6c70: 61 73 65 20 50 72 61 67 54 79 70 5f 4d 4d 41 50  ase PragTyp_MMAP
6c80: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c  _SIZE: {.    sql
6c90: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23  ite3_int64 sz;.#
6ca0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
6cb0: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61 73  AP_SIZE>0.    as
6cc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
6cd0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
6ce0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
6cf0: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
6d00: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
6d10: 20 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65    sqlite3DecOrHe
6d20: 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26  xToI64(zRight, &
6d30: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  sz);.      if( s
6d40: 7a 3c 30 20 29 20 73 7a 20 3d 20 73 71 6c 69 74  z<0 ) sz = sqlit
6d50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
6d60: 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28  zMmap;.      if(
6d70: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62   pId2->n==0 ) db
6d80: 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20  ->szMmap = sz;. 
6d90: 20 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e       for(ii=db->
6da0: 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69  nDb-1; ii>=0; ii
6db0: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
6dc0: 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74   db->aDb[ii].pBt
6dd0: 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20   && (ii==iDb || 
6de0: 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20  pId2->n==0) ){. 
6df0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6e00: 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69  BtreeSetMmapLimi
6e10: 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  t(db->aDb[ii].pB
6e20: 74 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  t, sz);.        
6e30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6e40: 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20      sz = -1;.   
6e50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
6e60: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
6e70: 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
6e80: 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29  _MMAP_SIZE, &sz)
6e90: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d  ;.#else.    sz =
6ea0: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   0;.    rc = SQL
6eb0: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20  ITE_OK;.#endif. 
6ec0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6ed0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
6ee0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
6ef0: 20 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20   sz);.    }else 
6f00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e  if( rc!=SQLITE_N
6f10: 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  OTFOUND ){.     
6f20: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6f30: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
6f40: 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  c = rc;.    }.  
6f50: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
6f60: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
6f70: 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a   temp_store.  **
6f80: 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73     PRAGMA temp_s
6f90: 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74 22  tore = "default"
6fa0: 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22  |"memory"|"file"
6fb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
6fc0: 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63  n or set the loc
6fd0: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
6fe0: 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e  temp_store flag.
6ff0: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
7000: 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
7010: 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68  does not make ch
7020: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73  anges to the dis
7030: 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  k file and the d
7040: 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75  efault.  ** valu
7050: 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72  e will be restor
7060: 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ed the next time
7070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
7080: 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20   opened..  **.  
7090: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
70a0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
70b0: 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70  the library comp
70c0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
70d0: 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64   to.  ** overrid
70e0: 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a 20  e this setting. 
70f0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
7100: 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b  yp_TEMP_STORE: {
7110: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
7120: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7130: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d  SingleInt(v, db-
7140: 3e 74 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20  >temp_store);.  
7150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
7160: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
7170: 28 70 50 61 72 73 65 2c 20 7a 52 69 67 68 74 29  (pParse, zRight)
7180: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
7190: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
71a0: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
71b0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a  store_directory.
71c0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65    **   PRAGMA te
71d0: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
71e0: 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f  ry = ""|"directo
71f0: 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20  ry_name".  **.  
7200: 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74  ** Return or set
7210: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
7220: 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f   of the temp_sto
7230: 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61  re_directory fla
7240: 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
7250: 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73  * the value sets
7260: 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72 65   a specific dire
7270: 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64  ctory to be used
7280: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
7290: 69 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69  iles..  ** Setti
72a0: 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72  ng to a null str
72b0: 69 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20 74  ing reverts to t
72c0: 68 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70 6f  he default tempo
72d0: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 73  rary directory s
72e0: 65 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74  earch..  ** If t
72f0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
7300: 72 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ry is changed, t
7310: 68 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54 65  hen invalidateTe
7320: 6d 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a  mpStorage..  **.
7330: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7340: 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44  Typ_TEMP_STORE_D
7350: 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20  IRECTORY: {.    
7360: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
7370: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
7380: 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33  eText(v, sqlite3
7390: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
73a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
73b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
73c0: 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a  _WSD.      if( z
73d0: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
73e0: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
73f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7400: 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56  3OsAccess(db->pV
7410: 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49  fs, zRight, SQLI
7420: 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
7430: 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  ITE, &res);.    
7440: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7450: 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20  TE_OK || res==0 
7460: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7470: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7480: 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74  rse, "not a writ
7490: 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29  able directory")
74a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
74b0: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20   pragma_out;.   
74c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
74d0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
74e0: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20  TEMP_STORE==0.  
74f0: 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f       || (SQLITE_
7500: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26  TEMP_STORE==1 &&
7510: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c   db->temp_store<
7520: 3d 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 53  =1).       || (S
7530: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
7540: 3d 3d 32 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f  ==2 && db->temp_
7550: 73 74 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20 20  store==1).      
7560: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  ){.        inval
7570: 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65  idateTempStorage
7580: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7590: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
75a0: 66 72 65 65 28 73 71 6c 69 74 65 33 5f 74 65 6d  free(sqlite3_tem
75b0: 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
75c0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
75d0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
75e0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
75f0: 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ory = sqlite3_mp
7600: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67  rintf("%s", zRig
7610: 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ht);.      }else
7620: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7630: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
7640: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
7650: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7660: 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d  MIT_WSD */.    }
7670: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
7680: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7690: 49 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  IN.  /*.  **   P
76a0: 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65  RAGMA data_store
76b0: 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20  _directory.  ** 
76c0: 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74    PRAGMA data_st
76d0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ore_directory = 
76e0: 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61  ""|"directory_na
76f0: 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  me".  **.  ** Re
7700: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
7710: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  local value of t
7720: 68 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  he data_store_di
7730: 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43  rectory flag.  C
7740: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
7750: 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73 70   value sets a sp
7760: 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72 79  ecific directory
7770: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
7780: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 74  database files t
7790: 68 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73 70  hat.  ** were sp
77a0: 65 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72  ecified with a r
77b0: 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
77c0: 2e 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20  .  Setting to a 
77d0: 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65  null string reve
77e0: 72 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  rts.  ** to the 
77f0: 64 65 66 61 75 6c 74 20 64 61 74 61 62 61 73 65  default database
7800: 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69 63   directory, whic
7810: 68 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  h for database f
7820: 69 6c 65 73 20 73 70 65 63 69 66 69 65 64 20 77  iles specified w
7830: 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74  ith.  ** a relat
7840: 69 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70 72  ive path will pr
7850: 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65 64 20  obably be based 
7860: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  on the current d
7870: 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65  irectory for the
7880: 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20  .  ** process.  
7890: 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 70  Database file sp
78a0: 65 63 69 66 69 65 64 20 77 69 74 68 20 61 6e 20  ecified with an 
78b0: 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61 72  absolute path ar
78c0: 65 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a 20  e not impacted. 
78d0: 20 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74 74   ** by this sett
78e0: 69 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ing, regardless 
78f0: 6f 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20 20  of its value..  
7900: 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  **.  */.  case P
7910: 72 61 67 54 79 70 5f 44 41 54 41 5f 53 54 4f 52  ragTyp_DATA_STOR
7920: 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20  E_DIRECTORY: {. 
7930: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
7940: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
7950: 6e 67 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69  ngleText(v, sqli
7960: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
7970: 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ry);.    }else{.
7980: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7990: 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66  MIT_WSD.      if
79a0: 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20  ( zRight[0] ){. 
79b0: 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a         int res;.
79c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
79d0: 69 74 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d  ite3OsAccess(db-
79e0: 3e 70 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53  >pVfs, zRight, S
79f0: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
7a00: 44 57 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20  DWRITE, &res);. 
7a10: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
7a20: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d  QLITE_OK || res=
7a30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7a40: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7a50: 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77  pParse, "not a w
7a60: 72 69 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72  ritable director
7a70: 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  y");.          g
7a80: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
7a90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7aa0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
7ab0: 66 72 65 65 28 73 71 6c 69 74 65 33 5f 64 61 74  free(sqlite3_dat
7ac0: 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  a_directory);.  
7ad0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
7ae0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
7af0: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
7b00: 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ory = sqlite3_mp
7b10: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67  rintf("%s", zRig
7b20: 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ht);.      }else
7b30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7b40: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7b50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
7b60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7b70: 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d  MIT_WSD */.    }
7b80: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
7b90: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
7ba0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
7bb0: 47 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a  G_STYLE.  /*.  *
7bc0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
7bd0: 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  ma.]lock_proxy_f
7be0: 69 6c 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ile.  **   PRAGM
7bf0: 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f  A [schema.]lock_
7c00: 70 72 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61  proxy_file = ":a
7c10: 75 74 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65  uto:"|"lock_file
7c20: 5f 70 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a  _path".  **.  **
7c30: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
7c40: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
7c50: 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20  lock_proxy_file 
7c60: 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a  flag.  Changing.
7c70: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73    ** the value s
7c80: 65 74 73 20 61 20 73 70 65 63 69 66 69 63 20 66  ets a specific f
7c90: 69 6c 65 20 74 6f 20 62 65 20 75 73 65 64 20 66  ile to be used f
7ca0: 6f 72 20 64 61 74 61 62 61 73 65 20 61 63 63 65  or database acce
7cb0: 73 73 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20  ss locks..  **. 
7cc0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
7cd0: 79 70 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49  yp_LOCK_PROXY_FI
7ce0: 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a  LE: {.    if( !z
7cf0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 50  Right ){.      P
7d00: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
7d10: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
7d20: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
7d30: 20 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66 69    char *proxy_fi
7d40: 6c 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  le_path = NULL;.
7d50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
7d60: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
7d70: 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
7d80: 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
7d90: 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
7da0: 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49  Hint(pFile, SQLI
7db0: 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
7dc0: 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20  FILE, .         
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 20 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61    &proxy_file_pa
7df0: 74 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  th);.      retur
7e00: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 70  nSingleText(v, p
7e10: 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b  roxy_file_path);
7e20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7e30: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
7e40: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
7e50: 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20  ger(pDb->pBt);. 
7e60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
7e70: 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  e *pFile = sqlit
7e80: 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
7e90: 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  er);.      int r
7ea0: 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  es;.      if( zR
7eb0: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
7ec0: 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73     res=sqlite3Os
7ed0: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c  FileControl(pFil
7ee0: 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
7ef0: 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20  CKPROXYFILE, .  
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f20: 20 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20     zRight);.    
7f30: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
7f40: 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73     res=sqlite3Os
7f50: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c  FileControl(pFil
7f60: 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
7f70: 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20  CKPROXYFILE, .  
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20     NULL);.      
7fb0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 21  }.      if( res!
7fc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7fe0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
7ff0: 61 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f 63  ailed to set loc
8000: 6b 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a  k proxy file");.
8010: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61          goto pra
8020: 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  gma_out;.      }
8030: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
8040: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
8050: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
8060: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20  CKING_STYLE */  
8070: 20 20 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20      .    .  /*. 
8080: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
8090: 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75  hema.]synchronou
80a0: 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  s.  **   PRAGMA 
80b0: 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f  [schema.]synchro
80c0: 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d  nous=OFF|ON|NORM
80d0: 41 4c 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20  AL|FULL|EXTRA.  
80e0: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
80f0: 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  r set the local 
8100: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e  value of the syn
8110: 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20  chronous flag.  
8120: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
8130: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f  e local value do
8140: 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e  es not make chan
8150: 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ges to the disk 
8160: 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a  file and the.  *
8170: 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * default value 
8180: 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64  will be restored
8190: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
81a0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 20  he database is. 
81b0: 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f   ** opened..  */
81c0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
81d0: 53 59 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20  SYNCHRONOUS: {. 
81e0: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
81f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
8200: 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e  ngleInt(v, pDb->
8210: 73 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b  safety_level-1);
8220: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8230: 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43    if( !db->autoC
8240: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
8250: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8260: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
8270: 20 20 20 20 20 20 22 53 61 66 65 74 79 20 6c 65        "Safety le
8280: 76 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  vel may not be c
8290: 68 61 6e 67 65 64 20 69 6e 73 69 64 65 20 61 20  hanged inside a 
82a0: 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20  transaction");. 
82b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
82c0: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db!=1 ){.       
82d0: 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28 67   int iLevel = (g
82e0: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52  etSafetyLevel(zR
82f0: 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26 20 50  ight,0,1)+1) & P
8300: 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
8310: 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20 69  _MASK;.        i
8320: 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20 69  f( iLevel==0 ) i
8330: 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20  Level = 1;.     
8340: 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
8350: 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20  evel = iLevel;. 
8360: 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53 79 6e         pDb->bSyn
8370: 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  cSet = 1;.      
8380: 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61    setAllPagerFla
8390: 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  gs(db);.      }.
83a0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
83b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
83c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
83d0: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
83e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
83f0: 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20 20  _FLAG_PRAGMAS.  
8400: 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4c 41  case PragTyp_FLA
8410: 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  G: {.    if( zRi
8420: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
8430: 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74 43  setPragmaResultC
8440: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50  olumnNames(v, pP
8450: 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20 72 65  ragma);.      re
8460: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
8470: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 70 50   (db->flags & pP
8480: 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20  ragma->iArg)!=0 
8490: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
84a0: 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 70      int mask = p
84b0: 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20  Pragma->iArg;   
84c0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73   /* Mask of bits
84d0: 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65 61 72   to set or clear
84e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  . */.      if( d
84f0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
8500: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
8510: 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70 6f  oreign key suppo
8520: 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e  rt may not be en
8530: 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62 6c 65  abled or disable
8540: 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20  d while not.    
8550: 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63      ** in auto-c
8560: 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a  ommit mode.  */.
8570: 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d 20          mask &= 
8580: 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e  ~(SQLITE_Foreign
8590: 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Keys);.      }.#
85a0: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
85b0: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
85c0: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68      if( db->auth
85d0: 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54  .authLevel==UAUT
85e0: 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20  H_User ){.      
85f0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
8600: 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72  w non-admin user
8610: 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  s to modify the 
8620: 73 63 68 65 6d 61 20 61 72 62 69 74 72 61 72 69  schema arbitrari
8630: 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61  ly */.        ma
8640: 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57  sk &= ~(SQLITE_W
8650: 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20 20 20  riteSchema);.   
8660: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
8670: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
8680: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c  tBoolean(zRight,
8690: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64   0) ){.        d
86a0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  b->flags |= mask
86b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
86c0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
86d0: 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
86e0: 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c     if( mask==SQL
86f0: 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 20 64  ITE_DeferFKs ) d
8700: 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
8710: 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ons = 0;.      }
8720: 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20  ..      /* Many 
8730: 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72 61 67  of the flag-prag
8740: 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65 20 63  mas modify the c
8750: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
8760: 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20 20 20   the SQL .      
8770: 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e  ** compiler (eg.
8780: 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e   count_changes).
8790: 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f 64   So add an opcod
87a0: 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a  e to expire all.
87b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
87c0: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  d SQL statements
87d0: 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69 6e 67   after modifying
87e0: 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75 65 2e   a pragma value.
87f0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
8800: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8810: 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b  0(v, OP_Expire);
8820: 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67  .      setAllPag
8830: 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20  erFlags(db);.   
8840: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
8850: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8860: 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41  TE_OMIT_FLAG_PRA
8870: 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GMAS */..#ifndef
8880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
8890: 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a  EMA_PRAGMAS.  /*
88a0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
88b0: 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c 65  able_info(<table
88c0: 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  >).  **.  ** Ret
88d0: 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
88e0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
88f0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   of the named ta
8900: 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 73  ble. The columns
8910: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 74   of.  ** the ret
8920: 75 72 6e 65 64 20 64 61 74 61 20 73 65 74 20 61  urned data set a
8930: 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 69  re:.  **.  ** ci
8940: 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  d:        Column
8950: 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20 66 72   id (numbered fr
8960: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
8970: 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20 30 29  , starting at 0)
8980: 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20  .  ** name:     
8990: 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20    Column name.  
89a0: 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20 20 43  ** type:       C
89b0: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
89c0: 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74  n type..  ** not
89d0: 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20 69 66  null:    True if
89e0: 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20 70   'NOT NULL' is p
89f0: 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64 65  art of column de
8a00: 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 64  claration.  ** d
8a10: 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65 20 64  flt_value: The d
8a20: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
8a30: 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20   the column, if 
8a40: 61 6e 79 2e 0a 20 20 2a 2a 20 70 6b 3a 20 20 20  any..  ** pk:   
8a50: 20 20 20 20 20 20 4e 6f 6e 2d 7a 65 72 6f 20 66        Non-zero f
8a60: 6f 72 20 50 4b 20 66 69 65 6c 64 73 2e 0a 20 20  or PK fields..  
8a70: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
8a80: 70 5f 54 41 42 4c 45 5f 49 4e 46 4f 3a 20 69 66  p_TABLE_INFO: if
8a90: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
8aa0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
8ab0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
8ac0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
8ad0: 65 2c 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 2c  e, LOCATE_NOERR,
8ae0: 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20   zRight, zDb);. 
8af0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
8b00: 20 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b 0a 20       int i, k;. 
8b10: 20 20 20 20 20 69 6e 74 20 6e 48 69 64 64 65 6e       int nHidden
8b20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 43 6f 6c 75   = 0;.      Colu
8b30: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  mn *pCol;.      
8b40: 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
8b50: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
8b60: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
8b70: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
8b80: 36 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  6;.      sqlite3
8b90: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
8ba0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
8bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77       sqlite3View
8bc0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
8bd0: 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
8be0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f      for(i=0, pCo
8bf0: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c  l=pTab->aCol; i<
8c00: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  pTab->nCol; i++,
8c10: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
8c20: 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f    if( IsHiddenCo
8c30: 6c 75 6d 6e 28 70 43 6f 6c 29 20 29 7b 0a 20 20  lumn(pCol) ){.  
8c40: 20 20 20 20 20 20 20 20 6e 48 69 64 64 65 6e 2b          nHidden+
8c50: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  +;.          con
8c60: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
8c70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 43  .        if( (pC
8c80: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43  ol->colFlags & C
8c90: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 3d  OLFLAG_PRIMKEY)=
8ca0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8cb0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  k = 0;.        }
8cc0: 65 6c 73 65 20 69 66 28 20 70 50 6b 3d 3d 30 20  else if( pPk==0 
8cd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d  ){.          k =
8ce0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
8cf0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  e{.          for
8d00: 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61 62 2d 3e 6e  (k=1; k<=pTab->n
8d10: 43 6f 6c 20 26 26 20 70 50 6b 2d 3e 61 69 43 6f  Col && pPk->aiCo
8d20: 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69 3b 20 6b 2b  lumn[k-1]!=i; k+
8d30: 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20  +){}.        }. 
8d40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
8d50: 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 20 7c 7c  Col->pDflt==0 ||
8d60: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 6f 70   pCol->pDflt->op
8d70: 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a 20 20 20  ==TK_SPAN );.   
8d80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8d90: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
8da0: 22 69 73 73 69 73 69 22 2c 0a 20 20 20 20 20 20  "issisi",.      
8db0: 20 20 20 20 20 20 20 20 20 69 2d 6e 48 69 64 64           i-nHidd
8dc0: 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  en,.            
8dd0: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 0a     pCol->zName,.
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
8df0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
8e00: 28 70 43 6f 6c 2c 22 22 29 2c 0a 20 20 20 20 20  (pCol,""),.     
8e10: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
8e20: 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20 3a 20 30 2c  notNull ? 1 : 0,
8e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e40: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3f 20 70 43  pCol->pDflt ? pC
8e50: 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54 6f  ol->pDflt->u.zTo
8e60: 6b 65 6e 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  ken : 0,.       
8e70: 20 20 20 20 20 20 20 20 6b 29 3b 0a 20 20 20 20          k);.    
8e80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8e90: 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66 20 53  break;..#ifdef S
8ea0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 63 61  QLITE_DEBUG.  ca
8eb0: 73 65 20 50 72 61 67 54 79 70 5f 53 54 41 54 53  se PragTyp_STATS
8ec0: 3a 20 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  : {.    Index *p
8ed0: 49 64 78 3b 0a 20 20 20 20 48 61 73 68 45 6c 65  Idx;.    HashEle
8ee0: 6d 20 2a 69 3b 0a 20 20 20 20 70 50 61 72 73 65  m *i;.    pParse
8ef0: 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20  ->nMem = 5;.    
8f00: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
8f10: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
8f20: 69 44 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  iDb);.    for(i=
8f30: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
8f40: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
8f50: 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71  blHash); i; i=sq
8f60: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
8f70: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
8f80: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
8f90: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 20 20 73  Data(i);.      s
8fa0: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
8fb0: 6f 61 64 28 76 2c 20 31 2c 20 22 73 73 69 69 69  oad(v, 1, "ssiii
8fc0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
8fd0: 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
8fe0: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
8ff0: 20 20 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52      pTab->szTabR
9000: 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
9010: 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 2c  Tab->nRowLogEst,
9020: 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
9030: 2d 3e 74 61 62 46 6c 61 67 73 29 3b 0a 20 20 20  ->tabFlags);.   
9040: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
9050: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
9060: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
9070: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9080: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
9090: 76 2c 20 32 2c 20 22 73 69 69 69 58 22 2c 0a 20  v, 2, "siiiX",. 
90a0: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
90b0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
90c0: 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77    pIdx->szIdxRow
90d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64  ,.           pId
90e0: 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  x->aiRowLogEst[0
90f0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  ],.           pI
9100: 64 78 2d 3e 68 61 73 53 74 61 74 31 29 3b 0a 20  dx->hasStat1);. 
9110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9120: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
9130: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 35 29 3b  esultRow, 1, 5);
9140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9150: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
9160: 69 66 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  if..  case PragT
9170: 79 70 5f 49 4e 44 45 58 5f 49 4e 46 4f 3a 20 69  yp_INDEX_INFO: i
9180: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
9190: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
91a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
91b0: 20 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65     pIdx = sqlite
91c0: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
91d0: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
91e0: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
91f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
9200: 69 6e 74 20 6d 78 3b 0a 20 20 20 20 20 20 69 66  int mx;.      if
9210: 28 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20  ( pPragma->iArg 
9220: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 52  ){.        /* PR
9230: 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f  AGMA index_xinfo
9240: 20 28 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 20   (newer version 
9250: 77 69 74 68 20 6d 6f 72 65 20 72 6f 77 73 20 61  with more rows a
9260: 6e 64 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0a 20  nd columns) */. 
9270: 20 20 20 20 20 20 20 6d 78 20 3d 20 70 49 64 78         mx = pIdx
9280: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->nColumn;.     
9290: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
92a0: 3d 20 36 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 6;.      }else
92b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41  {.        /* PRA
92c0: 47 4d 41 20 69 6e 64 65 78 5f 69 6e 66 6f 20 28  GMA index_info (
92d0: 6c 65 67 61 63 79 20 76 65 72 73 69 6f 6e 29 20  legacy version) 
92e0: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20  */.        mx = 
92f0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  pIdx->nKeyCol;. 
9300: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
9310: 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 20 20 7d  Mem = 3;.      }
9320: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49  .      pTab = pI
9330: 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  dx->pTable;.    
9340: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
9350: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
9360: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 61 73  , iDb);.      as
9370: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4d  sert( pParse->nM
9380: 65 6d 3c 3d 70 50 72 61 67 6d 61 2d 3e 6e 50 72  em<=pPragma->nPr
9390: 61 67 43 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20  agCName );.     
93a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 3b 20   for(i=0; i<mx; 
93b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 31  i++){.        i1
93c0: 36 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61  6 cnum = pIdx->a
93d0: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
93e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
93f0: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
9400: 69 69 73 58 22 2c 20 69 2c 20 63 6e 75 6d 2c 0a  iisX", i, cnum,.
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 75               cnu
9430: 6d 3c 30 20 3f 20 30 20 3a 20 70 54 61 62 2d 3e  m<0 ? 0 : pTab->
9440: 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65  aCol[cnum].zName
9450: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
9460: 50 72 61 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a  Pragma->iArg ){.
9470: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9480: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9490: 2c 20 34 2c 20 22 69 73 69 58 22 2c 0a 20 20 20  , 4, "isiX",.   
94a0: 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61           pIdx->a
94b0: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 2c 0a 20 20  SortOrder[i],.  
94c0: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
94d0: 61 7a 43 6f 6c 6c 5b 69 5d 2c 0a 20 20 20 20 20  azColl[i],.     
94e0: 20 20 20 20 20 20 20 69 3c 70 49 64 78 2d 3e 6e         i<pIdx->n
94f0: 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  KeyCol);.       
9500: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
9510: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9520: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
9530: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a   pParse->nMem);.
9540: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9550: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61  }.  break;..  ca
9560: 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58  se PragTyp_INDEX
9570: 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52 69 67 68  _LIST: if( zRigh
9580: 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t ){.    Index *
9590: 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20  pIdx;.    Table 
95a0: 2a 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69  *pTab;.    int i
95b0: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
95c0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
95d0: 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a  , zRight, zDb);.
95e0: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
95f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
9600: 65 6d 20 3d 20 35 3b 0a 20 20 20 20 20 20 73 71  em = 5;.      sq
9610: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
9620: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
9630: 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  b);.      for(pI
9640: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  dx=pTab->pIndex,
9650: 20 69 3d 30 3b 20 70 49 64 78 3b 20 70 49 64 78   i=0; pIdx; pIdx
9660: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b  =pIdx->pNext, i+
9670: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
9680: 74 20 63 68 61 72 20 2a 61 7a 4f 72 69 67 69 6e  t char *azOrigin
9690: 5b 5d 20 3d 20 7b 20 22 63 22 2c 20 22 75 22 2c  [] = { "c", "u",
96a0: 20 22 70 6b 22 20 7d 3b 0a 20 20 20 20 20 20 20   "pk" };.       
96b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
96c0: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 69  iLoad(v, 1, "isi
96d0: 73 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  si",.           
96e0: 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  i,.           pI
96f0: 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  dx->zName,.     
9700: 20 20 20 20 20 20 49 73 55 6e 69 71 75 65 49 6e        IsUniqueIn
9710: 64 65 78 28 70 49 64 78 29 2c 0a 20 20 20 20 20  dex(pIdx),.     
9720: 20 20 20 20 20 20 61 7a 4f 72 69 67 69 6e 5b 70        azOrigin[p
9730: 49 64 78 2d 3e 69 64 78 54 79 70 65 5d 2c 0a 20  Idx->idxType],. 
9740: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
9750: 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
9760: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9770: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20  .  }.  break;.. 
9780: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 41   case PragTyp_DA
9790: 54 41 42 41 53 45 5f 4c 49 53 54 3a 20 7b 0a 20  TABASE_LIST: {. 
97a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50     int i;.    pP
97b0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a  arse->nMem = 3;.
97c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
97d0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
97e0: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
97f0: 69 5d 2e 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74  i].pBt==0 ) cont
9800: 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
9810: 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  rt( db->aDb[i].z
9820: 44 62 53 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  DbSName!=0 );.  
9830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9840: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
9850: 69 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 69  iss",.         i
9860: 2c 0a 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  ,.         db->a
9870: 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 0a  Db[i].zDbSName,.
9880: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9890: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
98a0: 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  (db->aDb[i].pBt)
98b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  );.    }.  }.  b
98c0: 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72  reak;..  case Pr
98d0: 61 67 54 79 70 5f 43 4f 4c 4c 41 54 49 4f 4e 5f  agTyp_COLLATION_
98e0: 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  LIST: {.    int 
98f0: 69 20 3d 20 30 3b 0a 20 20 20 20 48 61 73 68 45  i = 0;.    HashE
9900: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 70 50 61 72  lem *p;.    pPar
9910: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20  se->nMem = 2;.  
9920: 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61    for(p=sqliteHa
9930: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f  shFirst(&db->aCo
9940: 6c 6c 53 65 71 29 3b 20 70 3b 20 70 3d 73 71 6c  llSeq); p; p=sql
9950: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
9960: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
9970: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
9980: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
9990: 61 28 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  a(p);.      sqli
99a0: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
99b0: 28 76 2c 20 31 2c 20 22 69 73 22 2c 20 69 2b 2b  (v, 1, "is", i++
99c0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
99d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
99e0: 61 6b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ak;..#ifdef SQLI
99f0: 54 45 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e  TE_INTROSPECTION
9a00: 5f 50 52 41 47 4d 41 53 0a 20 20 63 61 73 65 20  _PRAGMAS.  case 
9a10: 50 72 61 67 54 79 70 5f 46 55 4e 43 54 49 4f 4e  PragTyp_FUNCTION
9a20: 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74  _LIST: {.    int
9a30: 20 69 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d   i;.    HashElem
9a40: 20 2a 6a 3b 0a 20 20 20 20 46 75 6e 63 44 65 66   *j;.    FuncDef
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 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45  or(i=0; i<SQLITE
9a80: 5f 46 55 4e 43 5f 48 41 53 48 5f 53 5a 3b 20 69  _FUNC_HASH_SZ; i
9a90: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
9aa0: 3d 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e 46  =sqlite3BuiltinF
9ab0: 75 6e 63 74 69 6f 6e 73 2e 61 5b 69 5d 3b 20 70  unctions.a[i]; p
9ac0: 3b 20 70 3d 70 2d 3e 75 2e 70 48 61 73 68 20 29  ; p=p->u.pHash )
9ad0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9ae0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9af0: 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d 3e 7a 4e  , 1, "si", p->zN
9b00: 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  ame, 1);.      }
9b10: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a  .    }.    for(j
9b20: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
9b30: 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20 6a 3b  (&db->aFunc); j;
9b40: 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   j=sqliteHashNex
9b50: 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 70 20 3d  t(j)){.      p =
9b60: 20 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69 74   (FuncDef*)sqlit
9b70: 65 48 61 73 68 44 61 74 61 28 6a 29 3b 0a 20 20  eHashData(j);.  
9b80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9b90: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
9ba0: 73 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30  si", p->zName, 0
9bb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  );.    }.  }.  b
9bc0: 72 65 61 6b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  reak;..#ifndef S
9bd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
9be0: 41 4c 54 41 42 4c 45 0a 20 20 63 61 73 65 20 50  ALTABLE.  case P
9bf0: 72 61 67 54 79 70 5f 4d 4f 44 55 4c 45 5f 4c 49  ragTyp_MODULE_LI
9c00: 53 54 3a 20 7b 0a 20 20 20 20 48 61 73 68 45 6c  ST: {.    HashEl
9c10: 65 6d 20 2a 6a 3b 0a 20 20 20 20 70 50 61 72 73  em *j;.    pPars
9c20: 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20  e->nMem = 1;.   
9c30: 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65 48 61 73   for(j=sqliteHas
9c40: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
9c50: 75 6c 65 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69 74  ule); j; j=sqlit
9c60: 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a 20  eHashNext(j)){. 
9c70: 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f       Module *pMo
9c80: 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c  d = (Module*)sql
9c90: 69 74 65 48 61 73 68 44 61 74 61 28 6a 29 3b 0a  iteHashData(j);.
9ca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9cb0: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9cc0: 20 22 73 22 2c 20 70 4d 6f 64 2d 3e 7a 4e 61 6d   "s", pMod->zNam
9cd0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
9ce0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
9cf0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
9d00: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
9d10: 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 52 41  case PragTyp_PRA
9d20: 47 4d 41 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20  GMA_LIST: {.    
9d30: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
9d40: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
9d50: 61 50 72 61 67 6d 61 4e 61 6d 65 29 3b 20 69 2b  aPragmaName); i+
9d60: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
9d70: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9d80: 2c 20 31 2c 20 22 73 22 2c 20 61 50 72 61 67 6d  , 1, "s", aPragm
9d90: 61 4e 61 6d 65 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  aName[i].zName);
9da0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
9db0: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ak;.#endif /* SQ
9dc0: 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54 49  LITE_INTROSPECTI
9dd0: 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23  ON_PRAGMAS */..#
9de0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9df0: 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47  OMIT_SCHEMA_PRAG
9e00: 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  MAS */..#ifndef 
9e10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
9e20: 49 47 4e 5f 4b 45 59 0a 20 20 63 61 73 65 20 50  IGN_KEY.  case P
9e30: 72 61 67 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b  ragTyp_FOREIGN_K
9e40: 45 59 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52 69  EY_LIST: if( zRi
9e50: 67 68 74 20 29 7b 0a 20 20 20 20 46 4b 65 79 20  ght ){.    FKey 
9e60: 2a 70 46 4b 3b 0a 20 20 20 20 54 61 62 6c 65 20  *pFK;.    Table 
9e70: 2a 70 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20  *pTab;.    pTab 
9e80: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
9e90: 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a  le(db, zRight, z
9ea0: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Db);.    if( pTa
9eb0: 62 20 29 7b 0a 20 20 20 20 20 20 70 46 4b 20 3d  b ){.      pFK =
9ec0: 20 70 54 61 62 2d 3e 70 46 4b 65 79 3b 0a 20 20   pTab->pFKey;.  
9ed0: 20 20 20 20 69 66 28 20 70 46 4b 20 29 7b 0a 20      if( pFK ){. 
9ee0: 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30         int i = 0
9ef0: 3b 20 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ; .        pPars
9f00: 65 2d 3e 6e 4d 65 6d 20 3d 20 38 3b 0a 20 20 20  e->nMem = 8;.   
9f10: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
9f20: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
9f30: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
9f40: 20 20 20 77 68 69 6c 65 28 70 46 4b 29 7b 0a 20     while(pFK){. 
9f50: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
9f60: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
9f70: 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20  0; j<pFK->nCol; 
9f80: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
9f90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9fa0: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 69  tiLoad(v, 1, "ii
9fb0: 73 73 73 73 73 73 22 2c 0a 20 20 20 20 20 20 20  ssssss",.       
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 2c 0a 20              i,. 
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 20 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20    j,.           
9ff0: 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 7a 54 6f          pFK->zTo
a000: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a010: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
a020: 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72  pFK->aCol[j].iFr
a030: 6f 6d 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  om].zName,.     
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
a050: 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c  K->aCol[j].zCol,
a060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a070: 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70      actionName(p
a080: 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 29 2c  FK->aAction[1]),
a090: 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 2a    /* ON UPDATE *
a0a0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
a0b0: 20 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28       actionName(
a0c0: 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29  pFK->aAction[0])
a0d0: 2c 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20  ,  /* ON DELETE 
a0e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
a0f0: 20 20 20 20 20 20 22 4e 4f 4e 45 22 29 3b 0a 20        "NONE");. 
a100: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a110: 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20       ++i;.      
a120: 20 20 20 20 70 46 4b 20 3d 20 70 46 4b 2d 3e 70      pFK = pFK->p
a130: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 20 20  NextFrom;.      
a140: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a150: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
a160: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
a170: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
a180: 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23  REIGN_KEY) */..#
a190: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a1a0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 23  IT_FOREIGN_KEY.#
a1b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a1c0: 49 54 5f 54 52 49 47 47 45 52 0a 20 20 63 61 73  IT_TRIGGER.  cas
a1d0: 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45 49 47  e PragTyp_FOREIG
a1e0: 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a 20 7b 0a 20  N_KEY_CHECK: {. 
a1f0: 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 20 20 20     FKey *pFK;   
a200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66            /* A f
a210: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
a220: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 54 61 62  raint */.    Tab
a230: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
a240: 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 74 61 62      /* Child tab
a250: 6c 65 20 63 6f 6e 74 61 69 6e 20 22 52 45 46 45  le contain "REFE
a260: 52 45 4e 43 45 53 22 20 6b 65 79 77 6f 72 64 20  RENCES" keyword 
a270: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 50  */.    Table *pP
a280: 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
a290: 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 74 68   Parent table th
a2a0: 61 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20  at child points 
a2b0: 74 6f 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  to */.    Index 
a2c0: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
a2d0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 74 68 65   /* Index in the
a2e0: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f   parent table */
a2f0: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
a300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a310: 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 6f  oop counter:  Fo
a320: 72 65 69 67 6e 20 6b 65 79 20 6e 75 6d 62 65 72  reign key number
a330: 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20   for pTab */.   
a340: 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
a350: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
a360: 63 6f 75 6e 74 65 72 3a 20 20 46 69 65 6c 64 20  counter:  Field 
a370: 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  of the foreign k
a380: 65 79 20 2a 2f 0a 20 20 20 20 48 61 73 68 45 6c  ey */.    HashEl
a390: 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
a3a0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
a3b0: 3a 20 20 4e 65 78 74 20 74 61 62 6c 65 20 69 6e  :  Next table in
a3c0: 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69   schema */.    i
a3d0: 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20 20 20  nt x;           
a3e0: 20 20 20 20 20 20 2f 2a 20 72 65 73 75 6c 74 20        /* result 
a3f0: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
a400: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
a410: 20 20 20 20 20 20 20 2f 2a 20 33 20 72 65 67 69         /* 3 regi
a420: 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20  sters to hold a 
a430: 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
a440: 20 20 69 6e 74 20 72 65 67 4b 65 79 3b 20 20 20    int regKey;   
a450: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
a460: 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6b 65 79  ster to hold key
a470: 20 66 6f 72 20 63 68 65 63 6b 69 6e 67 20 74 68   for checking th
a480: 65 20 46 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  e FK */.    int 
a490: 72 65 67 52 6f 77 3b 20 20 20 20 20 20 20 20 20  regRow;         
a4a0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
a4b0: 74 6f 20 68 6f 6c 64 20 61 20 72 6f 77 20 66 72  to hold a row fr
a4c0: 6f 6d 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 69  om pTab */.    i
a4d0: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
a4e0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
a4f0: 61 20 6c 6f 6f 70 20 63 68 65 63 6b 69 6e 67 20  a loop checking 
a500: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 2a 2f 0a  foreign keys */.
a510: 20 20 20 20 69 6e 74 20 61 64 64 72 4f 6b 3b 20      int addrOk; 
a520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
a530: 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 6b  mp here if the k
a540: 65 79 20 69 73 20 4f 4b 20 2a 2f 0a 20 20 20 20  ey is OK */.    
a550: 69 6e 74 20 2a 61 69 43 6f 6c 73 3b 20 20 20 20  int *aiCols;    
a560: 20 20 20 20 20 20 20 2f 2a 20 63 68 69 6c 64 20         /* child 
a570: 74 6f 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e  to parent column
a580: 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 0a 20 20 20   mapping */..   
a590: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 50 61   regResult = pPa
a5a0: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
a5b0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
a5c0: 20 34 3b 0a 20 20 20 20 72 65 67 4b 65 79 20 3d   4;.    regKey =
a5d0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
a5e0: 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 2b 2b  .    regRow = ++
a5f0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
a600: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
a610: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
a620: 2c 20 69 44 62 29 3b 0a 20 20 20 20 6b 20 3d 20  , iDb);.    k = 
a630: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
a640: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
a650: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
a660: 0a 20 20 20 20 77 68 69 6c 65 28 20 6b 20 29 7b  .    while( k ){
a670: 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68  .      if( zRigh
a680: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  t ){.        pTa
a690: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
a6a0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  eTable(pParse, 0
a6b0: 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a  , zRight, zDb);.
a6c0: 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20          k = 0;. 
a6d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a6e0: 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
a6f0: 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
a700: 61 28 6b 29 3b 0a 20 20 20 20 20 20 20 20 6b 20  a(k);.        k 
a710: 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  = sqliteHashNext
a720: 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (k);.      }.   
a730: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c     if( pTab==0 |
a740: 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79 3d 3d 30  | pTab->pFKey==0
a750: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a760: 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
a770: 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
a780: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
a790: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
a7a0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43      if( pTab->nC
a7b0: 6f 6c 2b 72 65 67 52 6f 77 3e 70 50 61 72 73 65  ol+regRow>pParse
a7c0: 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73 65 2d  ->nMem ) pParse-
a7d0: 3e 6e 4d 65 6d 20 3d 20 70 54 61 62 2d 3e 6e 43  >nMem = pTab->nC
a7e0: 6f 6c 20 2b 20 72 65 67 52 6f 77 3b 0a 20 20 20  ol + regRow;.   
a7f0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
a800: 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ble(pParse, 0, i
a810: 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
a820: 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 73 71  nRead);.      sq
a830: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
a840: 69 6e 67 28 76 2c 20 72 65 67 52 65 73 75 6c 74  ing(v, regResult
a850: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
a860: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70        for(i=1, p
a870: 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20  FK=pTab->pFKey; 
a880: 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46  pFK; i++, pFK=pF
a890: 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  K->pNextFrom){. 
a8a0: 20 20 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d         pParent =
a8b0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
a8c0: 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20  e(db, pFK->zTo, 
a8d0: 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66  zDb);.        if
a8e0: 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 63  ( pParent==0 ) c
a8f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
a900: 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20   pIdx = 0;.     
a910: 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
a920: 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
a930: 20 70 50 61 72 65 6e 74 2d 3e 74 6e 75 6d 2c 20   pParent->tnum, 
a940: 30 2c 20 70 50 61 72 65 6e 74 2d 3e 7a 4e 61 6d  0, pParent->zNam
a950: 65 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20  e);.        x = 
a960: 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65 49  sqlite3FkLocateI
a970: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 50 61  ndex(pParse, pPa
a980: 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64 78  rent, pFK, &pIdx
a990: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
a9a0: 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x==0 ){.      
a9b0: 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20      if( pIdx==0 
a9c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
a9d0: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
a9e0: 70 50 61 72 73 65 2c 20 69 2c 20 69 44 62 2c 20  pParse, i, iDb, 
a9f0: 70 50 61 72 65 6e 74 2c 20 4f 50 5f 4f 70 65 6e  pParent, OP_Open
aa00: 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  Read);.         
aa10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
aa20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
aa30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
aa40: 52 65 61 64 2c 20 69 2c 20 70 49 64 78 2d 3e 74  Read, i, pIdx->t
aa50: 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
aa60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
aa70: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
aa80: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
aa90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aaa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
aab0: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20     k = 0;.      
aac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
aad0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
aae0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
aaf0: 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 46 4b  e->nErr>0 || pFK
ab00: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
ab10: 20 70 46 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20   pFK ) break;.  
ab20: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
ab30: 6e 54 61 62 3c 69 20 29 20 70 50 61 72 73 65 2d  nTab<i ) pParse-
ab40: 3e 6e 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20  >nTab = i;.     
ab50: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
ab60: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ab70: 4f 50 5f 52 65 77 69 6e 64 2c 20 30 29 3b 20 56  OP_Rewind, 0); V
ab80: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
ab90: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70        for(i=1, p
aba0: 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20  FK=pTab->pFKey; 
abb0: 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46  pFK; i++, pFK=pF
abc0: 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  K->pNextFrom){. 
abd0: 20 20 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d         pParent =
abe0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
abf0: 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20  e(db, pFK->zTo, 
ac00: 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70 49  zDb);.        pI
ac10: 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
ac20: 61 69 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20  aiCols = 0;.    
ac30: 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 20      if( pParent 
ac40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d  ){.          x =
ac50: 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65   sqlite3FkLocate
ac60: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 50  Index(pParse, pP
ac70: 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64  arent, pFK, &pId
ac80: 78 2c 20 26 61 69 43 6f 6c 73 29 3b 0a 20 20 20  x, &aiCols);.   
ac90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78         assert( x
aca0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  ==0 );.        }
acb0: 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f 6b 20  .        addrOk 
acc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
acd0: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
ace0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
acf0: 63 6f 64 65 20 74 6f 20 72 65 61 64 20 74 68 65  code to read the
ad00: 20 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65   child key value
ad10: 73 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73  s into registers
ad20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 67 52  .        ** regR
ad30: 6f 77 2e 2e 72 65 67 52 6f 77 2b 6e 2e 20 49 66  ow..regRow+n. If
ad40: 20 61 6e 79 20 6f 66 20 74 68 65 20 63 68 69 6c   any of the chil
ad50: 64 20 6b 65 79 20 76 61 6c 75 65 73 20 61 72 65  d key values are
ad60: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 0a 20 20 20   NULL, this .   
ad70: 20 20 20 20 20 2a 2a 20 72 6f 77 20 63 61 6e 6e       ** row cann
ad80: 6f 74 20 63 61 75 73 65 20 61 6e 20 46 4b 20 76  ot cause an FK v
ad90: 69 6f 6c 61 74 69 6f 6e 2e 20 4a 75 6d 70 20 64  iolation. Jump d
ada0: 69 72 65 63 74 6c 79 20 74 6f 20 61 64 64 72 4f  irectly to addrO
adb0: 6b 20 69 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  k in .        **
adc0: 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20   this case. */. 
add0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
ade0: 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  j<pFK->nCol; j++
adf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
ae00: 20 69 43 6f 6c 20 3d 20 61 69 43 6f 6c 73 20 3f   iCol = aiCols ?
ae10: 20 61 69 43 6f 6c 73 5b 6a 5d 20 3a 20 70 46 4b   aiCols[j] : pFK
ae20: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 3b  ->aCol[j].iFrom;
ae30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ae40: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
ae50: 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
ae60: 61 62 2c 20 30 2c 20 69 43 6f 6c 2c 20 72 65 67  ab, 0, iCol, reg
ae70: 52 6f 77 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Row+j);.        
ae80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ae90: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
aea0: 2c 20 72 65 67 52 6f 77 2b 6a 2c 20 61 64 64 72  , regRow+j, addr
aeb0: 4f 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ok); VdbeCoverag
aec0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  e(v);.        }.
aed0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  .        /* Gene
aee0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 71 75 65  rate code to que
aef0: 72 79 20 74 68 65 20 70 61 72 65 6e 74 20 69 6e  ry the parent in
af00: 64 65 78 20 66 6f 72 20 61 20 6d 61 74 63 68 69  dex for a matchi
af10: 6e 67 20 70 61 72 65 6e 74 0a 20 20 20 20 20 20  ng parent.      
af20: 20 20 2a 2a 20 6b 65 79 2e 20 49 66 20 61 20 6d    ** key. If a m
af30: 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 6a  atch is found, j
af40: 75 6d 70 20 74 6f 20 61 64 64 72 4f 6b 2e 20 2a  ump to addrOk. *
af50: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
af60: 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dx ){.          
af70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
af80: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
af90: 72 64 2c 20 72 65 67 52 6f 77 2c 20 70 46 4b 2d  rd, regRow, pFK-
afa0: 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65 79 2c 0a 20  >nCol, regKey,. 
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
afc0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
afd0: 79 53 74 72 28 64 62 2c 70 49 64 78 29 2c 20 70  yStr(db,pIdx), p
afe0: 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  FK->nCol);.     
aff0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b000: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
b010: 46 6f 75 6e 64 2c 20 69 2c 20 61 64 64 72 4f 6b  Found, i, addrOk
b020: 2c 20 72 65 67 4b 65 79 2c 20 30 29 3b 0a 20 20  , regKey, 0);.  
b030: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
b040: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
b050: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
b060: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
b070: 69 6e 74 20 6a 6d 70 20 3d 20 73 71 6c 69 74 65  int jmp = sqlite
b080: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
b090: 28 76 29 2b 32 3b 0a 20 20 20 20 20 20 20 20 20  (v)+2;.         
b0a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b0b0: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
b0c0: 69 64 2c 20 69 2c 20 6a 6d 70 2c 20 72 65 67 52  id, i, jmp, regR
b0d0: 6f 77 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ow); VdbeCoverag
b0e0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
b0f0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
b100: 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20  v, addrOk);.    
b110: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
b120: 4b 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  K->nCol==1 );.  
b130: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
b140: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
b150: 65 20 74 6f 20 72 65 70 6f 72 74 20 61 6e 20 46  e to report an F
b160: 4b 20 76 69 6f 6c 61 74 69 6f 6e 20 74 6f 20 74  K violation to t
b170: 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20  he caller. */.  
b180: 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
b190: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
b1a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b1b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
b1c0: 77 69 64 2c 20 30 2c 20 72 65 67 52 65 73 75 6c  wid, 0, regResul
b1d0: 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  t+1);.        }e
b1e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
b1f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b200: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
b210: 72 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20  regResult+1);.  
b220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b230: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
b240: 4c 6f 61 64 28 76 2c 20 72 65 67 52 65 73 75 6c  Load(v, regResul
b250: 74 2b 32 2c 20 22 73 69 58 22 2c 20 70 46 4b 2d  t+2, "siX", pFK-
b260: 3e 7a 54 6f 2c 20 69 2d 31 29 3b 0a 20 20 20 20  >zTo, i-1);.    
b270: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b280: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
b290: 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74  ltRow, regResult
b2a0: 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 4);.        sq
b2b0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
b2c0: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 6b 29  Label(v, addrOk)
b2d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b2e0: 33 44 62 46 72 65 65 28 64 62 2c 20 61 69 43 6f  3DbFree(db, aiCo
b2f0: 6c 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ls);.      }.   
b300: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b310: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
b320: 20 30 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20   0, addrTop+1); 
b330: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b350: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b360: 64 72 54 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  drTop);.    }.  
b370: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
b380: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
b390: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
b3a0: 52 29 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  R) */.#endif /* 
b3b0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b3c0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
b3d0: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ) */..#ifndef ND
b3e0: 45 42 55 47 0a 20 20 63 61 73 65 20 50 72 61 67  EBUG.  case Prag
b3f0: 54 79 70 5f 50 41 52 53 45 52 5f 54 52 41 43 45  Typ_PARSER_TRACE
b400: 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
b410: 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ht ){.      if( 
b420: 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61  sqlite3GetBoolea
b430: 6e 28 7a 52 69 67 68 74 2c 20 30 29 20 29 7b 0a  n(zRight, 0) ){.
b440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
b450: 61 72 73 65 72 54 72 61 63 65 28 73 74 64 6f 75  arserTrace(stdou
b460: 74 2c 20 22 70 61 72 73 65 72 3a 20 22 29 3b 0a  t, "parser: ");.
b470: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b480: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 72 73       sqlite3Pars
b490: 65 72 54 72 61 63 65 28 30 2c 20 30 29 3b 0a 20  erTrace(0, 0);. 
b4a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b4b0: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
b4c0: 0a 0a 20 20 2f 2a 20 52 65 69 6e 73 74 61 6c 6c  ..  /* Reinstall
b4d0: 20 74 68 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c   the LIKE and GL
b4e0: 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  OB functions.  T
b4f0: 68 65 20 76 61 72 69 61 6e 74 20 6f 66 20 4c 49  he variant of LI
b500: 4b 45 0a 20 20 2a 2a 20 75 73 65 64 20 77 69 6c  KE.  ** used wil
b510: 6c 20 62 65 20 63 61 73 65 20 73 65 6e 73 69 74  l be case sensit
b520: 69 76 65 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e  ive or not depen
b530: 64 69 6e 67 20 6f 6e 20 74 68 65 20 52 48 53 2e  ding on the RHS.
b540: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
b550: 67 54 79 70 5f 43 41 53 45 5f 53 45 4e 53 49 54  gTyp_CASE_SENSIT
b560: 49 56 45 5f 4c 49 4b 45 3a 20 7b 0a 20 20 20 20  IVE_LIKE: {.    
b570: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
b580: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
b590: 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73  terLikeFunctions
b5a0: 28 64 62 2c 20 73 71 6c 69 74 65 33 47 65 74 42  (db, sqlite3GetB
b5b0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
b5c0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
b5d0: 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64 65 66 20  break;..#ifndef 
b5e0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59  SQLITE_INTEGRITY
b5f0: 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58  _CHECK_ERROR_MAX
b600: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
b610: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
b620: 5f 45 52 52 4f 52 5f 4d 41 58 20 31 30 30 0a 23  _ERROR_MAX 100.#
b630: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
b640: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
b650: 52 49 54 59 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  RITY_CHECK.  /* 
b660: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
b670: 69 74 79 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 20  ity_check.  **  
b680: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
b690: 74 79 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a  ty_check(N).  **
b6a0: 20 20 20 20 50 52 41 47 4d 41 20 71 75 69 63 6b      PRAGMA quick
b6b0: 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 20 20 20 50  _check.  **    P
b6c0: 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63  RAGMA quick_chec
b6d0: 6b 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  k(N).  **.  ** V
b6e0: 65 72 69 66 79 20 74 68 65 20 69 6e 74 65 67 72  erify the integr
b6f0: 69 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  ity of the datab
b700: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ase..  **.  ** T
b710: 68 65 20 22 71 75 69 63 6b 5f 63 68 65 63 6b 22  he "quick_check"
b720: 20 69 73 20 72 65 64 75 63 65 64 20 76 65 72 73   is reduced vers
b730: 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 69 6e 74  ion of .  ** int
b740: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 64 65 73  egrity_check des
b750: 69 67 6e 65 64 20 74 6f 20 64 65 74 65 63 74 20  igned to detect 
b760: 6d 6f 73 74 20 64 61 74 61 62 61 73 65 20 63 6f  most database co
b770: 72 72 75 70 74 69 6f 6e 0a 20 20 2a 2a 20 77 69  rruption.  ** wi
b780: 74 68 6f 75 74 20 74 68 65 20 6f 76 65 72 68 65  thout the overhe
b790: 61 64 20 6f 66 20 63 72 6f 73 73 2d 63 68 65 63  ad of cross-chec
b7a0: 6b 69 6e 67 20 69 6e 64 65 78 65 73 2e 20 20 51  king indexes.  Q
b7b0: 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20 2a 2a 20  uick_check.  ** 
b7c0: 69 73 20 6c 69 6e 65 61 72 20 74 69 6d 65 20 77  is linear time w
b7d0: 68 65 72 65 61 73 65 20 69 6e 74 65 67 72 69 74  herease integrit
b7e0: 79 5f 63 68 65 63 6b 20 69 73 20 4f 28 4e 6c 6f  y_check is O(Nlo
b7f0: 67 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  gN)..  */.  case
b800: 20 50 72 61 67 54 79 70 5f 49 4e 54 45 47 52 49   PragTyp_INTEGRI
b810: 54 59 5f 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20  TY_CHECK: {.    
b820: 69 6e 74 20 69 2c 20 6a 2c 20 61 64 64 72 2c 20  int i, j, addr, 
b830: 6d 78 45 72 72 3b 0a 0a 20 20 20 20 69 6e 74 20  mxErr;..    int 
b840: 69 73 51 75 69 63 6b 20 3d 20 28 73 71 6c 69 74  isQuick = (sqlit
b850: 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b  e3Tolower(zLeft[
b860: 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a 20 20 20 20  0])=='q');..    
b870: 2f 2a 20 49 66 20 74 68 65 20 50 52 41 47 4d 41  /* If the PRAGMA
b880: 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 6f 66 20   command was of 
b890: 74 68 65 20 66 6f 72 6d 20 22 50 52 41 47 4d 41  the form "PRAGMA
b8a0: 20 3c 64 62 3e 2e 69 6e 74 65 67 72 69 74 79 5f   <db>.integrity_
b8b0: 63 68 65 63 6b 22 2c 0a 20 20 20 20 2a 2a 20 74  check",.    ** t
b8c0: 68 65 6e 20 69 44 62 20 69 73 20 73 65 74 20 74  hen iDb is set t
b8d0: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
b8e0: 68 65 20 64 61 74 61 62 61 73 65 20 69 64 65 6e  he database iden
b8f0: 74 69 66 69 65 64 20 62 79 20 3c 64 62 3e 2e 0a  tified by <db>..
b900: 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
b910: 61 73 65 2c 20 74 68 65 20 69 6e 74 65 67 72 69  ase, the integri
b920: 74 79 20 6f 66 20 64 61 74 61 62 61 73 65 20 69  ty of database i
b930: 44 62 20 6f 6e 6c 79 20 69 73 20 76 65 72 69 66  Db only is verif
b940: 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68  ied by.    ** th
b950: 65 20 56 44 42 45 20 63 72 65 61 74 65 64 20 62  e VDBE created b
b960: 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  elow..    **.   
b970: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
b980: 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 77 61  f the command wa
b990: 73 20 73 69 6d 70 6c 79 20 22 50 52 41 47 4d 41  s simply "PRAGMA
b9a0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
b9b0: 22 20 28 6f 72 0a 20 20 20 20 2a 2a 20 22 50 52  " (or.    ** "PR
b9c0: 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b  AGMA quick_check
b9d0: 22 29 2c 20 74 68 65 6e 20 69 44 62 20 69 73 20  "), then iDb is 
b9e0: 73 65 74 20 74 6f 20 30 2e 20 49 6e 20 74 68 69  set to 0. In thi
b9f0: 73 20 63 61 73 65 2c 20 73 65 74 20 69 44 62 0a  s case, set iDb.
ba00: 20 20 20 20 2a 2a 20 74 6f 20 2d 31 20 68 65 72      ** to -1 her
ba10: 65 2c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  e, to indicate t
ba20: 68 61 74 20 74 68 65 20 56 44 42 45 20 73 68 6f  hat the VDBE sho
ba30: 75 6c 64 20 76 65 72 69 66 79 20 74 68 65 20 69  uld verify the i
ba40: 6e 74 65 67 72 69 74 79 0a 20 20 20 20 2a 2a 20  ntegrity.    ** 
ba50: 6f 66 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  of all attached 
ba60: 64 61 74 61 62 61 73 65 73 2e 20 20 2a 2f 0a 20  databases.  */. 
ba70: 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d     assert( iDb>=
ba80: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
ba90: 20 69 44 62 3d 3d 30 20 7c 7c 20 70 49 64 32 2d   iDb==0 || pId2-
baa0: 3e 7a 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  >z );.    if( pI
bab0: 64 32 2d 3e 7a 3d 3d 30 20 29 20 69 44 62 20 3d  d2->z==0 ) iDb =
bac0: 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69   -1;..    /* Ini
bad0: 74 69 61 6c 69 7a 65 20 74 68 65 20 56 44 42 45  tialize the VDBE
bae0: 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 20 20   program */.    
baf0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36  pParse->nMem = 6
bb00: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  ;..    /* Set th
bb10: 65 20 6d 61 78 69 6d 75 6d 20 65 72 72 6f 72 20  e maximum error 
bb20: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 6d 78 45  count */.    mxE
bb30: 72 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rr = SQLITE_INTE
bb40: 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f  GRITY_CHECK_ERRO
bb50: 52 5f 4d 41 58 3b 0a 20 20 20 20 69 66 28 20 7a  R_MAX;.    if( z
bb60: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
bb70: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
bb80: 52 69 67 68 74 2c 20 26 6d 78 45 72 72 29 3b 0a  Right, &mxErr);.
bb90: 20 20 20 20 20 20 69 66 28 20 6d 78 45 72 72 3c        if( mxErr<
bba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78  =0 ){.        mx
bbb0: 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  Err = SQLITE_INT
bbc0: 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52  EGRITY_CHECK_ERR
bbd0: 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 20 20 7d 0a  OR_MAX;.      }.
bbe0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
bbf0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bc00: 50 5f 49 6e 74 65 67 65 72 2c 20 6d 78 45 72 72  P_Integer, mxErr
bc10: 2d 31 2c 20 31 29 3b 20 2f 2a 20 72 65 67 5b 31  -1, 1); /* reg[1
bc20: 5d 20 68 6f 6c 64 73 20 65 72 72 6f 72 73 20 6c  ] holds errors l
bc30: 65 66 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44  eft */..    /* D
bc40: 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63  o an integrity c
bc50: 68 65 63 6b 20 6f 6e 20 65 61 63 68 20 64 61 74  heck on each dat
bc60: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
bc70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
bc80: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
bc90: 20 20 48 61 73 68 45 6c 65 6d 20 2a 78 3b 20 20    HashElem *x;  
bca0: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
bcb0: 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
bcc0: 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20   the schema */. 
bcd0: 20 20 20 20 20 48 61 73 68 20 2a 70 54 62 6c 73       Hash *pTbls
bce0: 3b 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20  ;     /* Set of 
bcf0: 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
bd00: 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20  e schema */.    
bd10: 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20 20    int *aRoot;   
bd20: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
bd30: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 73  oot page numbers
bd40: 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 2a   of all btrees *
bd50: 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  /.      int cnt 
bd60: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
bd70: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
bd80: 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 20 20   aRoot[] */.    
bd90: 20 20 69 6e 74 20 6d 78 49 64 78 20 3d 20 30 3b    int mxIdx = 0;
bda0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
bdb0: 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73 20  mber of indexes 
bdc0: 66 6f 72 20 61 6e 79 20 74 61 62 6c 65 20 2a 2f  for any table */
bdd0: 0a 0a 20 20 20 20 20 20 69 66 28 20 4f 4d 49 54  ..      if( OMIT
bde0: 5f 54 45 4d 50 44 42 20 26 26 20 69 3d 3d 31 20  _TEMPDB && i==1 
bdf0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
be00: 20 20 69 66 28 20 69 44 62 3e 3d 30 20 26 26 20    if( iDb>=0 && 
be10: 69 21 3d 69 44 62 20 29 20 63 6f 6e 74 69 6e 75  i!=iDb ) continu
be20: 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e;..      sqlite
be30: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
be40: 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 0a 20  a(pParse, i);.. 
be50: 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e       /* Do an in
be60: 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f 66  tegrity check of
be70: 20 74 68 65 20 42 2d 54 72 65 65 0a 20 20 20 20   the B-Tree.    
be80: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65    **.      ** Be
be90: 67 69 6e 20 62 79 20 66 69 6e 64 69 6e 67 20 74  gin by finding t
bea0: 68 65 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75  he root pages nu
beb0: 6d 62 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 66  mbers.      ** f
bec0: 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  or all tables an
bed0: 64 20 69 6e 64 69 63 65 73 20 69 6e 20 74 68 65  d indices in the
bee0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
bef0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
bf00: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
bf10: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 2c 20  utexHeld(db, i, 
bf20: 30 29 20 29 3b 0a 20 20 20 20 20 20 70 54 62 6c  0) );.      pTbl
bf30: 73 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  s = &db->aDb[i].
bf40: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
bf50: 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74 3d  ;.      for(cnt=
bf60: 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68 46  0, x=sqliteHashF
bf70: 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20  irst(pTbls); x; 
bf80: 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  x=sqliteHashNext
bf90: 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61  (x)){.        Ta
bfa0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
bfb0: 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 20 20  teHashData(x);  
bfc0: 2f 2a 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  /* Current table
bfd0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
bfe0: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c000: 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61   An index on pTa
c010: 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  b */.        int
c020: 20 6e 49 64 78 3b 20 20 20 20 20 20 20 20 20 20   nIdx;          
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c040: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  * Number of inde
c050: 78 65 73 20 6f 6e 20 70 54 61 62 20 2a 2f 0a 20  xes on pTab */. 
c060: 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f         if( HasRo
c070: 77 69 64 28 70 54 61 62 29 20 29 20 63 6e 74 2b  wid(pTab) ) cnt+
c080: 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6e  +;.        for(n
c090: 49 64 78 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  Idx=0, pIdx=pTab
c0a0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
c0b0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
c0c0: 2c 20 6e 49 64 78 2b 2b 29 7b 20 63 6e 74 2b 2b  , nIdx++){ cnt++
c0d0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
c0e0: 6e 49 64 78 3e 6d 78 49 64 78 20 29 20 6d 78 49  nIdx>mxIdx ) mxI
c0f0: 64 78 20 3d 20 6e 49 64 78 3b 0a 20 20 20 20 20  dx = nIdx;.     
c100: 20 7d 0a 20 20 20 20 20 20 61 52 6f 6f 74 20 3d   }.      aRoot =
c110: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c120: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
c130: 28 69 6e 74 29 2a 28 63 6e 74 2b 31 29 29 3b 0a  (int)*(cnt+1));.
c140: 20 20 20 20 20 20 69 66 28 20 61 52 6f 6f 74 3d        if( aRoot=
c150: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
c160: 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73    for(cnt=0, x=s
c170: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
c180: 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69  Tbls); x; x=sqli
c190: 74 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a  teHashNext(x)){.
c1a0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
c1b0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
c1c0: 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20  Data(x);.       
c1d0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
c1e0: 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
c1f0: 69 64 28 70 54 61 62 29 20 29 20 61 52 6f 6f 74  id(pTab) ) aRoot
c200: 5b 2b 2b 63 6e 74 5d 20 3d 20 70 54 61 62 2d 3e  [++cnt] = pTab->
c210: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 66 6f  tnum;.        fo
c220: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
c230: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
c240: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
c250: 20 20 20 20 20 20 20 20 61 52 6f 6f 74 5b 2b 2b          aRoot[++
c260: 63 6e 74 5d 20 3d 20 70 49 64 78 2d 3e 74 6e 75  cnt] = pIdx->tnu
c270: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
c280: 20 20 20 7d 0a 20 20 20 20 20 20 61 52 6f 6f 74     }.      aRoot
c290: 5b 30 5d 20 3d 20 63 6e 74 3b 0a 0a 20 20 20 20  [0] = cnt;..    
c2a0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 73    /* Make sure s
c2b0: 75 66 66 69 63 69 65 6e 74 20 6e 75 6d 62 65 72  ufficient number
c2c0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68 61   of registers ha
c2d0: 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
c2e0: 64 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73  d */.      pPars
c2f0: 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 20 70  e->nMem = MAX( p
c300: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 38 2b 6d  Parse->nMem, 8+m
c310: 78 49 64 78 20 29 3b 0a 20 20 20 20 20 20 73 71  xIdx );.      sq
c320: 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
c330: 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
c340: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  .      /* Do the
c350: 20 62 2d 74 72 65 65 20 69 6e 74 65 67 72 69 74   b-tree integrit
c360: 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20 20 20 20  y checks */.    
c370: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c380: 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 65 67 72  Op4(v, OP_Integr
c390: 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74 2c 20 31  ityCk, 2, cnt, 1
c3a0: 2c 20 28 63 68 61 72 2a 29 61 52 6f 6f 74 2c 50  , (char*)aRoot,P
c3b0: 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 20  4_INTARRAY);.   
c3c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
c3d0: 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 69 29  angeP5(v, (u8)i)
c3e0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
c3f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c400: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32  (v, OP_IsNull, 2
c410: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
c420: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
c430: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
c440: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c  P_String8, 0, 3,
c450: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   0,.         sql
c460: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
c470: 22 2a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  "*** in database
c480: 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e   %s ***\n", db->
c490: 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[i].zDbSName)
c4a0: 2c 0a 20 20 20 20 20 20 20 20 20 50 34 5f 44 59  ,.         P4_DY
c4b0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71  NAMIC);.      sq
c4c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c4d0: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c  v, OP_Concat, 2,
c4e0: 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 6e   3, 3);.      in
c4f0: 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75  tegrityCheckResu
c500: 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20  ltRow(v);.      
c510: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
c520: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20  ere(v, addr);.. 
c530: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
c540: 65 20 61 6c 6c 20 74 68 65 20 69 6e 64 69 63 65  e all the indice
c550: 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74 65  s are constructe
c560: 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20  d correctly..   
c570: 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28     */.      for(
c580: 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  x=sqliteHashFirs
c590: 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73  t(pTbls); x; x=s
c5a0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29  qliteHashNext(x)
c5b0: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
c5c0: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
c5d0: 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20  ashData(x);.    
c5e0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c      Index *pIdx,
c5f0: 20 2a 70 50 6b 3b 0a 20 20 20 20 20 20 20 20 49   *pPk;.        I
c600: 6e 64 65 78 20 2a 70 50 72 69 6f 72 20 3d 20 30  ndex *pPrior = 0
c610: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 6f  ;.        int lo
c620: 6f 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  opTop;.        i
c630: 6e 74 20 69 44 61 74 61 43 75 72 2c 20 69 49 64  nt iDataCur, iId
c640: 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  xCur;.        in
c650: 74 20 72 31 20 3d 20 2d 31 3b 0a 0a 20 20 20 20  t r1 = -1;..    
c660: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
c670: 75 6d 3c 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  um<1 ) continue;
c680: 20 20 2f 2a 20 53 6b 69 70 20 56 49 45 57 73 20    /* Skip VIEWs 
c690: 6f 72 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  or VIRTUAL TABLE
c6a0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 6b  s */.        pPk
c6b0: 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61 62   = HasRowid(pTab
c6c0: 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 50  ) ? 0 : sqlite3P
c6d0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
c6e0: 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Tab);.        sq
c6f0: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e  lite3OpenTableAn
c700: 64 49 6e 64 69 63 65 73 28 70 50 61 72 73 65 2c  dIndices(pParse,
c710: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
c720: 61 64 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ad, 0,.         
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
c750: 26 69 44 61 74 61 43 75 72 2c 20 26 69 49 64 78  &iDataCur, &iIdx
c760: 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Cur);.        /*
c770: 20 72 65 67 5b 37 5d 20 63 6f 75 6e 74 73 20 74   reg[7] counts t
c780: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
c790: 72 69 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c  ries in the tabl
c7a0: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e..        ** re
c7b0: 67 5b 38 2b 69 5d 20 63 6f 75 6e 74 73 20 74 68  g[8+i] counts th
c7c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
c7d0: 69 65 73 20 69 6e 20 74 68 65 20 69 2d 74 68 20  ies in the i-th 
c7e0: 69 6e 64 65 78 20 0a 20 20 20 20 20 20 20 20 2a  index .        *
c7f0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
c800: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c810: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 37 29  P_Integer, 0, 7)
c820: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
c830: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
c840: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
c850: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b  =pIdx->pNext, j+
c860: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
c870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c880: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
c890: 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65 78  , 8+j); /* index
c8a0: 20 65 6e 74 72 69 65 73 20 63 6f 75 6e 74 65 72   entries counter
c8b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
c8c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c8d0: 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20  arse->nMem>=8+j 
c8e0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
c8f0: 74 28 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70  t( sqlite3NoTemp
c900: 73 49 6e 52 61 6e 67 65 28 70 50 61 72 73 65 2c  sInRange(pParse,
c910: 31 2c 37 2b 6a 29 20 29 3b 0a 20 20 20 20 20 20  1,7+j) );.      
c920: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c930: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
c940: 2c 20 69 44 61 74 61 43 75 72 2c 20 30 29 3b 20  , iDataCur, 0); 
c950: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
c960: 0a 20 20 20 20 20 20 20 20 6c 6f 6f 70 54 6f 70  .        loopTop
c970: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c980: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
c990: 6d 2c 20 37 2c 20 31 29 3b 0a 20 20 20 20 20 20  m, 7, 1);.      
c9a0: 20 20 69 66 28 20 21 69 73 51 75 69 63 6b 20 29    if( !isQuick )
c9b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
c9c0: 61 6e 69 74 79 20 63 68 65 63 6b 20 6f 6e 20 72  anity check on r
c9d0: 65 63 6f 72 64 20 68 65 61 64 65 72 20 64 65 63  ecord header dec
c9e0: 6f 64 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  oding */.       
c9f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ca00: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
ca10: 6e 2c 20 69 44 61 74 61 43 75 72 2c 20 70 54 61  n, iDataCur, pTa
ca20: 62 2d 3e 6e 43 6f 6c 2d 31 2c 20 33 29 3b 0a 20  b->nCol-1, 3);. 
ca30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ca40: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
ca50: 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
ca60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ca70: 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
ca80: 68 61 74 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c  hat all NOT NULL
ca90: 20 63 6f 6c 75 6d 6e 73 20 72 65 61 6c 6c 79 20   columns really 
caa0: 61 72 65 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a  are NOT NULL */.
cab0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
cac0: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
cad0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
cae0: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20  har *zErr;.     
caf0: 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 3b 0a 20       int jmp2;. 
cb00: 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
cb10: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f  pTab->iPKey ) co
cb20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
cb30: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
cb40: 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  [j].notNull==0 )
cb50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
cb60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cb70: 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
cb80: 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 44  able(v, pTab, iD
cb90: 61 74 61 43 75 72 2c 20 6a 2c 20 33 29 3b 0a 20  ataCur, j, 3);. 
cba0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cbb0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
cbc0: 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
cbd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70  );.          jmp
cbe0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
cbf0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
cc00: 75 6c 6c 2c 20 33 29 3b 20 56 64 62 65 43 6f 76  ull, 3); VdbeCov
cc10: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
cc20: 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74      zErr = sqlit
cc30: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 4e  e3MPrintf(db, "N
cc40: 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 25 73 2e  ULL value in %s.
cc50: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
cc60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
cc90: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
cca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ccb0: 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
ccc0: 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c 20   0, 3, 0, zErr, 
ccd0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
cce0: 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74 79         integrity
ccf0: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76  CheckResultRow(v
cd00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
cd10: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
cd20: 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20  (v, jmp2);.     
cd30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
cd40: 56 65 72 69 66 79 20 43 48 45 43 4b 20 63 6f 6e  Verify CHECK con
cd50: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
cd60: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 43      if( pTab->pC
cd70: 68 65 63 6b 20 26 26 20 28 64 62 2d 3e 66 6c 61  heck && (db->fla
cd80: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 67 6e 6f  gs & SQLITE_Igno
cd90: 72 65 43 68 65 63 6b 73 29 3d 3d 30 20 29 7b 0a  reChecks)==0 ){.
cda0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
cdb0: 73 74 20 2a 70 43 68 65 63 6b 20 3d 20 73 71 6c  st *pCheck = sql
cdc0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
cdd0: 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  db, pTab->pCheck
cde0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
cdf0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
ce00: 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iled==0 ){.     
ce10: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 43         int addrC
ce20: 6b 46 61 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  kFault = sqlite3
ce30: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ce40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
ce50: 74 20 61 64 64 72 43 6b 4f 6b 20 3d 20 73 71 6c  t addrCkOk = sql
ce60: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
ce70: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l(v);.          
ce80: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
ce90: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
cea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
ceb0: 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20  rse->iSelfTab = 
cec0: 69 44 61 74 61 43 75 72 20 2b 20 31 3b 0a 20 20  iDataCur + 1;.  
ced0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
cee0: 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72 2d 31 3b  pCheck->nExpr-1;
cef0: 20 6b 3e 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20   k>0; k--){.    
cf00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cf10: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
cf20: 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b 6b  rse, pCheck->a[k
cf30: 5d 2e 70 45 78 70 72 2c 20 61 64 64 72 43 6b 46  ].pExpr, addrCkF
cf40: 61 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ault, 0);.      
cf50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cf60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
cf70: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 43  fTrue(pParse, pC
cf80: 68 65 63 6b 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  heck->a[0].pExpr
cf90: 2c 20 61 64 64 72 43 6b 4f 6b 2c 20 0a 20 20 20  , addrCkOk, .   
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
cfb0: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
cfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
cfd0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
cfe0: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 46 61  abel(v, addrCkFa
cff0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ult);.          
d000: 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54    pParse->iSelfT
d010: 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ab = 0;.        
d020: 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74      zErr = sqlit
d030: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43  e3MPrintf(db, "C
d040: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
d050: 66 61 69 6c 65 64 20 69 6e 20 25 73 22 2c 0a 20  failed in %s",. 
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d070: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
d080: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d090: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
d0a0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20  _String8, 0, 3, 
d0b0: 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41  0, zErr, P4_DYNA
d0c0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  MIC);.          
d0d0: 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b    integrityCheck
d0e0: 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20  ResultRow(v);.  
d0f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d100: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d110: 6c 28 76 2c 20 61 64 64 72 43 6b 4f 6b 29 3b 0a  l(v, addrCkOk);.
d120: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d140: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
d150: 70 43 68 65 63 6b 29 3b 0a 20 20 20 20 20 20 20  pCheck);.       
d160: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
d170: 69 73 51 75 69 63 6b 20 29 7b 20 2f 2a 20 4f 6d  isQuick ){ /* Om
d180: 69 74 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  it the remaining
d190: 20 74 65 73 74 73 20 66 6f 72 20 71 75 69 63 6b   tests for quick
d1a0: 5f 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20  _check */.      
d1b0: 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20      /* Validate 
d1c0: 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 66 6f  index entries fo
d1d0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
d1e0: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  w */.          f
d1f0: 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61  or(j=0, pIdx=pTa
d200: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
d210: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
d220: 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t, j++){.       
d230: 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 2c 20 6a       int jmp2, j
d240: 6d 70 33 2c 20 6a 6d 70 34 2c 20 6a 6d 70 35 3b  mp3, jmp4, jmp5;
d250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d260: 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c 69 74 65   ckUniq = sqlite
d270: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
d280: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
d290: 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20 63  f( pPk==pIdx ) c
d2a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d2b0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
d2c0: 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
d2d0: 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20  y(pParse, pIdx, 
d2e0: 69 44 61 74 61 43 75 72 2c 20 30 2c 20 30 2c 20  iDataCur, 0, 0, 
d2f0: 26 6a 6d 70 33 2c 0a 20 20 20 20 20 20 20 20 20  &jmp3,.         
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20 20 20  pPrior, r1);.   
d330: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20           pPrior 
d340: 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
d350: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d360: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
d370: 6d 6d 2c 20 38 2b 6a 2c 20 31 29 3b 2f 2a 20 69  mm, 8+j, 1);/* i
d380: 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72 79 20 63  ncrement entry c
d390: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ount */.        
d3a0: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
d3b0: 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
d3c0: 79 20 65 78 69 73 74 73 20 66 6f 72 20 74 68 65  y exists for the
d3d0: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 72   current table r
d3e0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ow */.          
d3f0: 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33    jmp2 = sqlite3
d400: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
d410: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 49 64 78 43   OP_Found, iIdxC
d420: 75 72 2b 6a 2c 20 63 6b 55 6e 69 71 2c 20 72 31  ur+j, ckUniq, r1
d430: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
d460: 6e 43 6f 6c 75 6d 6e 29 3b 20 56 64 62 65 43 6f  nColumn); VdbeCo
d470: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
d480: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d490: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
d4a0: 33 2c 20 22 72 6f 77 20 22 29 3b 0a 20 20 20 20  3, "row ");.    
d4b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d4c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d4d0: 43 6f 6e 63 61 74 2c 20 37 2c 20 33 2c 20 33 29  Concat, 7, 3, 3)
d4e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d4f0: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
d500: 69 6e 67 28 76 2c 20 34 2c 20 22 20 6d 69 73 73  ing(v, 4, " miss
d510: 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78 20 22  ing from index "
d520: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d530: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d540: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34  (v, OP_Concat, 4
d550: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 3, 3);.       
d560: 20 20 20 20 20 6a 6d 70 35 20 3d 20 73 71 6c 69       jmp5 = sqli
d570: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
d580: 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e  g(v, 4, pIdx->zN
d590: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
d5a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d5b0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
d5c0: 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20  , 4, 3, 3);.    
d5d0: 20 20 20 20 20 20 20 20 6a 6d 70 34 20 3d 20 69          jmp4 = i
d5e0: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73  ntegrityCheckRes
d5f0: 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20  ultRow(v);.     
d600: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d610: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
d620: 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p2);.           
d630: 20 2f 2a 20 46 6f 72 20 55 4e 49 51 55 45 20 69   /* For UNIQUE i
d640: 6e 64 65 78 65 73 2c 20 76 65 72 69 66 79 20 74  ndexes, verify t
d650: 68 61 74 20 6f 6e 6c 79 20 6f 6e 65 20 65 6e 74  hat only one ent
d660: 72 79 20 65 78 69 73 74 73 20 77 69 74 68 20 74  ry exists with t
d670: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
d680: 2a 20 63 75 72 72 65 6e 74 20 6b 65 79 2e 20 20  * current key.  
d690: 54 68 65 20 65 6e 74 72 79 20 69 73 20 75 6e 69  The entry is uni
d6a0: 71 75 65 20 69 66 20 28 31 29 20 61 6e 79 20 63  que if (1) any c
d6b0: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 0a 20 20  olumn is NULL.  
d6c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
d6d0: 28 32 29 20 74 68 65 20 6e 65 78 74 20 65 6e 74  (2) the next ent
d6e0: 72 79 20 68 61 73 20 61 20 64 69 66 66 65 72 65  ry has a differe
d6f0: 6e 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20  nt key */.      
d700: 20 20 20 20 20 20 69 66 28 20 49 73 55 6e 69 71        if( IsUniq
d710: 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b  ueIndex(pIdx) ){
d720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
d730: 6e 74 20 75 6e 69 71 4f 6b 20 3d 20 73 71 6c 69  nt uniqOk = sqli
d740: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d750: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d760: 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20 20 20     int jmp6;.   
d770: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
d780: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
d790: 20 66 6f 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49   for(kk=0; kk<pI
d7a0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b  dx->nKeyCol; kk+
d7b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
d7c0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
d7d0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 6b  Idx->aiColumn[kk
d7e0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
d7f0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 21     assert( iCol!
d800: 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20 69 43 6f  =XN_ROWID && iCo
d810: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  l<pTab->nCol );.
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70  if( iCol>=0 && p
d840: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
d850: 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f 6e 74 69 6e  notNull ) contin
d860: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
d870: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d880: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
d890: 6c 6c 2c 20 72 31 2b 6b 6b 2c 20 75 6e 69 71 4f  ll, r1+kk, uniqO
d8a0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
d8b0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
d8c0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d8d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
d8e0: 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69 74 65     jmp6 = sqlite
d8f0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
d900: 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2b  P_Next, iIdxCur+
d910: 6a 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  j); VdbeCoverage
d920: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d930: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
d940: 74 6f 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20  to(v, uniqOk);. 
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
d960: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
d970: 28 76 2c 20 6a 6d 70 36 29 3b 0a 20 20 20 20 20  (v, jmp6);.     
d980: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d990: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
d9a0: 20 4f 50 5f 49 64 78 47 54 2c 20 69 49 64 78 43   OP_IdxGT, iIdxC
d9b0: 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b 2c 20 72 31  ur+j, uniqOk, r1
d9c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9e0: 20 20 20 20 20 70 49 64 78 2d 3e 6e 4b 65 79 43       pIdx->nKeyC
d9f0: 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
da00: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
da10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
da20: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20  oadString(v, 3, 
da30: 22 6e 6f 6e 2d 75 6e 69 71 75 65 20 65 6e 74 72  "non-unique entr
da40: 79 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20  y in index ");. 
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
da60: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
da70: 6a 6d 70 35 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp5);.         
da80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
da90: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
daa0: 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20  uniqOk);.       
dab0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
dac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
dad0: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b  mpHere(v, jmp4);
dae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
daf0: 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49  ite3ResolvePartI
db00: 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20  dxLabel(pParse, 
db10: 6a 6d 70 33 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp3);.         
db20: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
db30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
db40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
db50: 74 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 6f 6f  t, iDataCur, loo
db60: 70 54 6f 70 29 3b 20 56 64 62 65 43 6f 76 65 72  pTop); VdbeCover
db70: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
db80: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
db90: 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31  ere(v, loopTop-1
dba0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
dbb0: 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
dbc0: 54 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  T.        if( !i
dbd0: 73 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20 20  sQuick ){.      
dbe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
dbf0: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 32 2c 20  oadString(v, 2, 
dc00: 22 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72  "wrong # of entr
dc10: 69 65 73 20 69 6e 20 69 6e 64 65 78 20 22 29 3b  ies in index ");
dc20: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
dc30: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
dc40: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
dc50: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
dc60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
dc70: 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29   if( pPk==pIdx )
dc80: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
dc90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dca0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
dcb0: 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2b 6a 2c  ount, iIdxCur+j,
dcc0: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   3);.           
dcd0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
dce0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
dcf0: 45 71 2c 20 38 2b 6a 2c 20 30 2c 20 33 29 3b 20  Eq, 8+j, 0, 3); 
dd00: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
dd10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
dd20: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
dd30: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55  (v, SQLITE_NOTNU
dd40: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  LL);.           
dd50: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
dd60: 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 70 49 64  String(v, 4, pId
dd70: 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
dd80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dd90: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
dda0: 6f 6e 63 61 74 2c 20 34 2c 20 32 2c 20 33 29 3b  oncat, 4, 2, 3);
ddb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
ddc0: 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c  egrityCheckResul
ddd0: 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20 20  tRow(v);.       
dde0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ddf0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
de00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
de10: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20         }.#endif 
de20: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
de30: 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20  TREECOUNT */.   
de40: 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 20 20     } .    }.    
de50: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
de60: 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56  onst int iLn = V
de70: 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e  DBE_OFFSET_LINEN
de80: 4f 28 32 29 3b 0a 20 20 20 20 20 20 73 74 61 74  O(2);.      stat
de90: 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c  ic const VdbeOpL
dea0: 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20 3d 20  ist endCode[] = 
deb0: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 41  {.        { OP_A
dec0: 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30  ddImm,      1, 0
ded0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
dee0: 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 0 */.        
def0: 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  { OP_IfNotZero, 
df00: 20 20 31 2c 20 34 2c 20 20 20 20 20 20 20 20 30    1, 4,        0
df10: 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  },    /* 1 */.  
df20: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
df30: 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20 20 20  g8,     0, 3,   
df40: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32       0},    /* 2
df50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
df60: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 33 2c  _ResultRow,   3,
df70: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   1,        0},  
df80: 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20    /* 3 */.      
df90: 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20    { OP_Halt,    
dfa0: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
dfb0: 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a   0},    /* 4 */.
dfc0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72          { OP_Str
dfd0: 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20  ing8,     0, 3, 
dfe0: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
dff0: 20 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   5 */.        { 
e000: 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 20  OP_Goto,        
e010: 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 3,        0},
e020: 20 20 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20      /* 6 */.    
e030: 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f    };.      VdbeO
e040: 70 20 2a 61 4f 70 3b 0a 0a 20 20 20 20 20 20 61  p *aOp;..      a
e050: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
e060: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
e070: 61 79 53 69 7a 65 28 65 6e 64 43 6f 64 65 29 2c  aySize(endCode),
e080: 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a   endCode, iLn);.
e090: 20 20 20 20 20 20 69 66 28 20 61 4f 70 20 29 7b        if( aOp ){
e0a0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  .        aOp[0].
e0b0: 70 32 20 3d 20 31 2d 6d 78 45 72 72 3b 0a 20 20  p2 = 1-mxErr;.  
e0c0: 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 74        aOp[2].p4t
e0d0: 79 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b  ype = P4_STATIC;
e0e0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e  .        aOp[2].
e0f0: 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a 20 20 20  p4.z = "ok";.   
e100: 20 20 20 20 20 61 4f 70 5b 35 5d 2e 70 34 74 79       aOp[5].p4ty
e110: 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b 0a  pe = P4_STATIC;.
e120: 20 20 20 20 20 20 20 20 61 4f 70 5b 35 5d 2e 70          aOp[5].p
e130: 34 2e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  4.z = (char*)sql
e140: 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
e150: 45 5f 43 4f 52 52 55 50 54 29 3b 0a 20 20 20 20  E_CORRUPT);.    
e160: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
e170: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
e180: 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
e190: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
e1a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
e1b0: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  eak;.#endif /* S
e1c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
e1d0: 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
e1e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e1f0: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 0a 20 20  IT_UTF16.  /*.  
e200: 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f  **   PRAGMA enco
e210: 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41 47  ding.  **   PRAG
e220: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75  MA encoding = "u
e230: 74 66 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c 22  tf-8"|"utf-16"|"
e240: 75 74 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31  utf-16le"|"utf-1
e250: 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  6be".  **.  ** I
e260: 6e 20 69 74 73 20 66 69 72 73 74 20 66 6f 72 6d  n its first form
e270: 2c 20 74 68 69 73 20 70 72 61 67 6d 61 20 72 65  , this pragma re
e280: 74 75 72 6e 73 20 74 68 65 20 65 6e 63 6f 64 69  turns the encodi
e290: 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 20  ng of the main. 
e2a0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49 66   ** database. If
e2b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
e2c0: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   not initialized
e2d0: 2c 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  , it is initiali
e2e0: 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20  zed now..  **.  
e2f0: 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
e300: 72 6d 20 6f 66 20 74 68 69 73 20 70 72 61 67 6d  rm of this pragm
e310: 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  a is a no-op if 
e320: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
e330: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73 20  e file.  ** has 
e340: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
e350: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 6e   initialized. In
e360: 20 74 68 69 73 20 63 61 73 65 20 69 74 20 73 65   this case it se
e370: 74 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20  ts the default. 
e380: 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68 61   ** encoding tha
e390: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  t will be used f
e3a0: 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
e3b0: 62 61 73 65 20 66 69 6c 65 20 69 66 20 61 20 6e  base file if a n
e3c0: 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20  ew file.  ** is 
e3d0: 63 72 65 61 74 65 64 2e 20 49 66 20 61 6e 20 65  created. If an e
e3e0: 78 69 73 74 69 6e 67 20 6d 61 69 6e 20 64 61 74  xisting main dat
e3f0: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
e400: 65 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20  ened, then the. 
e410: 20 2a 2a 20 64 65 66 61 75 6c 74 20 74 65 78 74   ** default text
e420: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
e430: 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e existing datab
e440: 61 73 65 20 69 73 20 75 73 65 64 2e 0a 20 20 2a  ase is used..  *
e450: 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20 63  * .  ** In all c
e460: 61 73 65 73 20 6e 65 77 20 64 61 74 61 62 61 73  ases new databas
e470: 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  es created using
e480: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
e490: 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63 72 65  and are.  ** cre
e4a0: 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  ated to use the 
e4b0: 73 61 6d 65 20 64 65 66 61 75 6c 74 20 74 65 78  same default tex
e4c0: 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 74 68  t encoding as th
e4d0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e  e main database.
e4e0: 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61 69   If.  ** the mai
e4f0: 6e 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e  n database has n
e500: 6f 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  ot been initiali
e510: 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72 65 61 74  zed and/or creat
e520: 65 64 20 77 68 65 6e 20 41 54 54 41 43 48 0a 20  ed when ATTACH. 
e530: 20 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64 2c   ** is executed,
e540: 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   this is done be
e550: 66 6f 72 65 20 74 68 65 20 41 54 54 41 43 48 20  fore the ATTACH 
e560: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a  operation..  **.
e570: 20 20 2a 2a 20 49 6e 20 74 68 65 20 73 65 63 6f    ** In the seco
e580: 6e 64 20 66 6f 72 6d 20 74 68 69 73 20 70 72 61  nd form this pra
e590: 67 6d 61 20 73 65 74 73 20 74 68 65 20 74 65 78  gma sets the tex
e5a0: 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65  t encoding to be
e5b0: 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e 65   used in.  ** ne
e5c0: 77 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  w database files
e5d0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
e5e0: 68 69 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  his database han
e5f0: 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a  dle. It is only.
e600: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 66 20 69    ** useful if i
e610: 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74 65  nvoked immediate
e620: 6c 79 20 61 66 74 65 72 20 74 68 65 20 6d 61 69  ly after the mai
e630: 6e 20 64 61 74 61 62 61 73 65 20 69 0a 20 20 2a  n database i.  *
e640: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
e650: 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20 20 20  _ENCODING: {.   
e660: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
e670: 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 7b 0a 20  ruct EncName {. 
e680: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
e690: 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63 3b 0a  ;.      u8 enc;.
e6a0: 20 20 20 20 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d      } encnames[]
e6b0: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 55 54   = {.      { "UT
e6c0: 46 38 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  F8",     SQLITE_
e6d0: 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c 0a 20  UTF8        },. 
e6e0: 20 20 20 20 20 7b 20 22 55 54 46 2d 38 22 2c 20       { "UTF-8", 
e6f0: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20     SQLITE_UTF8  
e700: 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73        },  /* Mus
e710: 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 31 5d  t be element [1]
e720: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46   */.      { "UTF
e730: 2d 31 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55  -16le", SQLITE_U
e740: 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 20 20 2f  TF16LE     },  /
e750: 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e  * Must be elemen
e760: 74 20 5b 32 5d 20 2a 2f 0a 20 20 20 20 20 20 7b  t [2] */.      {
e770: 20 22 55 54 46 2d 31 36 62 65 22 2c 20 53 51 4c   "UTF-16be", SQL
e780: 49 54 45 5f 55 54 46 31 36 42 45 20 20 20 20 20  ITE_UTF16BE     
e790: 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65  },  /* Must be e
e7a0: 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a 20 20  lement [3] */.  
e7b0: 20 20 20 20 7b 20 22 55 54 46 31 36 6c 65 22 2c      { "UTF16le",
e7c0: 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45    SQLITE_UTF16LE
e7d0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
e7e0: 22 55 54 46 31 36 62 65 22 2c 20 20 53 51 4c 49  "UTF16be",  SQLI
e7f0: 54 45 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d  TE_UTF16BE     }
e800: 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31  ,.      { "UTF-1
e810: 36 22 2c 20 20 20 30 20 20 20 20 20 20 20 20 20  6",   0         
e820: 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53           }, /* S
e830: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
e840: 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54  E */.      { "UT
e850: 46 31 36 22 2c 20 20 20 20 30 20 20 20 20 20 20  F16",    0      
e860: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f              }, /
e870: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
e880: 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20  TIVE */.      { 
e890: 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20  0, 0 }.    };.  
e8a0: 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45    const struct E
e8b0: 6e 63 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a 20 20  ncName *pEnc;.  
e8c0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
e8d0: 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65      /* "PRAGMA e
e8e0: 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20 20  ncoding" */.    
e8f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
e900: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
e910: 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75  ) goto pragma_ou
e920: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
e930: 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45   encnames[SQLITE
e940: 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49  _UTF8].enc==SQLI
e950: 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20  TE_UTF8 );.     
e960: 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65   assert( encname
e970: 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  s[SQLITE_UTF16LE
e980: 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ].enc==SQLITE_UT
e990: 46 31 36 4c 45 20 29 3b 0a 20 20 20 20 20 20 61  F16LE );.      a
e9a0: 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b  ssert( encnames[
e9b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 5d 2e  SQLITE_UTF16BE].
e9c0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
e9d0: 36 42 45 20 29 3b 0a 20 20 20 20 20 20 72 65 74  6BE );.      ret
e9e0: 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c  urnSingleText(v,
e9f0: 20 65 6e 63 6e 61 6d 65 73 5b 45 4e 43 28 70 50   encnames[ENC(pP
ea00: 61 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61 6d 65  arse->db)].zName
ea10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20  );.    }else{   
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 20 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20       /* "PRAGMA 
ea40: 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58 58 22 20  encoding = XXX" 
ea50: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79  */.      /* Only
ea60: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
ea70: 65 20 6f 66 20 73 71 6c 69 74 65 2e 65 6e 63 20  e of sqlite.enc 
ea80: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
ea90: 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 0a 20 20  handle is not.  
eaa0: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
eab0: 65 64 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20  ed. If the main 
eac0: 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2c  database exists,
ead0: 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 2e   the new sqlite.
eae0: 65 6e 63 20 76 61 6c 75 65 0a 20 20 20 20 20 20  enc value.      
eaf0: 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  ** will be overw
eb00: 72 69 74 74 65 6e 20 77 68 65 6e 20 74 68 65 20  ritten when the 
eb10: 73 63 68 65 6d 61 20 69 73 20 6e 65 78 74 20 6c  schema is next l
eb20: 6f 61 64 65 64 2e 20 49 66 20 69 74 20 64 6f 65  oaded. If it doe
eb30: 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61  s not.      ** a
eb40: 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c 20 69  lready exists, i
eb50: 74 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  t will be create
eb60: 64 20 74 6f 20 75 73 65 20 74 68 65 20 6e 65 77  d to use the new
eb70: 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c 75 65 2e   encoding value.
eb80: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
eb90: 69 66 28 20 0a 20 20 20 20 20 20 20 20 21 28 44  if( .        !(D
eba0: 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
ebb0: 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61   0, DB_SchemaLoa
ebc0: 64 65 64 29 29 20 7c 7c 20 0a 20 20 20 20 20 20  ded)) || .      
ebd0: 20 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28    DbHasProperty(
ebe0: 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70 74 79 29  db, 0, DB_Empty)
ebf0: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
ec00: 20 20 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e 63     for(pEnc=&enc
ec10: 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e  names[0]; pEnc->
ec20: 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a  zName; pEnc++){.
ec30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d            if( 0=
ec40: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
ec50: 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e 7a 4e  zRight, pEnc->zN
ec60: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
ec70: 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 64      SCHEMA_ENC(d
ec80: 62 29 20 3d 20 45 4e 43 28 64 62 29 20 3d 0a 20  b) = ENC(db) =. 
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
eca0: 45 6e 63 2d 3e 65 6e 63 20 3f 20 70 45 6e 63 2d  Enc->enc ? pEnc-
ecb0: 3e 65 6e 63 20 3a 20 53 51 4c 49 54 45 5f 55 54  >enc : SQLITE_UT
ecc0: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 20  F16NATIVE;.     
ecd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ece0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ecf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
ed00: 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b 0a  !pEnc->zName ){.
ed10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ed20: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ed30: 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 65  , "unsupported e
ed40: 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c 20 7a 52  ncoding: %s", zR
ed50: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  ight);.        }
ed60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ed70: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
ed80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ed90: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
eda0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
edb0: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50  SCHEMA_VERSION_P
edc0: 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a  RAGMAS.  /*.  **
edd0: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
ede0: 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  a.]schema_versio
edf0: 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  n.  **   PRAGMA 
ee00: 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f  [schema.]schema_
ee10: 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67  version = <integ
ee20: 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  er>.  **.  **   
ee30: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
ee40: 75 73 65 72 5f 76 65 72 73 69 6f 6e 0a 20 20 2a  user_version.  *
ee50: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
ee60: 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e  ma.]user_version
ee70: 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a   = <integer>.  *
ee80: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
ee90: 5b 73 63 68 65 6d 61 2e 5d 66 72 65 65 6c 69 73  [schema.]freelis
eea0: 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a  t_count.  **.  *
eeb0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
eec0: 6d 61 2e 5d 64 61 74 61 5f 76 65 72 73 69 6f 6e  ma.]data_version
eed0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  **.  **   PRA
eee0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70  GMA [schema.]app
eef0: 6c 69 63 61 74 69 6f 6e 5f 69 64 0a 20 20 2a 2a  lication_id.  **
ef00: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
ef10: 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69  a.]application_i
ef20: 64 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20  d = <integer>.  
ef30: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70 72 61 67  **.  ** The prag
ef40: 6d 61 27 73 20 73 63 68 65 6d 61 5f 76 65 72 73  ma's schema_vers
ef50: 69 6f 6e 20 61 6e 64 20 75 73 65 72 5f 76 65 72  ion and user_ver
ef60: 73 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  sion are used to
ef70: 20 73 65 74 20 6f 72 20 67 65 74 0a 20 20 2a 2a   set or get.  **
ef80: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
ef90: 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e  e schema-version
efa0: 20 61 6e 64 20 75 73 65 72 2d 76 65 72 73 69 6f   and user-versio
efb0: 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  n, respectively.
efc0: 20 42 6f 74 68 0a 20 20 2a 2a 20 74 68 65 20 73   Both.  ** the s
efd0: 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e  chema-version an
efe0: 64 20 74 68 65 20 75 73 65 72 2d 76 65 72 73 69  d the user-versi
eff0: 6f 6e 20 61 72 65 20 33 32 2d 62 69 74 20 73 69  on are 32-bit si
f000: 67 6e 65 64 20 69 6e 74 65 67 65 72 73 0a 20 20  gned integers.  
f010: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
f020: 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
f030: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
f040: 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 69 73  schema-cookie is
f050: 20 75 73 75 61 6c 6c 79 20 6f 6e 6c 79 20 6d 61   usually only ma
f060: 6e 69 70 75 6c 61 74 65 64 20 69 6e 74 65 72 6e  nipulated intern
f070: 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20  ally by SQLite. 
f080: 49 74 0a 20 20 2a 2a 20 69 73 20 69 6e 63 72 65  It.  ** is incre
f090: 6d 65 6e 74 65 64 20 62 79 20 53 51 4c 69 74 65  mented by SQLite
f0a0: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 64 61   whenever the da
f0b0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
f0c0: 20 6d 6f 64 69 66 69 65 64 20 28 62 79 0a 20 20   modified (by.  
f0d0: 2a 2a 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  ** creating or d
f0e0: 72 6f 70 70 69 6e 67 20 61 20 74 61 62 6c 65 20  ropping a table 
f0f0: 6f 72 20 69 6e 64 65 78 29 2e 20 54 68 65 20 73  or index). The s
f100: 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 69 73  chema version is
f110: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 53 51   used by.  ** SQ
f120: 4c 69 74 65 20 65 61 63 68 20 74 69 6d 65 20 61  Lite each time a
f130: 20 71 75 65 72 79 20 69 73 20 65 78 65 63 75 74   query is execut
f140: 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
f150: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  t the internal c
f160: 61 63 68 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ache.  ** of the
f170: 20 73 63 68 65 6d 61 20 75 73 65 64 20 77 68 65   schema used whe
f180: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20  n compiling the 
f190: 53 51 4c 20 71 75 65 72 79 20 6d 61 74 63 68 65  SQL query matche
f1a0: 73 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 0a  s the schema of.
f1b0: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
f1c0: 65 20 61 67 61 69 6e 73 74 20 77 68 69 63 68 20  e against which 
f1d0: 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 71 75 65  the compiled que
f1e0: 72 79 20 69 73 20 61 63 74 75 61 6c 6c 79 20 65  ry is actually e
f1f0: 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 53 75  xecuted..  ** Su
f200: 62 76 65 72 74 69 6e 67 20 74 68 69 73 20 6d 65  bverting this me
f210: 63 68 61 6e 69 73 6d 20 62 79 20 75 73 69 6e 67  chanism by using
f220: 20 22 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f   "PRAGMA schema_
f230: 76 65 72 73 69 6f 6e 22 20 74 6f 20 6d 6f 64 69  version" to modi
f240: 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  fy.  ** the sche
f250: 6d 61 2d 76 65 72 73 69 6f 6e 20 69 73 20 70 6f  ma-version is po
f260: 74 65 6e 74 69 61 6c 6c 79 20 64 61 6e 67 65 72  tentially danger
f270: 6f 75 73 20 61 6e 64 20 6d 61 79 20 6c 65 61 64  ous and may lead
f280: 20 74 6f 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2a   to program.  **
f290: 20 63 72 61 73 68 65 73 20 6f 72 20 64 61 74 61   crashes or data
f2a0: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
f2b0: 20 55 73 65 20 77 69 74 68 20 63 61 75 74 69 6f   Use with cautio
f2c0: 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n!.  **.  ** The
f2d0: 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 69 73   user-version is
f2e0: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
f2f0: 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20  ally by SQLite. 
f300: 49 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 62  It may be used b
f310: 79 0a 20 20 2a 2a 20 61 70 70 6c 69 63 61 74 69  y.  ** applicati
f320: 6f 6e 73 20 66 6f 72 20 61 6e 79 20 70 75 72 70  ons for any purp
f330: 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ose..  */.  case
f340: 20 50 72 61 67 54 79 70 5f 48 45 41 44 45 52 5f   PragTyp_HEADER_
f350: 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 6e 74  VALUE: {.    int
f360: 20 69 43 6f 6f 6b 69 65 20 3d 20 70 50 72 61 67   iCookie = pPrag
f370: 6d 61 2d 3e 69 41 72 67 3b 20 20 2f 2a 20 57 68  ma->iArg;  /* Wh
f380: 69 63 68 20 63 6f 6f 6b 69 65 20 74 6f 20 72 65  ich cookie to re
f390: 61 64 20 6f 72 20 77 72 69 74 65 20 2a 2f 0a 20  ad or write */. 
f3a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
f3b0: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
f3c0: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
f3d0: 26 26 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72  && (pPragma->mPr
f3e0: 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
f3f0: 52 65 61 64 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a  ReadOnly)==0 ){.
f400: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
f410: 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f  he specified coo
f420: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  kie value */.   
f430: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f440: 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74 43 6f  VdbeOpList setCo
f450: 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  okie[] = {.     
f460: 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74     { OP_Transact
f470: 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31 2c 20 20  ion,    0,  1,  
f480: 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20  0},    /* 0 */. 
f490: 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43         { OP_SetC
f4a0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20  ookie,      0,  
f4b0: 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20  0,  0},    /* 1 
f4c0: 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  */.      };.    
f4d0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
f4e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f4f0: 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65  VerifyNoMallocRe
f500: 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79 53  quired(v, ArrayS
f510: 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 29 3b  ize(setCookie));
f520: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c  .      aOp = sql
f530: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
f540: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  t(v, ArraySize(s
f550: 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43 6f  etCookie), setCo
f560: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  okie, 0);.      
f570: 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c  if( ONLY_IF_REAL
f580: 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d  LOC_STRESS(aOp==
f590: 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  0) ) break;.    
f5a0: 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44    aOp[0].p1 = iD
f5b0: 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e  b;.      aOp[1].
f5c0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
f5d0: 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69 43 6f 6f  aOp[1].p2 = iCoo
f5e0: 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  kie;.      aOp[1
f5f0: 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65 33 41 74  ].p3 = sqlite3At
f600: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
f610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
f620: 52 65 61 64 20 74 68 65 20 73 70 65 63 69 66 69  Read the specifi
f630: 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  ed cookie value 
f640: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
f650: 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
f660: 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d 20 3d 20   readCookie[] = 
f670: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54  {.        { OP_T
f680: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20  ransaction,     
f690: 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f  0,  0,  0},    /
f6a0: 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 0 */.        {
f6b0: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
f6c0: 20 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c       0,  1,  0},
f6d0: 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20      /* 1 */.    
f6e0: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
f6f0: 6f 77 2c 20 20 20 20 20 20 20 31 2c 20 20 31 2c  ow,       1,  1,
f700: 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b 0a 20 20    0}.      };.  
f710: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
f720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f730: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
f740: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
f750: 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65  ySize(readCookie
f760: 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  ));.      aOp = 
f770: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f780: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
f790: 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 2c 72 65  e(readCookie),re
f7a0: 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20 20 20  adCookie,0);.   
f7b0: 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52     if( ONLY_IF_R
f7c0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f  EALLOC_STRESS(aO
f7d0: 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20  p==0) ) break;. 
f7e0: 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d       aOp[0].p1 =
f7f0: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
f800: 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20  1].p1 = iDb;.   
f810: 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 69     aOp[1].p3 = i
f820: 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 73 71  Cookie;.      sq
f830: 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62 6c  lite3VdbeReusabl
f840: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(v);.    }.  }.
f850: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
f860: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
f870: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52  CHEMA_VERSION_PR
f880: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
f890: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
f8a0: 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
f8b0: 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  S.  /*.  **   PR
f8c0: 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f 70 74  AGMA compile_opt
f8d0: 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ions.  **.  ** R
f8e0: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 73 20  eturn the names 
f8f0: 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 2d 74  of all compile-t
f900: 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75 73 65 64  ime options used
f910: 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 0a   in this build,.
f920: 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f 6e 20    ** one option 
f930: 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20  per row..  */.  
f940: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4d  case PragTyp_COM
f950: 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20 7b 0a  PILE_OPTIONS: {.
f960: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
f970: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f980: 4f 70 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Opt;.    pParse-
f990: 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20 20 77  >nMem = 1;.    w
f9a0: 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20 73 71  hile( (zOpt = sq
f9b0: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
f9c0: 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21 3d 30  ion_get(i++))!=0
f9d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f9e0: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
f9f0: 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20 20 20  v, 1, zOpt);.   
fa00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fa10: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
fa20: 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20  tRow, 1, 1);.   
fa30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
fa40: 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20  beReusable(v);. 
fa50: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
fa60: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
fa70: 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f  T_COMPILEOPTION_
fa80: 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  DIAGS */..#ifnde
fa90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
faa0: 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  L.  /*.  **   PR
fab0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 77 61  AGMA [schema.]wa
fac0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 70  l_checkpoint = p
fad0: 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72 65 73 74  assive|full|rest
fae0: 61 72 74 7c 74 72 75 6e 63 61 74 65 0a 20 20 2a  art|truncate.  *
faf0: 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  *.  ** Checkpoin
fb00: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  t the database..
fb10: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
fb20: 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b 50 4f 49  Typ_WAL_CHECKPOI
fb30: 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 42  NT: {.    int iB
fb40: 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69 44 62  t = (pId2->z?iDb
fb50: 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  :SQLITE_MAX_ATTA
fb60: 43 48 45 44 29 3b 0a 20 20 20 20 69 6e 74 20 65  CHED);.    int e
fb70: 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48  Mode = SQLITE_CH
fb80: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
fb90: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
fba0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
fbb0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69  lite3StrICmp(zRi
fbc0: 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d 30 20  ght, "full")==0 
fbd0: 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
fbe0: 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50   = SQLITE_CHECKP
fbf0: 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  OINT_FULL;.     
fc00: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
fc10: 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74  e3StrICmp(zRight
fc20: 2c 20 22 72 65 73 74 61 72 74 22 29 3d 3d 30 20  , "restart")==0 
fc30: 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
fc40: 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50   = SQLITE_CHECKP
fc50: 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a 20 20  OINT_RESTART;.  
fc60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
fc70: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69  lite3StrICmp(zRi
fc80: 67 68 74 2c 20 22 74 72 75 6e 63 61 74 65 22 29  ght, "truncate")
fc90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
fca0: 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48  Mode = SQLITE_CH
fcb0: 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
fcc0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
fcd0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
fce0: 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71 6c 69 74  m = 3;.    sqlit
fcf0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fd00: 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69  OP_Checkpoint, i
fd10: 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a 20  Bt, eMode, 1);. 
fd20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fd30: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
fd40: 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 7d  tRow, 1, 3);.  }
fd50: 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a 0a  .  break;..  /*.
fd60: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61    **   PRAGMA wa
fd70: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
fd80: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77  .  **   PRAGMA w
fd90: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
fda0: 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t = N.  **.  ** 
fdb0: 43 6f 6e 66 69 67 75 72 65 20 61 20 64 61 74 61  Configure a data
fdc0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
fdd0: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
fde0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 20 64 61   checkpoint a da
fdf0: 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 66 74 65  tabase.  ** afte
fe00: 72 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 4e  r accumulating N
fe10: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
fe20: 6f 67 2e 20 4f 72 20 71 75 65 72 79 20 66 6f 72  og. Or query for
fe30: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
fe40: 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20 20  ue.  ** of N..  
fe50: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
fe60: 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50  p_WAL_AUTOCHECKP
fe70: 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 66 28 20  OINT: {.    if( 
fe80: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
fe90: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
fea0: 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 73  checkpoint(db, s
feb0: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
fec0: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  t));.    }.    r
fed0: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
fee0: 2c 20 0a 20 20 20 20 20 20 20 64 62 2d 3e 78 57  , .       db->xW
fef0: 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73 71 6c 69  alCallback==sqli
ff00: 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
ff10: 6b 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20  k ? .           
ff20: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
ff30: 54 28 64 62 2d 3e 70 57 61 6c 41 72 67 29 20 3a  T(db->pWalArg) :
ff40: 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b   0);.  }.  break
ff50: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  ;.#endif..  /*. 
ff60: 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 68 72 69   **  PRAGMA shri
ff70: 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a 0a 20  nk_memory.  **. 
ff80: 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
ff90: 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34 35 2d 34  ON-OF: R-23445-4
ffa0: 36 31 30 39 20 54 68 69 73 20 70 72 61 67 6d 61  6109 This pragma
ffb0: 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
ffc0: 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63  base.  ** connec
ffd0: 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68 20 69 74  tion on which it
ffe0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 66   is invoked to f
fff0: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
10000 65 6d 6f 72 79 20 61 73 20 69 74 0a 20 20 2a 2a  emory as it.  **
10010 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c 69 6e 67   can, by calling
10020 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65   sqlite3_db_rele
10030 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 20 20  ase_memory()..  
10040 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
10050 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52 59 3a  p_SHRINK_MEMORY:
10060 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64   {.    sqlite3_d
10070 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
10080 28 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  (db);.    break;
10090 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
100a0 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a 65   PRAGMA optimize
100b0 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70  .  **  PRAGMA op
100c0 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20 2a  timize(MASK).  *
100d0 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61  *  PRAGMA schema
100e0 2e 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20 20  .optimize.  **  
100f0 50 52 41 47 4d 41 20 73 63 68 65 6d 61 2e 6f 70  PRAGMA schema.op
10100 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20 2a  timize(MASK).  *
10110 2a 0a 20 20 2a 2a 20 41 74 74 65 6d 70 74 20 74  *.  ** Attempt t
10120 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 64  o optimize the d
10130 61 74 61 62 61 73 65 2e 20 20 41 6c 6c 20 73 63  atabase.  All sc
10140 68 65 6d 61 73 20 61 72 65 20 6f 70 74 69 6d 69  hemas are optimi
10150 7a 65 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  zed in the first
10160 0a 20 20 2a 2a 20 74 77 6f 20 66 6f 72 6d 73 2c  .  ** two forms,
10170 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 20 73 70   and only the sp
10180 65 63 69 66 69 65 64 20 73 63 68 65 6d 61 20 69  ecified schema i
10190 73 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e 20 74  s optimized in t
101a0 68 65 20 6c 61 74 74 65 72 20 74 77 6f 2e 0a 20  he latter two.. 
101b0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 74   **.  ** The det
101c0 61 69 6c 73 20 6f 66 20 6f 70 74 69 6d 69 7a 61  ails of optimiza
101d0 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
101e0 62 79 20 74 68 69 73 20 70 72 61 67 6d 61 20 61  by this pragma a
101f0 72 65 20 65 78 70 65 63 74 65 64 0a 20 20 2a 2a  re expected.  **
10200 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 64 20 69   to change and i
10210 6d 70 72 6f 76 65 20 6f 76 65 72 20 74 69 6d 65  mprove over time
10220 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20  .  Applications 
10230 73 68 6f 75 6c 64 20 61 6e 74 69 63 69 70 61 74  should anticipat
10240 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 69 73  e that.  ** this
10250 20 70 72 61 67 6d 61 20 77 69 6c 6c 20 70 65 72   pragma will per
10260 66 6f 72 6d 20 6e 65 77 20 6f 70 74 69 6d 69 7a  form new optimiz
10270 61 74 69 6f 6e 73 20 69 6e 20 66 75 74 75 72 65  ations in future
10280 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a 2a 0a   releases..  **.
10290 20 20 2a 2a 20 54 68 65 20 6f 70 74 69 6f 6e 61    ** The optiona
102a0 6c 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  l argument is a 
102b0 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
102c0 69 7a 61 74 69 6f 6e 73 20 74 6f 20 70 65 72 66  izations to perf
102d0 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
102e0 20 20 30 78 30 30 30 31 20 20 20 20 44 65 62 75    0x0001    Debu
102f0 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 44 6f 20  gging mode.  Do 
10300 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 70 65 72  not actually per
10310 66 6f 72 6d 20 61 6e 79 20 6f 70 74 69 6d 69 7a  form any optimiz
10320 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 20 20 20 20  ations.  **     
10330 20 20 20 20 20 20 20 20 20 62 75 74 20 69 6e 73           but ins
10340 74 65 61 64 20 72 65 74 75 72 6e 20 6f 6e 65 20  tead return one 
10350 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 6f 72  line of text for
10360 20 65 61 63 68 20 6f 70 74 69 6d 69 7a 61 74 69   each optimizati
10370 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  on.  **         
10380 20 20 20 20 20 74 68 61 74 20 77 6f 75 6c 64 20       that would 
10390 68 61 76 65 20 62 65 65 6e 20 64 6f 6e 65 2e 20  have been done. 
103a0 20 4f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   Off by default.
103b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78  .  **.  **    0x
103c0 30 30 30 32 20 20 20 20 52 75 6e 20 41 4e 41 4c  0002    Run ANAL
103d0 59 5a 45 20 6f 6e 20 74 61 62 6c 65 73 20 74 68  YZE on tables th
103e0 61 74 20 6d 69 67 68 74 20 62 65 6e 65 66 69 74  at might benefit
103f0 2e 20 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74  .  On by default
10400 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  ..  **          
10410 20 20 20 20 53 65 65 20 62 65 6c 6f 77 20 66 6f      See below fo
10420 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
10430 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20  ormation..  **. 
10440 20 2a 2a 20 20 20 20 30 78 30 30 30 34 20 20 20   **    0x0004   
10450 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d   (Not yet implem
10460 65 6e 74 65 64 29 20 52 65 63 6f 72 64 20 75 73  ented) Record us
10470 61 67 65 20 61 6e 64 20 70 65 72 66 6f 72 6d 61  age and performa
10480 6e 63 65 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  nce .  **       
10490 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69         informati
104a0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  on from the curr
104b0 65 6e 74 20 73 65 73 73 69 6f 6e 20 69 6e 20 74  ent session in t
104c0 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  he.  **         
104d0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
104e0 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  le so that it wi
104f0 6c 6c 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20  ll be available 
10500 74 6f 20 22 6f 70 74 69 6d 69 7a 65 22 0a 20 20  to "optimize".  
10510 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10520 70 72 61 67 6d 61 73 20 72 75 6e 20 62 79 20 66  pragmas run by f
10530 75 74 75 72 65 20 64 61 74 61 62 61 73 65 20 63  uture database c
10540 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  onnections..  **
10550 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 38 20  .  **    0x0008 
10560 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c     (Not yet impl
10570 65 6d 65 6e 74 65 64 29 20 43 72 65 61 74 65 20  emented) Create 
10580 69 6e 64 65 78 65 73 20 74 68 61 74 20 6d 69 67  indexes that mig
10590 68 74 20 68 61 76 65 0a 20 20 2a 2a 20 20 20 20  ht have.  **    
105a0 20 20 20 20 20 20 20 20 20 20 62 65 65 6e 20 68            been h
105b0 65 6c 70 66 75 6c 20 74 6f 20 72 65 63 65 6e 74  elpful to recent
105c0 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 0a 20 20   queries.  **.  
105d0 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 4d  ** The default M
105e0 41 53 4b 20 69 73 20 61 6e 64 20 61 6c 77 61 79  ASK is and alway
105f0 73 20 73 68 61 6c 6c 20 62 65 20 30 78 66 66 66  s shall be 0xfff
10600 65 2e 20 20 30 78 66 66 66 65 20 6d 65 61 6e 73  e.  0xfffe means
10610 20 70 65 72 66 6f 72 6d 20 61 6c 6c 0a 20 20 2a   perform all.  *
10620 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * of the optimiz
10630 61 74 69 6f 6e 73 20 6c 69 73 74 65 64 20 61 62  ations listed ab
10640 6f 76 65 20 65 78 63 65 70 74 20 44 65 62 75 67  ove except Debug
10650 20 4d 6f 64 65 2c 20 69 6e 63 6c 75 64 69 6e 67   Mode, including
10660 20 6e 65 77 0a 20 20 2a 2a 20 6f 70 74 69 6d 69   new.  ** optimi
10670 7a 61 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76  zations that hav
10680 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69  e not yet been i
10690 6e 76 65 6e 74 65 64 2e 20 20 49 66 20 6e 65 77  nvented.  If new
106a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61   optimizations a
106b0 72 65 0a 20 20 2a 2a 20 65 76 65 72 20 61 64 64  re.  ** ever add
106c0 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ed that should b
106d0 65 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  e off by default
106e0 2c 20 74 68 6f 73 65 20 6f 66 66 2d 62 79 2d 64  , those off-by-d
106f0 65 66 61 75 6c 74 20 0a 20 20 2a 2a 20 6f 70 74  efault .  ** opt
10700 69 6d 69 7a 61 74 69 6f 6e 73 20 77 69 6c 6c 20  imizations will 
10710 68 61 76 65 20 62 69 74 6d 61 73 6b 73 20 6f 66  have bitmasks of
10720 20 30 78 31 30 30 30 30 20 6f 72 20 6c 61 72 67   0x10000 or larg
10730 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 45  er..  **.  ** DE
10740 54 45 52 4d 49 4e 41 54 49 4f 4e 20 4f 46 20 57  TERMINATION OF W
10750 48 45 4e 20 54 4f 20 52 55 4e 20 41 4e 41 4c 59  HEN TO RUN ANALY
10760 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  ZE.  **.  ** In 
10770 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
10780 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20 74 61  ementation, a ta
10790 62 6c 65 20 69 73 20 61 6e 61 6c 79 7a 65 64 20  ble is analyzed 
107a0 69 66 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 6f  if only if all o
107b0 66 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  f.  ** the follo
107c0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
107d0 20 2a 2a 0a 20 20 2a 2a 20 28 31 29 20 4d 41 53   **.  ** (1) MAS
107e0 4b 20 62 69 74 20 30 78 30 32 20 69 73 20 73 65  K bit 0x02 is se
107f0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 32 29  t..  **.  ** (2)
10800 20 54 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   The query plann
10810 65 72 20 75 73 65 64 20 73 71 6c 69 74 65 5f 73  er used sqlite_s
10820 74 61 74 31 2d 73 74 79 6c 65 20 73 74 61 74 69  tat1-style stati
10830 73 74 69 63 73 20 66 6f 72 20 6f 6e 65 20 6f 72  stics for one or
10840 0a 20 20 2a 2a 20 20 20 20 20 6d 6f 72 65 20 69  .  **     more i
10850 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20 74 61  ndexes of the ta
10860 62 6c 65 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ble at some poin
10870 74 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66  t during the lif
10880 65 74 69 6d 65 20 6f 66 0a 20 20 2a 2a 20 20 20  etime of.  **   
10890 20 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f    the current co
108a0 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20  nnection..  **. 
108b0 20 2a 2a 20 28 33 29 20 4f 6e 65 20 6f 72 20 6d   ** (3) One or m
108c0 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74  ore indexes of t
108d0 68 65 20 74 61 62 6c 65 20 61 72 65 20 63 75 72  he table are cur
108e0 72 65 6e 74 6c 79 20 75 6e 61 6e 61 6c 79 7a 65  rently unanalyze
108f0 64 20 4f 52 0a 20 20 2a 2a 20 20 20 20 20 74 68  d OR.  **     th
10900 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
10910 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 68 61   in the table ha
10920 73 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 32  s increased by 2
10930 35 20 74 69 6d 65 73 20 6f 72 20 6d 6f 72 65 0a  5 times or more.
10940 20 20 2a 2a 20 20 20 20 20 73 69 6e 63 65 20 74    **     since t
10950 68 65 20 6c 61 73 74 20 74 69 6d 65 20 41 4e 41  he last time ANA
10960 4c 59 5a 45 20 77 61 73 20 72 75 6e 2e 0a 20 20  LYZE was run..  
10970 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c 65  **.  ** The rule
10980 73 20 66 6f 72 20 77 68 65 6e 20 74 61 62 6c 65  s for when table
10990 73 20 61 72 65 20 61 6e 61 6c 79 7a 65 64 20 61  s are analyzed a
109a0 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 68 61  re likely to cha
109b0 6e 67 65 20 69 6e 0a 20 20 2a 2a 20 66 75 74 75  nge in.  ** futu
109c0 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a  re releases..  *
109d0 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
109e0 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b 0a 20 20 20  _OPTIMIZE: {.   
109f0 20 69 6e 74 20 69 44 62 4c 61 73 74 3b 20 20 20   int iDbLast;   
10a00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10a10 74 65 72 6d 69 6e 61 74 69 6f 6e 20 70 6f 69 6e  termination poin
10a20 74 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  t for the schema
10a30 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74   loop */.    int
10a40 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20   iTabCur;       
10a50 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f      /* Cursor fo
10a60 72 20 61 20 74 61 62 6c 65 20 77 68 6f 73 65 20  r a table whose 
10a70 73 69 7a 65 20 6e 65 65 64 73 20 63 68 65 63 6b  size needs check
10a80 69 6e 67 20 2a 2f 0a 20 20 20 20 48 61 73 68 45  ing */.    HashE
10a90 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
10aa0 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74    /* Loop over t
10ab0 61 62 6c 65 73 20 6f 66 20 61 20 73 63 68 65 6d  ables of a schem
10ac0 61 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  a */.    Schema 
10ad0 2a 70 53 63 68 65 6d 61 3b 20 20 20 20 20 20 20  *pSchema;       
10ae0 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 73  /* The current s
10af0 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 54 61 62  chema */.    Tab
10b00 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
10b10 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
10b20 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  n the schema */.
10b30 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
10b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
10b50 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   index of the ta
10b60 62 6c 65 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73  ble */.    LogEs
10b70 74 20 73 7a 54 68 72 65 73 68 6f 6c 64 3b 20 20  t szThreshold;  
10b80 20 20 2f 2a 20 53 69 7a 65 20 74 68 72 65 73 68    /* Size thresh
10b90 6f 6c 64 20 61 62 6f 76 65 20 77 68 69 63 68 20  old above which 
10ba0 72 65 61 6e 61 6c 79 73 69 73 20 69 73 20 6e 65  reanalysis is ne
10bb0 65 64 64 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  edd */.    char 
10bc0 2a 7a 53 75 62 53 71 6c 3b 20 20 20 20 20 20 20  *zSubSql;       
10bd0 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    /* SQL stateme
10be0 6e 74 20 66 6f 72 20 74 68 65 20 4f 50 5f 53 71  nt for the OP_Sq
10bf0 6c 45 78 65 63 20 6f 70 63 6f 64 65 20 2a 2f 0a  lExec opcode */.
10c00 20 20 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20      u32 opMask; 
10c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
10c20 73 6b 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  sk of operations
10c30 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 0a   to perform */..
10c40 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
10c50 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d  {.      opMask =
10c60 20 28 75 33 32 29 73 71 6c 69 74 65 33 41 74 6f   (u32)sqlite3Ato
10c70 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
10c80 20 69 66 28 20 28 6f 70 4d 61 73 6b 20 26 20 30   if( (opMask & 0
10c90 78 30 32 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  x02)==0 ) break;
10ca0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10cb0 20 20 6f 70 4d 61 73 6b 20 3d 20 30 78 66 66 66    opMask = 0xfff
10cc0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61  e;.    }.    iTa
10cd0 62 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  bCur = pParse->n
10ce0 54 61 62 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 69  Tab++;.    for(i
10cf0 44 62 4c 61 73 74 20 3d 20 7a 44 62 3f 69 44 62  DbLast = zDb?iDb
10d00 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3c  :db->nDb-1; iDb<
10d10 3d 69 44 62 4c 61 73 74 3b 20 69 44 62 2b 2b 29  =iDbLast; iDb++)
10d20 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d  {.      if( iDb=
10d30 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =1 ) continue;. 
10d40 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
10d50 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
10d60 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
10d70 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61   pSchema = db->a
10d80 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
10d90 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  .      for(k=sql
10da0 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
10db0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
10dc0 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
10dd0 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
10de0 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
10df0 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
10e00 6b 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  k);..        /* 
10e10 49 66 20 74 61 62 6c 65 20 70 54 61 62 20 68 61  If table pTab ha
10e20 73 20 6e 6f 74 20 62 65 65 6e 20 75 73 65 64 20  s not been used 
10e30 69 6e 20 61 20 77 61 79 20 74 68 61 74 20 77 6f  in a way that wo
10e40 75 6c 64 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  uld benefit from
10e50 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 69  .        ** havi
10e60 6e 67 20 61 6e 61 6c 79 73 69 73 20 73 74 61 74  ng analysis stat
10e70 69 73 74 69 63 73 20 64 75 72 69 6e 67 20 74 68  istics during th
10e80 65 20 63 75 72 72 65 6e 74 20 73 65 73 73 69 6f  e current sessio
10e90 6e 2c 20 74 68 65 6e 20 73 6b 69 70 20 69 74 2e  n, then skip it.
10ea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
10eb0 20 61 6c 73 6f 20 68 61 73 20 74 68 65 20 65 66   also has the ef
10ec0 66 65 63 74 20 6f 66 20 73 6b 69 70 70 69 6e 67  fect of skipping
10ed0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
10ee0 61 6e 64 20 76 69 65 77 73 20 2a 2f 0a 20 20 20  and views */.   
10ef0 20 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e       if( (pTab->
10f00 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 53 74  tabFlags & TF_St
10f10 61 74 73 55 73 65 64 29 3d 3d 30 20 29 20 63 6f  atsUsed)==0 ) co
10f20 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20  ntinue;..       
10f30 20 2f 2a 20 52 65 61 6e 61 6c 79 7a 65 20 69 66   /* Reanalyze if
10f40 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 32 35   the table is 25
10f50 20 74 69 6d 65 73 20 6c 61 72 67 65 72 20 74 68   times larger th
10f60 61 6e 20 74 68 65 20 6c 61 73 74 20 61 6e 61 6c  an the last anal
10f70 79 73 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ysis */.        
10f80 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 70 54  szThreshold = pT
10f90 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 2b  ab->nRowLogEst +
10fa0 20 34 36 3b 20 61 73 73 65 72 74 28 20 73 71 6c   46; assert( sql
10fb0 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 3d 3d  ite3LogEst(25)==
10fc0 34 36 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  46 );.        fo
10fd0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
10fe0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
10ff0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
11000 20 20 20 20 20 20 20 20 69 66 28 20 21 70 49 64          if( !pId
11010 78 2d 3e 68 61 73 53 74 61 74 31 20 29 7b 0a 20  x->hasStat1 ){. 
11020 20 20 20 20 20 20 20 20 20 20 20 73 7a 54 68 72             szThr
11030 65 73 68 6f 6c 64 20 3d 20 30 3b 20 2f 2a 20 41  eshold = 0; /* A
11040 6c 77 61 79 73 20 61 6e 61 6c 79 7a 65 20 69 66  lways analyze if
11050 20 61 6e 79 20 69 6e 64 65 78 20 6c 61 63 6b 73   any index lacks
11060 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   statistics */. 
11070 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
11080 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
110a0 69 66 28 20 73 7a 54 68 72 65 73 68 6f 6c 64 20  if( szThreshold 
110b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
110c0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
110d0 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c 20 69  arse, iTabCur, i
110e0 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
110f0 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20  nRead);.        
11100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11110 4f 70 33 28 76 2c 20 4f 50 5f 49 66 53 6d 61 6c  Op3(v, OP_IfSmal
11120 6c 65 72 2c 20 69 54 61 62 43 75 72 2c 20 0a 20  ler, iTabCur, . 
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11150 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
11160 29 2b 32 2b 28 6f 70 4d 61 73 6b 26 31 29 2c 20  )+2+(opMask&1), 
11170 73 7a 54 68 72 65 73 68 6f 6c 64 29 3b 0a 20 20  szThreshold);.  
11180 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
11190 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
111a0 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 75 62 53   }.        zSubS
111b0 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ql = sqlite3MPri
111c0 6e 74 66 28 64 62 2c 20 22 41 4e 41 4c 59 5a 45  ntf(db, "ANALYZE
111d0 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22 22 2c   \"%w\".\"%w\"",
111e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11200 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
11210 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  DbSName, pTab->z
11220 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
11230 66 28 20 6f 70 4d 61 73 6b 20 26 20 30 78 30 31  f( opMask & 0x01
11240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
11250 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
11260 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11270 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11280 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11290 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
112a0 72 31 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20  r1, 0, zSubSql, 
112b0 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
112c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
112d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
112e0 65 73 75 6c 74 52 6f 77 2c 20 72 31 2c 20 31 29  esultRow, r1, 1)
112f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11300 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11310 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
11320 4f 50 5f 53 71 6c 45 78 65 63 2c 20 30 2c 20 30  OP_SqlExec, 0, 0
11330 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20 50 34  , 0, zSubSql, P4
11340 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
11350 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11360 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
11370 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45  beAddOp0(v, OP_E
11380 78 70 69 72 65 29 3b 0a 20 20 20 20 62 72 65 61  xpire);.    brea
11390 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
113a0 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f  *   PRAGMA busy_
113b0 74 69 6d 65 6f 75 74 0a 20 20 2a 2a 20 20 20 50  timeout.  **   P
113c0 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f  RAGMA busy_timeo
113d0 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  ut = N.  **.  **
113e0 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 62 75   Call sqlite3_bu
113f0 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 4e  sy_timeout(db, N
11400 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 63  ).  Return the c
11410 75 72 72 65 6e 74 20 74 69 6d 65 6f 75 74 20 76  urrent timeout v
11420 61 6c 75 65 0a 20 20 2a 2a 20 69 66 20 6f 6e 65  alue.  ** if one
11430 20 69 73 20 73 65 74 2e 20 20 49 66 20 6e 6f 20   is set.  If no 
11440 62 75 73 79 20 68 61 6e 64 6c 65 72 20 6f 72 20  busy handler or 
11450 61 20 64 69 66 66 65 72 65 6e 74 20 62 75 73 79  a different busy
11460 20 68 61 6e 64 6c 65 72 20 69 73 20 73 65 74 0a   handler is set.
11470 20 20 2a 2a 20 74 68 65 6e 20 30 20 69 73 20 72    ** then 0 is r
11480 65 74 75 72 6e 65 64 2e 20 20 53 65 74 74 69 6e  eturned.  Settin
11490 67 20 74 68 65 20 62 75 73 79 5f 74 69 6d 65 6f  g the busy_timeo
114a0 75 74 20 74 6f 20 30 20 6f 72 20 6e 65 67 61 74  ut to 0 or negat
114b0 69 76 65 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65  ive.  ** disable
114c0 73 20 74 68 65 20 74 69 6d 65 6f 75 74 2e 0a 20  s the timeout.. 
114d0 20 2a 2f 0a 20 20 2f 2a 63 61 73 65 20 50 72 61   */.  /*case Pra
114e0 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55  gTyp_BUSY_TIMEOU
114f0 54 2a 2f 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20  T*/ default: {. 
11500 20 20 20 61 73 73 65 72 74 28 20 70 50 72 61 67     assert( pPrag
11510 6d 61 2d 3e 65 50 72 61 67 54 79 70 3d 3d 50 72  ma->ePragTyp==Pr
11520 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f  agTyp_BUSY_TIMEO
11530 55 54 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  UT );.    if( zR
11540 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
11550 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
11560 75 74 28 64 62 2c 20 73 71 6c 69 74 65 33 41 74  ut(db, sqlite3At
11570 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20  oi(zRight));.   
11580 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
11590 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 62 75  gleInt(v, db->bu
115a0 73 79 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20  syTimeout);.    
115b0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
115c0 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73  .  **   PRAGMA s
115d0 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 0a 20  oft_heap_limit. 
115e0 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f 66   **   PRAGMA sof
115f0 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3d 20 4e  t_heap_limit = N
11600 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45  .  **.  ** IMPLE
11610 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
11620 32 36 33 34 33 2d 34 35 39 33 30 20 54 68 69 73  26343-45930 This
11630 20 70 72 61 67 6d 61 20 69 6e 76 6f 6b 65 73 20   pragma invokes 
11640 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
11650 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
11660 36 34 28 29 20 69 6e 74 65 72 66 61 63 65 20 77  64() interface w
11670 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ith the argument
11680 20 4e 2c 20 69 66 20 4e 20 69 73 0a 20 20 2a 2a   N, if N is.  **
11690 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 20 69   specified and i
116a0 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  s a non-negative
116b0 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 20 49   integer..  ** I
116c0 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
116d0 3a 20 52 2d 36 34 34 35 31 2d 30 37 31 36 33 20  : R-64451-07163 
116e0 54 68 65 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69  The soft_heap_li
116f0 6d 69 74 20 70 72 61 67 6d 61 20 61 6c 77 61 79  mit pragma alway
11700 73 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74  s.  ** returns t
11710 68 65 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20  he same integer 
11720 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 72 65  that would be re
11730 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20  turned by the.  
11740 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  ** sqlite3_soft_
11750 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29  heap_limit64(-1)
11760 20 43 2d 6c 61 6e 67 75 61 67 65 20 66 75 6e 63   C-language func
11770 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
11780 65 20 50 72 61 67 54 79 70 5f 53 4f 46 54 5f 48  e PragTyp_SOFT_H
11790 45 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20  EAP_LIMIT: {.   
117a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e   sqlite3_int64 N
117b0 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
117c0 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72   && sqlite3DecOr
117d0 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c  HexToI64(zRight,
117e0 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   &N)==SQLITE_OK 
117f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11800 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
11810 36 34 28 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  64(N);.    }.   
11820 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
11830 28 76 2c 20 73 71 6c 69 74 65 33 5f 73 6f 66 74  (v, sqlite3_soft
11840 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31  _heap_limit64(-1
11850 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
11860 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
11870 50 52 41 47 4d 41 20 74 68 72 65 61 64 73 0a 20  PRAGMA threads. 
11880 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72   **   PRAGMA thr
11890 65 61 64 73 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20  eads = N.  **.  
118a0 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65  ** Configure the
118b0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
118c0 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64  of worker thread
118d0 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  s.  Return the n
118e0 65 77 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 2c  ew.  ** maximum,
118f0 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
11900 6c 65 73 73 20 74 68 61 6e 20 72 65 71 75 65 73  less than reques
11910 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
11920 20 50 72 61 67 54 79 70 5f 54 48 52 45 41 44 53   PragTyp_THREADS
11930 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
11940 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28  int64 N;.    if(
11950 20 7a 52 69 67 68 74 0a 20 20 20 20 20 26 26 20   zRight.     && 
11960 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
11970 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 4e 29  oI64(zRight, &N)
11980 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
11990 20 26 26 20 4e 3e 3d 30 0a 20 20 20 20 29 7b 0a   && N>=0.    ){.
119a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69        sqlite3_li
119b0 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c  mit(db, SQLITE_L
119c0 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
119d0 41 44 53 2c 20 28 69 6e 74 29 28 4e 26 30 78 37  ADS, (int)(N&0x7
119e0 66 66 66 66 66 66 66 29 29 3b 0a 20 20 20 20 7d  fffffff));.    }
119f0 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
11a00 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 5f  eInt(v, sqlite3_
11a10 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45  limit(db, SQLITE
11a20 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
11a30 52 45 41 44 53 2c 20 2d 31 29 29 3b 0a 20 20 20  READS, -1));.   
11a40 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66   break;.  }..#if
11a50 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
11a60 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
11a70 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
11a80 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f 72 74 20   /*.  ** Report 
11a90 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
11aa0 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67 73 20 66  e of file logs f
11ab0 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  or all databases
11ac0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
11ad0 67 54 79 70 5f 4c 4f 43 4b 5f 53 54 41 54 55 53  gTyp_LOCK_STATUS
11ae0 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  : {.    static c
11af0 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
11b00 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20 3d 20   azLockName[] = 
11b10 7b 0a 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 65  {.      "unlocke
11b20 64 22 2c 20 22 73 68 61 72 65 64 22 2c 20 22 72  d", "shared", "r
11b30 65 73 65 72 76 65 64 22 2c 20 22 70 65 6e 64 69  eserved", "pendi
11b40 6e 67 22 2c 20 22 65 78 63 6c 75 73 69 76 65 22  ng", "exclusive"
11b50 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
11b60 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  i;.    pParse->n
11b70 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72  Mem = 2;.    for
11b80 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
11b90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
11ba0 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 20 20 63  ee *pBt;.      c
11bb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74  onst char *zStat
11bc0 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  e = "unknown";. 
11bd0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
11be0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
11bf0 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30 20 29 20 63  .zDbSName==0 ) c
11c00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
11c10 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
11c20 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
11c30 42 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  Bt==0 || sqlite3
11c40 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3d  BtreePager(pBt)=
11c50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  =0 ){.        zS
11c60 74 61 74 65 20 3d 20 22 63 6c 6f 73 65 64 22 3b  tate = "closed";
11c70 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
11c80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
11c90 6e 74 72 6f 6c 28 64 62 2c 20 69 20 3f 20 64 62  ntrol(db, i ? db
11ca0 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
11cb0 65 20 3a 20 30 2c 20 0a 20 20 20 20 20 20 20 20  e : 0, .        
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
11ce0 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
11cf0 41 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49 54 45  ATE, &j)==SQLITE
11d00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11d10 7a 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63 6b 4e  zState = azLockN
11d20 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a  ame[j];.      }.
11d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11d40 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
11d50 20 22 73 73 22 2c 20 64 62 2d 3e 61 44 62 5b 69   "ss", db->aDb[i
11d60 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 53 74 61  ].zDbSName, zSta
11d70 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  te);.    }.    b
11d80 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
11d90 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11da0 48 41 53 5f 43 4f 44 45 43 0a 20 20 63 61 73 65  HAS_CODEC.  case
11db0 20 50 72 61 67 54 79 70 5f 4b 45 59 3a 20 7b 0a   PragTyp_KEY: {.
11dc0 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
11dd0 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28   sqlite3_key_v2(
11de0 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c  db, zDb, zRight,
11df0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
11e00 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 62  (zRight));.    b
11e10 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65  reak;.  }.  case
11e20 20 50 72 61 67 54 79 70 5f 52 45 4b 45 59 3a 20   PragTyp_REKEY: 
11e30 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
11e40 20 29 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79   ) sqlite3_rekey
11e50 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69  _v2(db, zDb, zRi
11e60 67 68 74 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ght, sqlite3Strl
11e70 65 6e 33 30 28 7a 52 69 67 68 74 29 29 3b 0a 20  en30(zRight));. 
11e80 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
11e90 63 61 73 65 20 50 72 61 67 54 79 70 5f 48 45 58  case PragTyp_HEX
11ea0 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a  KEY: {.    if( z
11eb0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 75  Right ){.      u
11ec0 38 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69  8 iByte;.      i
11ed0 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72  nt i;.      char
11ee0 20 7a 4b 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20   zKey[40];.     
11ef0 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d   for(i=0, iByte=
11f00 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79  0; i<sizeof(zKey
11f10 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49 73  )*2 && sqlite3Is
11f20 78 64 69 67 69 74 28 7a 52 69 67 68 74 5b 69 5d  xdigit(zRight[i]
11f30 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
11f40 20 69 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c   iByte = (iByte<
11f50 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78  <4) + sqlite3Hex
11f60 54 6f 49 6e 74 28 7a 52 69 67 68 74 5b 69 5d 29  ToInt(zRight[i])
11f70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  ;.        if( (i
11f80 26 31 29 21 3d 30 20 29 20 7a 4b 65 79 5b 69 2f  &1)!=0 ) zKey[i/
11f90 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20  2] = iByte;.    
11fa0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 7a    }.      if( (z
11fb0 4c 65 66 74 5b 33 5d 20 26 20 30 78 66 29 3d 3d  Left[3] & 0xf)==
11fc0 30 78 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0xb ){.        s
11fd0 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62  qlite3_key_v2(db
11fe0 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32  , zDb, zKey, i/2
11ff0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12010 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62  rekey_v2(db, zDb
12020 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20  , zKey, i/2);.  
12030 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12040 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
12050 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
12060 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
12070 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
12080 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 29 0a  E_ENABLE_CEROD).
12090 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
120a0 43 54 49 56 41 54 45 5f 45 58 54 45 4e 53 49 4f  CTIVATE_EXTENSIO
120b0 4e 53 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29  NS: if( zRight )
120c0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
120d0 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66  HAS_CODEC.    if
120e0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
120f0 70 28 7a 52 69 67 68 74 2c 20 22 73 65 65 2d 22  p(zRight, "see-"
12100 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)==0 ){.     
12110 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74   sqlite3_activat
12120 65 5f 73 65 65 28 26 7a 52 69 67 68 74 5b 34 5d  e_see(&zRight[4]
12130 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
12140 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12150 41 42 4c 45 5f 43 45 52 4f 44 0a 20 20 20 20 69  ABLE_CEROD.    i
12160 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
12170 6d 70 28 7a 52 69 67 68 74 2c 20 22 63 65 72 6f  mp(zRight, "cero
12180 64 2d 22 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20  d-", 6)==0 ){.  
12190 20 20 20 20 73 71 6c 69 74 65 33 5f 61 63 74 69      sqlite3_acti
121a0 76 61 74 65 5f 63 65 72 6f 64 28 26 7a 52 69 67  vate_cerod(&zRig
121b0 68 74 5b 36 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  ht[6]);.    }.#e
121c0 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b  ndif.  }.  break
121d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a  ;.#endif..  } /*
121e0 20 45 6e 64 20 6f 66 20 74 68 65 20 50 52 41 47   End of the PRAG
121f0 4d 41 20 73 77 69 74 63 68 20 2a 2f 0a 0a 20 20  MA switch */..  
12200 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
12210 20 62 6c 6f 63 6b 20 69 73 20 61 20 6e 6f 2d 6f   block is a no-o
12220 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f  p unless SQLITE_
12230 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
12240 2e 20 49 74 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20  . Its only.  ** 
12250 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20 65 78  purpose is to ex
12260 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
12270 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 76 65 72  tatements to ver
12280 69 66 79 20 74 68 61 74 20 69 66 20 74 68 65 0a  ify that if the.
12290 20 20 2a 2a 20 50 72 61 67 46 6c 67 5f 4e 6f 43    ** PragFlg_NoC
122a0 6f 6c 75 6d 6e 73 31 20 66 6c 61 67 20 69 73 20  olumns1 flag is 
122b0 73 65 74 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  set and the call
122c0 65 72 20 73 70 65 63 69 66 69 65 64 20 61 6e 20  er specified an 
122d0 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f  argument.  ** to
122e0 20 74 68 65 20 50 52 41 47 4d 41 2c 20 74 68 65   the PRAGMA, the
122f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12300 68 61 73 20 6e 6f 74 20 61 64 64 65 64 20 61 6e  has not added an
12310 79 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 0a  y OP_ResultRow .
12320 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
12330 73 20 74 6f 20 74 68 65 20 56 4d 2e 20 20 2a 2f  s to the VM.  */
12340 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d  .  if( (pPragma-
12350 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
12360 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 20  Flg_NoColumns1) 
12370 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  && zRight ){.   
12380 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
12390 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28 76 29  fyNoResultRow(v)
123a0 3b 0a 20 20 7d 0a 0a 70 72 61 67 6d 61 5f 6f 75  ;.  }..pragma_ou
123b0 74 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  t:.  sqlite3DbFr
123c0 65 65 28 64 62 2c 20 7a 4c 65 66 74 29 3b 0a 20  ee(db, zLeft);. 
123d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
123e0 62 2c 20 7a 52 69 67 68 74 29 3b 0a 7d 0a 23 69  b, zRight);.}.#i
123f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12400 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
12410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
12460 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
12470 6f 66 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  of an eponymous 
12480 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
12490 61 74 20 72 75 6e 73 20 61 20 70 72 61 67 6d 61  at runs a pragma
124a0 2e 0a 2a 2a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ..**.*/.typedef 
124b0 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61  struct PragmaVta
124c0 62 20 50 72 61 67 6d 61 56 74 61 62 3b 0a 74 79  b PragmaVtab;.ty
124d0 70 65 64 65 66 20 73 74 72 75 63 74 20 50 72 61  pedef struct Pra
124e0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 50 72  gmaVtabCursor Pr
124f0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 3b 0a  agmaVtabCursor;.
12500 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61  struct PragmaVta
12510 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  b {.  sqlite3_vt
12520 61 62 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  ab base;        
12530 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20 20  /* Base class.  
12540 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f  Must be first */
12550 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12570 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
12580 6e 65 63 74 69 6f 6e 20 74 6f 20 77 68 69 63 68  nection to which
12590 20 69 74 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20   it belongs */. 
125a0 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d   const PragmaNam
125b0 65 20 2a 70 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61  e *pName;  /* Na
125c0 6d 65 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61  me of the pragma
125d0 20 2a 2f 0a 20 20 75 38 20 6e 48 69 64 64 65 6e   */.  u8 nHidden
125e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
125f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68 69 64  /* Number of hid
12600 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  den columns */. 
12610 20 75 38 20 69 48 69 64 64 65 6e 3b 20 20 20 20   u8 iHidden;    
12620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12630 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
12640 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a   hidden column *
12650 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 50 72 61 67  /.};.struct Prag
12660 6d 61 56 74 61 62 43 75 72 73 6f 72 20 7b 0a 20  maVtabCursor {. 
12670 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
12680 72 73 6f 72 20 62 61 73 65 3b 20 2f 2a 20 42 61  rsor base; /* Ba
12690 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20  se class.  Must 
126a0 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71  be first */.  sq
126b0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 72 61  lite3_stmt *pPra
126c0 67 6d 61 3b 20 20 20 20 2f 2a 20 54 68 65 20 70  gma;    /* The p
126d0 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 20  ragma statement 
126e0 74 6f 20 72 75 6e 20 2a 2f 0a 20 20 73 71 6c 69  to run */.  sqli
126f0 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 3b  te_int64 iRowid;
12700 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
12710 20 72 6f 77 69 64 20 2a 2f 0a 20 20 63 68 61 72   rowid */.  char
12720 20 2a 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20 20   *azArg[2];     
12730 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
12740 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 61  f the argument a
12750 6e 64 20 73 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a  nd schema */.};.
12760 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ./* .** Pragma v
12770 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
12780 75 6c 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74  ule xConnect met
12790 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
127a0 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e  nt pragmaVtabCon
127b0 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  nect(.  sqlite3 
127c0 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75  *db,.  void *pAu
127d0 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63  x,.  int argc, c
127e0 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
127f0 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33  *argv,.  sqlite3
12800 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a  _vtab **ppVtab,.
12810 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
12820 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61  {.  const Pragma
12830 4e 61 6d 65 20 2a 70 50 72 61 67 6d 61 20 3d 20  Name *pPragma = 
12840 28 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d  (const PragmaNam
12850 65 2a 29 70 41 75 78 3b 0a 20 20 50 72 61 67 6d  e*)pAux;.  Pragm
12860 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 30 3b  aVtab *pTab = 0;
12870 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
12880 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 53   i, j;.  char cS
12890 65 70 20 3d 20 27 28 27 3b 0a 20 20 53 74 72 41  ep = '(';.  StrA
128a0 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72  ccum acc;.  char
128b0 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 0a 20 20 55   zBuf[200];..  U
128c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
128d0 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  argc);.  UNUSED_
128e0 50 41 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b  PARAMETER(argv);
128f0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
12900 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c 20  umInit(&acc, 0, 
12910 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75  zBuf, sizeof(zBu
12920 66 29 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  f), 0);.  sqlite
12930 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
12940 26 61 63 63 2c 20 22 43 52 45 41 54 45 20 54 41  &acc, "CREATE TA
12950 42 4c 45 20 78 22 29 3b 0a 20 20 66 6f 72 28 69  BLE x");.  for(i
12960 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d 3e 69  =0, j=pPragma->i
12970 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 70 50 72  PragCName; i<pPr
12980 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65  agma->nPragCName
12990 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
129a0 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
129b0 65 6e 64 66 28 26 61 63 63 2c 20 22 25 63 5c 22  endf(&acc, "%c\"
129c0 25 73 5c 22 22 2c 20 63 53 65 70 2c 20 70 72 61  %s\"", cSep, pra
129d0 67 43 4e 61 6d 65 5b 6a 5d 29 3b 0a 20 20 20 20  gCName[j]);.    
129e0 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 7d 0a  cSep = ',';.  }.
129f0 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20    if( i==0 ){.  
12a00 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
12a10 70 65 6e 64 66 28 26 61 63 63 2c 20 22 28 5c 22  pendf(&acc, "(\"
12a20 25 73 5c 22 22 2c 20 70 50 72 61 67 6d 61 2d 3e  %s\"", pPragma->
12a30 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 2b 2b 3b  zName);.    i++;
12a40 0a 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20  .  }.  j = 0;.  
12a50 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72  if( pPragma->mPr
12a60 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
12a70 52 65 73 75 6c 74 31 20 29 7b 0a 20 20 20 20 73  Result1 ){.    s
12a80 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
12a90 64 61 6c 6c 28 26 61 63 63 2c 20 22 2c 61 72 67  dall(&acc, ",arg
12aa0 20 48 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a   HIDDEN");.    j
12ab0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ++;.  }.  if( pP
12ac0 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
12ad0 26 20 28 50 72 61 67 46 6c 67 5f 53 63 68 65 6d  & (PragFlg_Schem
12ae0 61 4f 70 74 7c 50 72 61 67 46 6c 67 5f 53 63 68  aOpt|PragFlg_Sch
12af0 65 6d 61 52 65 71 29 20 29 7b 0a 20 20 20 20 73  emaReq) ){.    s
12b00 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
12b10 64 61 6c 6c 28 26 61 63 63 2c 20 22 2c 73 63 68  dall(&acc, ",sch
12b20 65 6d 61 20 48 49 44 44 45 4e 22 29 3b 0a 20 20  ema HIDDEN");.  
12b30 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c    j++;.  }.  sql
12b40 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
12b50 26 61 63 63 2c 20 22 29 22 2c 20 31 29 3b 0a 20  &acc, ")", 1);. 
12b60 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
12b70 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20  Finish(&acc);.  
12b80 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a  assert( strlen(z
12b90 42 75 66 29 20 3c 20 73 69 7a 65 6f 66 28 7a 42  Buf) < sizeof(zB
12ba0 75 66 29 2d 31 20 29 3b 0a 20 20 72 63 20 3d 20  uf)-1 );.  rc = 
12bb0 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
12bc0 76 74 61 62 28 64 62 2c 20 7a 42 75 66 29 3b 0a  vtab(db, zBuf);.
12bd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12be0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 20  _OK ){.    pTab 
12bf0 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 73  = (PragmaVtab*)s
12c00 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
12c10 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29  zeof(PragmaVtab)
12c20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
12c30 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
12c40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12c50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12c60 6d 65 6d 73 65 74 28 70 54 61 62 2c 20 30 2c 20  memset(pTab, 0, 
12c70 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61  sizeof(PragmaVta
12c80 62 29 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  b));.      pTab-
12c90 3e 70 4e 61 6d 65 20 3d 20 70 50 72 61 67 6d 61  >pName = pPragma
12ca0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62  ;.      pTab->db
12cb0 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 70 54 61   = db;.      pTa
12cc0 62 2d 3e 69 48 69 64 64 65 6e 20 3d 20 69 3b 0a  b->iHidden = i;.
12cd0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 48 69 64        pTab->nHid
12ce0 64 65 6e 20 3d 20 6a 3b 0a 20 20 20 20 7d 0a 20  den = j;.    }. 
12cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45   }else{.    *pzE
12d00 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
12d10 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
12d20 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
12d30 20 20 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d    }..  *ppVtab =
12d40 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29   (sqlite3_vtab*)
12d50 70 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 72  pTab;.  return r
12d60 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61  c;.}../* .** Pra
12d70 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
12d80 65 20 6d 6f 64 75 6c 65 20 78 44 69 73 63 6f 6e  e module xDiscon
12d90 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  nect method..*/.
12da0 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
12db0 61 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  aVtabDisconnect(
12dc0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
12dd0 74 61 62 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  tab){.  PragmaVt
12de0 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67  ab *pTab = (Prag
12df0 6d 61 56 74 61 62 2a 29 70 56 74 61 62 3b 0a 20  maVtab*)pVtab;. 
12e00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
12e10 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ab);.  return SQ
12e20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 46  LITE_OK;.}../* F
12e30 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 65  igure out the be
12e40 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
12e50 74 6f 20 73 65 61 72 63 68 20 61 20 70 72 61 67  to search a prag
12e60 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
12e70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
12e80 65 20 6e 6f 74 20 72 65 61 6c 6c 79 20 61 6e 79  e not really any
12e90 20 69 6e 64 65 78 20 63 68 6f 69 63 65 73 2e 20   index choices. 
12ea0 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   But we want to 
12eb0 65 6e 63 6f 75 72 61 67 65 20 74 68 65 0a 2a 2a  encourage the.**
12ec0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 74   query planner t
12ed0 6f 20 67 69 76 65 20 3d 3d 20 63 6f 6e 73 74 72  o give == constr
12ee0 61 69 6e 74 73 20 6f 6e 20 61 73 20 6d 61 6e 79  aints on as many
12ef0 20 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65   hidden paramete
12f00 72 73 20 61 73 0a 2a 2a 20 70 6f 73 73 69 62 6c  rs as.** possibl
12f10 65 2c 20 61 6e 64 20 65 73 70 65 63 69 61 6c 6c  e, and especiall
12f20 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 68  y on the first h
12f30 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 2e  idden parameter.
12f40 20 20 53 6f 20 72 65 74 75 72 6e 20 61 0a 2a 2a    So return a.**
12f50 20 68 69 67 68 20 63 6f 73 74 20 69 66 20 68 69   high cost if hi
12f60 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20  dden parameters 
12f70 61 72 65 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65  are unconstraine
12f80 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12f90 20 70 72 61 67 6d 61 56 74 61 62 42 65 73 74 49   pragmaVtabBestI
12fa0 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61  ndex(sqlite3_vta
12fb0 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f  b *tab, sqlite3_
12fc0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
12fd0 49 6e 66 6f 29 7b 0a 20 20 50 72 61 67 6d 61 56  Info){.  PragmaV
12fe0 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61  tab *pTab = (Pra
12ff0 67 6d 61 56 74 61 62 2a 29 74 61 62 3b 0a 20 20  gmaVtab*)tab;.  
13000 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
13010 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
13020 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69  raint *pConstrai
13030 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  nt;.  int i, j;.
13040 20 20 69 6e 74 20 73 65 65 6e 5b 32 5d 3b 0a 0a    int seen[2];..
13050 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
13060 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
13070 62 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 54 61  ble)1;.  if( pTa
13080 62 2d 3e 6e 48 69 64 64 65 6e 3d 3d 30 20 29 7b  b->nHidden==0 ){
13090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
130a0 4b 3b 20 7d 0a 20 20 70 43 6f 6e 73 74 72 61 69  K; }.  pConstrai
130b0 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  nt = pIdxInfo->a
130c0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 73 65  Constraint;.  se
130d0 65 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 73 65 65  en[0] = 0;.  see
130e0 6e 5b 31 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28  n[1] = 0;.  for(
130f0 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
13100 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
13110 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b  +, pConstraint++
13120 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73  ){.    if( pCons
13130 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d  traint->usable==
13140 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
13150 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e    if( pConstrain
13160 74 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e  t->op!=SQLITE_IN
13170 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
13180 51 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  Q ) continue;.  
13190 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e    if( pConstrain
131a0 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3c 20 70 54 61  t->iColumn < pTa
131b0 62 2d 3e 69 48 69 64 64 65 6e 20 29 20 63 6f 6e  b->iHidden ) con
131c0 74 69 6e 75 65 3b 0a 20 20 20 20 6a 20 3d 20 70  tinue;.    j = p
131d0 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
131e0 75 6d 6e 20 2d 20 70 54 61 62 2d 3e 69 48 69 64  umn - pTab->iHid
131f0 64 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  den;.    assert(
13200 20 6a 20 3c 20 32 20 29 3b 0a 20 20 20 20 73 65   j < 2 );.    se
13210 65 6e 5b 6a 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d  en[j] = i+1;.  }
13220 0a 20 20 69 66 28 20 73 65 65 6e 5b 30 5d 3d 3d  .  if( seen[0]==
13230 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66  0 ){.    pIdxInf
13240 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
13250 20 3d 20 28 64 6f 75 62 6c 65 29 32 31 34 37 34   = (double)21474
13260 38 33 36 34 37 3b 0a 20 20 20 20 70 49 64 78 49  83647;.    pIdxI
13270 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
13280 77 73 20 3d 20 32 31 34 37 34 38 33 36 34 37 3b  ws = 2147483647;
13290 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
132a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6a 20 3d  TE_OK;.  }.  j =
132b0 20 73 65 65 6e 5b 30 5d 2d 31 3b 0a 20 20 70 49   seen[0]-1;.  pI
132c0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
132d0 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76  intUsage[j].argv
132e0 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 70 49 64  Index = 1;.  pId
132f0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
13300 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20  ntUsage[j].omit 
13310 3d 20 31 3b 0a 20 20 69 66 28 20 73 65 65 6e 5b  = 1;.  if( seen[
13320 31 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  1]==0 ) return S
13330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 49 64 78  QLITE_OK;.  pIdx
13340 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
13350 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 30  ost = (double)20
13360 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
13370 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 30  timatedRows = 20
13380 3b 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 31 5d 2d  ;.  j = seen[1]-
13390 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  1;.  pIdxInfo->a
133a0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
133b0 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 32  j].argvIndex = 2
133c0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
133d0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
133e0 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 72 65  ].omit = 1;.  re
133f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13400 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20 61 20 6e  }../* Create a n
13410 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
13420 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  e pragma virtual
13430 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63   table */.static
13440 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4f   int pragmaVtabO
13450 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62  pen(sqlite3_vtab
13460 20 2a 70 56 74 61 62 2c 20 73 71 6c 69 74 65 33   *pVtab, sqlite3
13470 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70  _vtab_cursor **p
13480 70 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67  pCursor){.  Prag
13490 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
134a0 73 72 3b 0a 20 20 70 43 73 72 20 3d 20 28 50 72  sr;.  pCsr = (Pr
134b0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
134c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
134d0 69 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20  izeof(*pCsr));. 
134e0 20 69 66 28 20 70 43 73 72 3d 3d 30 20 29 20 72   if( pCsr==0 ) r
134f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13500 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 73  EM;.  memset(pCs
13510 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61  r, 0, sizeof(Pra
13520 67 6d 61 56 74 61 62 43 75 72 73 6f 72 29 29 3b  gmaVtabCursor));
13530 0a 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56  .  pCsr->base.pV
13540 74 61 62 20 3d 20 70 56 74 61 62 3b 0a 20 20 2a  tab = pVtab;.  *
13550 70 70 43 75 72 73 6f 72 20 3d 20 26 70 43 73 72  ppCursor = &pCsr
13560 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e  ->base;.  return
13570 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13580 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6e 74  * Clear all cont
13590 65 6e 74 20 66 72 6f 6d 20 70 72 61 67 6d 61 20  ent from pragma 
135a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
135b0 72 73 6f 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20  rsor. */.static 
135c0 76 6f 69 64 20 70 72 61 67 6d 61 56 74 61 62 43  void pragmaVtabC
135d0 75 72 73 6f 72 43 6c 65 61 72 28 50 72 61 67 6d  ursorClear(Pragm
135e0 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
135f0 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  r){.  int i;.  s
13600 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
13610 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a  pCsr->pPragma);.
13620 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20    pCsr->pPragma 
13630 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
13640 69 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72  i<ArraySize(pCsr
13650 2d 3e 61 7a 41 72 67 29 3b 20 69 2b 2b 29 7b 0a  ->azArg); i++){.
13660 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13670 28 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 29  (pCsr->azArg[i])
13680 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72  ;.    pCsr->azAr
13690 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  g[i] = 0;.  }.}.
136a0 0a 2f 2a 20 43 6c 6f 73 65 20 61 20 70 72 61 67  ./* Close a prag
136b0 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
136c0 20 63 75 72 73 6f 72 20 2a 2f 0a 73 74 61 74 69   cursor */.stati
136d0 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
136e0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74  Close(sqlite3_vt
136f0 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
13700 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13710 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13720 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 63  gmaVtabCursor*)c
13730 75 72 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62  ur;.  pragmaVtab
13740 43 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72  CursorClear(pCsr
13750 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
13760 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72  e(pCsr);.  retur
13770 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13780 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 70  /* Advance the p
13790 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
137a0 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  ble cursor to th
137b0 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 73 74  e next row */.st
137c0 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
137d0 74 61 62 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  tabNext(sqlite3_
137e0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
137f0 61 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61  abCursor){.  Pra
13800 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
13810 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
13820 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
13830 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  rsor;.  int rc =
13840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
13850 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
13860 78 52 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a  xRowid value */.
13870 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 2b 2b    pCsr->iRowid++
13880 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
13890 2d 3e 70 50 72 61 67 6d 61 20 29 3b 0a 20 20 69  ->pPragma );.  i
138a0 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73  f( SQLITE_ROW!=s
138b0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72  qlite3_step(pCsr
138c0 2d 3e 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20  ->pPragma) ){.  
138d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
138e0 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50  inalize(pCsr->pP
138f0 72 61 67 6d 61 29 3b 0a 20 20 20 20 70 43 73 72  ragma);.    pCsr
13900 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20  ->pPragma = 0;. 
13910 20 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72     pragmaVtabCur
13920 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a  sorClear(pCsr);.
13930 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13940 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d  .}../* .** Pragm
13950 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
13960 6d 6f 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d  module xFilter m
13970 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
13980 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 46   int pragmaVtabF
13990 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ilter(.  sqlite3
139a0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
139b0 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e  tabCursor, .  in
139c0 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20  t idxNum, const 
139d0 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20  char *idxStr,.  
139e0 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
139f0 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
13a00 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
13a10 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
13a20 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
13a30 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50  pVtabCursor;.  P
13a40 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
13a50 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28  = (PragmaVtab*)(
13a60 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
13a70 61 62 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ab);.  int rc;. 
13a80 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 53 74 72   int i, j;.  Str
13a90 41 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61  Accum acc;.  cha
13aa0 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20 55 4e 55 53  r *zSql;..  UNUS
13ab0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 78  ED_PARAMETER(idx
13ac0 4e 75 6d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Num);.  UNUSED_P
13ad0 41 52 41 4d 45 54 45 52 28 69 64 78 53 74 72 29  ARAMETER(idxStr)
13ae0 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 75  ;.  pragmaVtabCu
13af0 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b  rsorClear(pCsr);
13b00 0a 20 20 6a 20 3d 20 28 70 54 61 62 2d 3e 70 4e  .  j = (pTab->pN
13b10 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  ame->mPragFlg & 
13b20 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 29  PragFlg_Result1)
13b30 21 3d 30 20 3f 20 30 20 3a 20 31 3b 0a 20 20 66  !=0 ? 0 : 1;.  f
13b40 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
13b50 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 63  i++, j++){.    c
13b60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
13b70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
13b80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13b90 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  xt(argv[i]);.   
13ba0 20 61 73 73 65 72 74 28 20 6a 3c 41 72 72 61 79   assert( j<Array
13bb0 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67  Size(pCsr->azArg
13bc0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
13bd0 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d   pCsr->azArg[j]=
13be0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  =0 );.    if( zT
13bf0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 73  ext ){.      pCs
13c00 72 2d 3e 61 7a 41 72 67 5b 6a 5d 20 3d 20 73 71  r->azArg[j] = sq
13c10 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
13c20 73 22 2c 20 7a 54 65 78 74 29 3b 0a 20 20 20 20  s", zText);.    
13c30 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72    if( pCsr->azAr
13c40 67 5b 6a 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  g[j]==0 ){.     
13c50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13c60 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
13c70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
13c80 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
13c90 26 61 63 63 2c 20 30 2c 20 30 2c 20 30 2c 20 70  &acc, 0, 0, 0, p
13ca0 54 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Tab->db->aLimit[
13cb0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
13cc0 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 73 71 6c  _LENGTH]);.  sql
13cd0 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61  ite3_str_appenda
13ce0 6c 6c 28 26 61 63 63 2c 20 22 50 52 41 47 4d 41  ll(&acc, "PRAGMA
13cf0 20 22 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d   ");.  if( pCsr-
13d00 3e 61 7a 41 72 67 5b 31 5d 20 29 7b 0a 20 20 20  >azArg[1] ){.   
13d10 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
13d20 65 6e 64 66 28 26 61 63 63 2c 20 22 25 51 2e 22  endf(&acc, "%Q."
13d30 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d  , pCsr->azArg[1]
13d40 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
13d50 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26  _str_appendall(&
13d60 61 63 63 2c 20 70 54 61 62 2d 3e 70 4e 61 6d 65  acc, pTab->pName
13d70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
13d80 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 20 29  pCsr->azArg[0] )
13d90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
13da0 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63 2c 20  r_appendf(&acc, 
13db0 22 3d 25 51 22 2c 20 70 43 73 72 2d 3e 61 7a 41  "=%Q", pCsr->azA
13dc0 72 67 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53  rg[0]);.  }.  zS
13dd0 71 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41  ql = sqlite3StrA
13de0 63 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29  ccumFinish(&acc)
13df0 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
13e00 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13e10 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71  NOMEM;.  rc = sq
13e20 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
13e30 28 70 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  (pTab->db, zSql,
13e40 20 2d 31 2c 20 26 70 43 73 72 2d 3e 70 50 72 61   -1, &pCsr->pPra
13e50 67 6d 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  gma, 0);.  sqlit
13e60 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
13e70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13e80 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  OK ){.    pTab->
13e90 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73  base.zErrMsg = s
13ea0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
13eb0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
13ec0 6d 73 67 28 70 54 61 62 2d 3e 64 62 29 29 3b 0a  msg(pTab->db));.
13ed0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13ee0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 61 67   }.  return prag
13ef0 6d 61 56 74 61 62 4e 65 78 74 28 70 56 74 61 62  maVtabNext(pVtab
13f00 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Cursor);.}../*.*
13f10 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c  * Pragma virtual
13f20 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 45   table module xE
13f30 6f 66 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  of method..*/.st
13f40 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
13f50 74 61 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76  tabEof(sqlite3_v
13f60 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
13f70 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67  bCursor){.  Prag
13f80 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
13f90 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
13fa0 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
13fb0 73 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  sor;.  return (p
13fc0 43 73 72 2d 3e 70 50 72 61 67 6d 61 3d 3d 30 29  Csr->pPragma==0)
13fd0 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 78 43 6f 6c  ;.}../* The xCol
13fe0 75 6d 6e 20 6d 65 74 68 6f 64 20 73 69 6d 70 6c  umn method simpl
13ff0 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  y returns the co
14000 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75  rresponding colu
14010 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 50  mn from.** the P
14020 52 41 47 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61 74  RAGMA.  .*/.stat
14030 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
14040 62 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74  bColumn(.  sqlit
14050 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
14060 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20  pVtabCursor, .  
14070 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
14080 2a 63 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29  *ctx, .  int i.)
14090 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
140a0 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
140b0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
140c0 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50  pVtabCursor;.  P
140d0 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
140e0 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28  = (PragmaVtab*)(
140f0 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
14100 61 62 29 3b 0a 20 20 69 66 28 20 69 3c 70 54 61  ab);.  if( i<pTa
14110 62 2d 3e 69 48 69 64 64 65 6e 20 29 7b 0a 20 20  b->iHidden ){.  
14120 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
14130 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69  _value(ctx, sqli
14140 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
14150 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20  (pCsr->pPragma, 
14160 69 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  i));.  }else{.  
14170 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
14180 5f 74 65 78 74 28 63 74 78 2c 20 70 43 73 72 2d  _text(ctx, pCsr-
14190 3e 61 7a 41 72 67 5b 69 2d 70 54 61 62 2d 3e 69  >azArg[i-pTab->i
141a0 48 69 64 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54  Hidden],-1,SQLIT
141b0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
141c0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
141d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  E_OK;.}../* .** 
141e0 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  Pragma virtual t
141f0 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77  able module xRow
14200 69 64 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  id method..*/.st
14210 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
14220 74 61 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33  tabRowid(sqlite3
14230 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
14240 74 61 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74  tabCursor, sqlit
14250 65 5f 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 50  e_int64 *p){.  P
14260 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20  ragmaVtabCursor 
14270 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56  *pCsr = (PragmaV
14280 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62  tabCursor*)pVtab
14290 43 75 72 73 6f 72 3b 0a 20 20 2a 70 20 3d 20 70  Cursor;.  *p = p
142a0 43 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72  Csr->iRowid;.  r
142b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
142c0 0a 7d 0a 0a 2f 2a 20 54 68 65 20 70 72 61 67 6d  .}../* The pragm
142d0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
142e0 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63  object */.static
142f0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
14300 6f 64 75 6c 65 20 70 72 61 67 6d 61 56 74 61 62  odule pragmaVtab
14310 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20  Module = {.  0, 
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
14340 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  rsion */.  0,   
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61          /* xCrea
14370 74 65 20 2d 20 63 72 65 61 74 65 20 61 20 74 61  te - create a ta
14380 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  ble */.  pragmaV
14390 74 61 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20  tabConnect,     
143a0 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63        /* xConnec
143b0 74 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61  t - connect to a
143c0 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
143d0 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
143e0 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20  BestIndex,      
143f0 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78     /* xBestIndex
14400 20 2d 20 44 65 74 65 72 6d 69 6e 65 20 73 65 61   - Determine sea
14410 72 63 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a  rch strategy */.
14420 20 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63    pragmaVtabDisc
14430 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f  onnect,        /
14440 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20  * xDisconnect - 
14450 44 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20  Disconnect from 
14460 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20  a table */.  0, 
14470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
14490 73 74 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74  stroy - Drop a t
144a0 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61  able */.  pragma
144b0 56 74 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20  VtabOpen,       
144c0 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
144d0 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  - open a cursor 
144e0 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43  */.  pragmaVtabC
144f0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
14500 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c    /* xClose - cl
14510 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  ose a cursor */.
14520 20 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74    pragmaVtabFilt
14530 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
14540 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66  * xFilter - conf
14550 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74  igure scan const
14560 72 61 69 6e 74 73 20 2a 2f 0a 20 20 70 72 61 67  raints */.  prag
14570 6d 61 56 74 61 62 4e 65 78 74 2c 20 20 20 20 20  maVtabNext,     
14580 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78           /* xNex
14590 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75  t - advance a cu
145a0 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61  rsor */.  pragma
145b0 56 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20  VtabEof,        
145c0 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a         /* xEof *
145d0 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f  /.  pragmaVtabCo
145e0 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
145f0 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65   /* xColumn - re
14600 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 70 72 61  ad data */.  pra
14610 67 6d 61 56 74 61 62 52 6f 77 69 64 2c 20 20 20  gmaVtabRowid,   
14620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
14630 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20  wid - read data 
14640 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77    /* xUpdate - w
14670 72 69 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 30  rite data */.  0
14680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
146a0 42 65 67 69 6e 20 2d 20 62 65 67 69 6e 20 74 72  Begin - begin tr
146b0 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30  ansaction */.  0
146c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
146d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
146e0 53 79 6e 63 20 2d 20 73 79 6e 63 20 74 72 61 6e  Sync - sync tran
146f0 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
14720 6d 6d 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72  mmit - commit tr
14730 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30  ansaction */.  0
14740 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14760 52 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62  Rollback - rollb
14770 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ack transaction 
14780 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147a0 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69    /* xFindFuncti
147b0 6f 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76  on - function ov
147c0 65 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 30  erloading */.  0
147d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
147e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
147f0 52 65 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20  Rename - rename 
14800 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30  the table */.  0
14810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14830 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30  Savepoint */.  0
14840 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14860 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20 20  Release */.  0  
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
14890 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a  llbackTo */.};..
148a0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
148b0 65 65 20 69 66 20 7a 54 61 62 4e 61 6d 65 20 69  ee if zTabName i
148c0 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6e 61 6d  s really the nam
148d0 65 20 6f 66 20 61 20 70 72 61 67 6d 61 2e 20 20  e of a pragma.  
148e0 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 65  If it is,.** the
148f0 6e 20 72 65 67 69 73 74 65 72 20 61 6e 20 65 70  n register an ep
14900 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20  onymous virtual 
14910 74 61 62 6c 65 20 66 6f 72 20 74 68 61 74 20 70  table for that p
14920 72 61 67 6d 61 20 61 6e 64 20 72 65 74 75 72 6e  ragma and return
14930 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
14940 20 74 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a 65   the Module obje
14950 63 74 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76  ct for the new v
14960 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
14970 0a 4d 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65 33  .Module *sqlite3
14980 50 72 61 67 6d 61 56 74 61 62 52 65 67 69 73 74  PragmaVtabRegist
14990 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  er(sqlite3 *db, 
149a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
149b0 65 29 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67  e){.  const Prag
149c0 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a 20  maName *pName;. 
149d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
149e0 5f 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c  _strnicmp(zName,
149f0 20 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d   "pragma_", 7)==
14a00 30 20 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 70  0 );.  pName = p
14a10 72 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61 6d  ragmaLocate(zNam
14a20 65 2b 37 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d  e+7);.  if( pNam
14a30 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
14a40 0a 20 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e 6d  .  if( (pName->m
14a50 50 72 61 67 46 6c 67 20 26 20 28 50 72 61 67 46  PragFlg & (PragF
14a60 6c 67 5f 52 65 73 75 6c 74 30 7c 50 72 61 67 46  lg_Result0|PragF
14a70 6c 67 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30 20  lg_Result1))==0 
14a80 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
14a90 73 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73  sert( sqlite3Has
14aa0 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75  hFind(&db->aModu
14ab0 6c 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 3b  le, zName)==0 );
14ac0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
14ad0 33 56 74 61 62 43 72 65 61 74 65 4d 6f 64 75 6c  3VtabCreateModul
14ae0 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 72  e(db, zName, &pr
14af0 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c 20  agmaVtabModule, 
14b00 28 76 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30 29  (void*)pName, 0)
14b10 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
14b20 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
14b30 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e 64  ALTABLE */..#end
14b40 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
14b50 54 5f 50 52 41 47 4d 41 20 2a 2f 0a              T_PRAGMA */.