/ Hex Artifact Content
Login

Artifact bfaa7e5cbfc8eacaa0f3611d5ec2dca1339d6d301f1e9b429b49ca460d794a60:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 74  esult row with t
2400: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 68 65 6c  he result.** hel
2410: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 65  d in register re
2420: 67 52 65 73 75 6c 74 2e 20 20 44 65 63 72 65 6d  gResult.  Decrem
2430: 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74 20 63  ent the result c
2440: 6f 75 6e 74 20 61 6e 64 20 68 61 6c 74 20 69 66  ount and halt if
2450: 0a 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  .** the maximum 
2460: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
2470: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
2480: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
2490: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
24a0: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24b0: 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 52 65  be *v, int regRe
24c0: 73 75 6c 74 29 7b 0a 20 20 69 6e 74 20 61 64 64  sult){.  int add
24d0: 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  r;.  sqlite3Vdbe
24e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
24f0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
2500: 74 2c 20 31 29 3b 0a 20 20 61 64 64 72 20 3d 20  t, 1);.  addr = 
2510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2520: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  3(v, OP_IfPos, 1
2530: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
2540: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 31  rentAddr(v)+2, 1
2550: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
2560: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
2570: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2580: 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 72  Halt, 0, 0);.  r
2590: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
25a0: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70  *.** Process a p
25b0: 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  ragma statement.
25c0: 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73    .**.** Pragmas
25d0: 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72   are of this for
25e0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52  m:.**.**      PR
25f0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 64  AGMA [schema.]id
2600: 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a   [= value].**.**
2610: 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   The identifier 
2620: 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
2630: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c  string.  The val
2640: 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  ue is a string, 
2650: 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  and.** identifie
2660: 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20  r, or a number. 
2670: 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73   If minusFlag is
2680: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
2690: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75  value is.** a nu
26a0: 6d 62 65 72 20 74 68 61 74 20 77 61 73 20 70 72  mber that was pr
26b0: 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75  eceded by a minu
26c0: 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  s sign..**.** If
26d0: 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 20 69   the left side i
26e0: 73 20 22 64 61 74 61 62 61 73 65 2e 69 64 22 20  s "database.id" 
26f0: 74 68 65 6e 20 70 49 64 31 20 69 73 20 74 68 65  then pId1 is the
2700: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
2710: 2a 20 61 6e 64 20 70 49 64 32 20 69 73 20 74 68  * and pId2 is th
2720: 65 20 69 64 2e 20 20 49 66 20 74 68 65 20 6c 65  e id.  If the le
2730: 66 74 20 73 69 64 65 20 69 73 20 6a 75 73 74 20  ft side is just 
2740: 22 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69  "id" then pId1 i
2750: 73 20 74 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20  s the.** id and 
2760: 70 49 64 32 20 69 73 20 61 6e 79 20 65 6d 70 74  pId2 is any empt
2770: 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  y string..*/.voi
2780: 64 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28  d sqlite3Pragma(
2790: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27a0: 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31  , .  Token *pId1
27b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ,        /* Firs
27c0: 74 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  t part of [schem
27d0: 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20  a.]id field */. 
27e0: 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c 20 20 20   Token *pId2,   
27f0: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
2800: 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d  art of [schema.]
2810: 69 64 20 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c  id field, or NUL
2820: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56  L */.  Token *pV
2830: 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f  alue,      /* To
2840: 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c  ken for <value>,
2850: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
2860: 74 20 6d 69 6e 75 73 46 6c 61 67 20 20 20 20 20  t minusFlag     
2870: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 27    /* True if a '
2880: 2d 27 20 73 69 67 6e 20 70 72 65 63 65 64 65 64  -' sign preceded
2890: 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20   <value> */.){. 
28a0: 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30   char *zLeft = 0
28b0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  ;       /* Nul-t
28c0: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
28d0: 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20  string <id> */. 
28e0: 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20   char *zRight = 
28f0: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  0;      /* Nul-t
2900: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
2910: 73 74 72 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20  string <value>, 
2920: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
2930: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
2940: 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
2950: 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f  ase name */.  To
2960: 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20 20 20 20  ken *pId;       
2970: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2980: 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f  to <id> token */
2990: 0a 20 20 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b  .  char *aFcntl[
29a0: 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 67  4];       /* Arg
29b0: 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f  ument to SQLITE_
29c0: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a  FCNTL_PRAGMA */.
29d0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
29e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
29f0: 62 61 73 65 20 69 6e 64 65 78 20 66 6f 72 20 3c  base index for <
2a00: 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a 20 20 69  database> */.  i
2a10: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
2a30: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 6d  eturn value form
2a40: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
2a50: 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c 69 74 65  AGMA */.  sqlite
2a60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2a70: 64 62 3b 20 20 20 20 2f 2a 20 54 68 65 20 64 61  db;    /* The da
2a80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a90: 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20  n */.  Db *pDb; 
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
2ac0: 66 69 63 20 64 61 74 61 62 61 73 65 20 62 65 69  fic database bei
2ad0: 6e 67 20 70 72 61 67 6d 61 65 64 20 2a 2f 0a 20  ng pragmaed */. 
2ae0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
2af0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2b00: 29 3b 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20  );  /* Prepared 
2b10: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
2b20: 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
2b30: 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f 2a 20 54  *pPragma;   /* T
2b40: 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 0a 20 20  he pragma */..  
2b50: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
2b60: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
2b70: 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76 29 3b 0a  RunOnlyOnce(v);.
2b80: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
2b90: 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 70   2;..  /* Interp
2ba0: 72 65 74 20 74 68 65 20 5b 73 63 68 65 6d 61 2e  ret the [schema.
2bb0: 5d 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72  ] part of the pr
2bc0: 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20  agma statement. 
2bd0: 69 44 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20  iDb is the.  ** 
2be0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
2bf0: 61 62 61 73 65 20 74 68 69 73 20 70 72 61 67 6d  abase this pragm
2c00: 61 20 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69  a is being appli
2c10: 65 64 20 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b  ed to in db.aDb[
2c20: 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  ]. */.  iDb = sq
2c30: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
2c40: 28 70 50 61 72 73 65 2c 20 70 49 64 31 2c 20 70  (pParse, pId1, p
2c50: 49 64 32 2c 20 26 70 49 64 29 3b 0a 20 20 69 66  Id2, &pId);.  if
2c60: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
2c70: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
2c80: 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 49  Db[iDb];..  /* I
2c90: 66 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  f the temp datab
2ca0: 61 73 65 20 68 61 73 20 62 65 65 6e 20 65 78 70  ase has been exp
2cb0: 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64 20 61 73  licitly named as
2cc0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 0a 20 20   part of the .  
2cd0: 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61 6b 65 20  ** pragma, make 
2ce0: 73 75 72 65 20 69 74 20 69 73 20 6f 70 65 6e 2e  sure it is open.
2cf0: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62   .  */.  if( iDb
2d00: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 4f 70  ==1 && sqlite3Op
2d10: 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
2d20: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
2d30: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 4c 65  turn;.  }..  zLe
2d40: 66 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ft = sqlite3Name
2d50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 49  FromToken(db, pI
2d60: 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c 65 66 74  d);.  if( !zLeft
2d70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2d80: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
2d90: 20 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74    zRight = sqlit
2da0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d  e3MPrintf(db, "-
2db0: 25 54 22 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  %T", pValue);.  
2dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68  }else{.    zRigh
2dd0: 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  t = sqlite3NameF
2de0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 56 61  romToken(db, pVa
2df0: 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  lue);.  }..  ass
2e00: 65 72 74 28 20 70 49 64 32 20 29 3b 0a 20 20 7a  ert( pId2 );.  z
2e10: 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e 30 20 3f  Db = pId2->n>0 ?
2e20: 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a   pDb->zDbSName :
2e30: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
2e40: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
2e50: 65 2c 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e, SQLITE_PRAGMA
2e60: 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 2c  , zLeft, zRight,
2e70: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 67 6f 74   zDb) ){.    got
2e80: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
2e90: 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20 61 6e 20  }..  /* Send an 
2ea0: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
2eb0: 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GMA file-control
2ec0: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
2ed0: 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e  ng VFS.  ** conn
2ee0: 65 63 74 69 6f 6e 2e 20 20 49 66 20 69 74 20 72  ection.  If it r
2ef0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2f00: 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68  , then assume th
2f10: 61 74 20 74 68 65 20 56 46 53 0a 20 20 2a 2a 20  at the VFS.  ** 
2f20: 68 61 6e 64 6c 65 64 20 74 68 65 20 70 72 61 67  handled the prag
2f30: 6d 61 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ma and generate 
2f40: 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61 72 65 64  a no-op prepared
2f50: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a   statement..  **
2f60: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
2f70: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32 32 33 38  TION-OF: R-12238
2f80: 2d 35 35 31 32 30 20 57 68 65 6e 65 76 65 72 20  -55120 Whenever 
2f90: 61 20 50 52 41 47 4d 41 20 73 74 61 74 65 6d 65  a PRAGMA stateme
2fa0: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 0a 20 20  nt is parsed,.  
2fb0: 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e  ** an SQLITE_FCN
2fc0: 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c 65 20 63  TL_PRAGMA file c
2fd0: 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e 74 20 74  ontrol is sent t
2fe0: 6f 20 74 68 65 20 6f 70 65 6e 20 73 71 6c 69 74  o the open sqlit
2ff0: 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a  e3_file.  ** obj
3000: 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
3010: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
3020: 65 20 66 69 6c 65 20 74 6f 20 77 68 69 63 68 20  e file to which 
3030: 74 68 65 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20  the pragma.  ** 
3040: 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 73  statement refers
3050: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
3060: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
3070: 2d 32 39 38 37 35 2d 33 31 36 37 38 20 54 68 65  -29875-31678 The
3080: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3090: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
30a0: 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c 65 20 63  AGMA.  ** file c
30b0: 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20 61 72 72  ontrol is an arr
30c0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
30d0: 6f 20 73 74 72 69 6e 67 73 20 28 63 68 61 72 2a  o strings (char*
30e0: 2a 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a  *) in which the.
30f0: 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d    ** second elem
3100: 65 6e 74 20 6f 66 20 74 68 65 20 61 72 72 61 79  ent of the array
3110: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
3120: 74 68 65 20 70 72 61 67 6d 61 20 61 6e 64 20 74  the pragma and t
3130: 68 65 20 74 68 69 72 64 0a 20 20 2a 2a 20 65 6c  he third.  ** el
3140: 65 6d 65 6e 74 20 69 73 20 74 68 65 20 61 72 67  ement is the arg
3150: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 61  ument to the pra
3160: 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  gma or NULL if t
3170: 68 65 20 70 72 61 67 6d 61 20 68 61 73 20 6e 6f  he pragma has no
3180: 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  .  ** argument..
3190: 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d    */.  aFcntl[0]
31a0: 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31   = 0;.  aFcntl[1
31b0: 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63  ] = zLeft;.  aFc
31c0: 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b  ntl[2] = zRight;
31d0: 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30  .  aFcntl[3] = 0
31e0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
31f0: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
3200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
3210: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
3220: 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
3230: 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29  _PRAGMA, (void*)
3240: 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72  aFcntl);.  if( r
3250: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3270: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b  etNumCols(v, 1);
3280: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3290: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c  SetColName(v, 0,
32a0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61   COLNAME_NAME, a
32b0: 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c 49 54 45  Fcntl[0], SQLITE
32c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
32d0: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
32e0: 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b  t(v, aFcntl[0]);
32f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
3300: 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20  e(aFcntl[0]);.  
3310: 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75    goto pragma_ou
3320: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  t;.  }.  if( rc!
3330: 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
3340: 20 29 7b 0a 20 20 20 20 69 66 28 20 61 46 63 6e   ){.    if( aFcn
3350: 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  tl[0] ){.      s
3360: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3370: 50 61 72 73 65 2c 20 22 25 73 22 2c 20 61 46 63  Parse, "%s", aFc
3380: 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73  ntl[0]);.      s
3390: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e  qlite3_free(aFcn
33a0: 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  tl[0]);.    }.  
33b0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
33c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
33d0: 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20   = rc;.    goto 
33e0: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a  pragma_out;.  }.
33f0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
3400: 20 70 72 61 67 6d 61 20 69 6e 20 74 68 65 20 6c   pragma in the l
3410: 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a 2f 0a 20  ookup table */. 
3420: 20 70 50 72 61 67 6d 61 20 3d 20 70 72 61 67 6d   pPragma = pragm
3430: 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74 29 3b 0a  aLocate(zLeft);.
3440: 20 20 69 66 28 20 70 50 72 61 67 6d 61 3d 3d 30    if( pPragma==0
3450: 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f   ) goto pragma_o
3460: 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ut;..  /* Make s
3470: 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
3480: 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65   schema is loade
3490: 64 20 69 66 20 74 68 65 20 70 72 61 67 6d 61 20  d if the pragma 
34a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 2a 2f  requires that */
34b0: 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d  .  if( (pPragma-
34c0: 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
34d0: 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d 61 29 21  Flg_NeedSchema)!
34e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
34f0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
3500: 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70  pParse) ) goto p
3510: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  ragma_out;.  }..
3520: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
3530: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
3540: 6e 61 6d 65 73 20 66 6f 72 20 70 72 61 67 6d 61  names for pragma
3550: 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 72 65  s that return re
3560: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66 28 20 28  sults */.  if( (
3570: 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
3580: 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f  g & PragFlg_NoCo
3590: 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20 20 26 26  lumns)==0 .   &&
35a0: 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61   ((pPragma->mPra
35b0: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
35c0: 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c  oColumns1)==0 ||
35d0: 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20 20 29 7b   zRight==0).  ){
35e0: 0a 20 20 20 20 73 65 74 50 72 61 67 6d 61 52 65  .    setPragmaRe
35f0: 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  sultColumnNames(
3600: 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d  v, pPragma);.  }
3610: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
3620: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
3630: 72 61 67 6d 61 20 68 61 6e 64 6c 65 72 20 2a 2f  ragma handler */
3640: 0a 20 20 73 77 69 74 63 68 28 20 70 50 72 61 67  .  switch( pPrag
3650: 6d 61 2d 3e 65 50 72 61 67 54 79 70 20 29 7b 0a  ma->ePragTyp ){.
3660: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
3670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
3680: 52 5f 50 52 41 47 4d 41 53 29 20 26 26 20 21 64  R_PRAGMAS) && !d
3690: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
36a0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20  IT_DEPRECATED). 
36b0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
36c0: 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c   [schema.]defaul
36d0: 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a  t_cache_size.  *
36e0: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
36f0: 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65  a.]default_cache
3700: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
3710: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
3720: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
3730: 72 65 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20  rent persistent 
3740: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
3750: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
3760: 73 69 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65  size.  The value
3770: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
3780: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
3790: 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e  of.  ** pages in
37a0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
37b0: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
37c0: 6d 20 73 65 74 73 20 62 6f 74 68 20 74 68 65 20  m sets both the 
37d0: 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67  current.  ** pag
37e0: 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
37f0: 75 65 20 61 6e 64 20 74 68 65 20 70 65 72 73 69  ue and the persi
3800: 73 74 65 6e 74 20 70 61 67 65 20 63 61 63 68 65  stent page cache
3810: 20 73 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a   size value.  **
3820: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
3830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
3840: 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65  **.  ** Older ve
3850: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
3860: 20 77 6f 75 6c 64 20 73 65 74 20 74 68 65 20 64   would set the d
3870: 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a  efault cache siz
3880: 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61  e to a.  ** nega
3890: 74 69 76 65 20 6e 75 6d 62 65 72 20 74 6f 20 69  tive number to i
38a0: 6e 64 69 63 61 74 65 20 73 79 6e 63 68 72 6f 6e  ndicate synchron
38b0: 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65 73 65 20  ous=OFF.  These 
38c0: 64 61 79 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75  days, synchronou
38d0: 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  s.  ** is always
38e0: 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 72   on by default r
38f0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
3900: 20 73 69 67 6e 20 6f 66 20 74 68 65 20 64 65 66   sign of the def
3910: 61 75 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20  ault cache.  ** 
3920: 73 69 7a 65 2e 20 20 42 75 74 20 63 6f 6e 74 69  size.  But conti
3930: 6e 75 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  nue to take the 
3940: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
3950: 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61  f the default ca
3960: 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  che.  ** size of
3970: 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
3980: 61 74 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a  atibility..  */.
3990: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44    case PragTyp_D
39a0: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
39b0: 45 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  E: {.    static 
39c0: 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20  const int iLn = 
39d0: 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45  VDBE_OFFSET_LINE
39e0: 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69  NO(2);.    stati
39f0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
3a00: 73 74 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  st getCacheSize[
3a10: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
3a20: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c  _Transaction, 0,
3a30: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20         /* 0 */. 
3a60: 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f       { OP_ReadCo
3a70: 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20 20 20 20  okie,  0, 1,    
3a80: 20 20 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c      BTREE_DEFAUL
3a90: 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20  T_CACHE_SIZE},  
3aa0: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
3ab0: 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20  OP_IfPos,       
3ac0: 31 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 8,        0},
3ad0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
3ae0: 67 65 72 2c 20 20 20 20 20 30 2c 20 32 2c 20 20  ger,     0, 2,  
3af0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3b00: 7b 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 20  { OP_Subtract,  
3b10: 20 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20 31    1, 2,        1
3b20: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66  },.      { OP_If
3b30: 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c  Pos,       1, 8,
3b40: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
3b50: 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
3b60: 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20      0, 1,       
3b70: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20   0},            
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b90: 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  6 */.      { OP_
3ba0: 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 30 2c 20  Noop,        0, 
3bb0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
3bc0: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
3bd0: 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  ow,   1, 1,     
3be0: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
3bf0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
3c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
3c10: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
3c20: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
3c30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
3c40: 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20  ->nMem += 2;.   
3c50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
3c60: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
3c70: 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a  ired(v, ArraySiz
3c80: 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 29  e(getCacheSize))
3c90: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
3ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
3cb0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
3cc0: 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67  getCacheSize), g
3cd0: 65 74 43 61 63 68 65 53 69 7a 65 2c 20 69 4c 6e  etCacheSize, iLn
3ce0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c  );.      if( ONL
3cf0: 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  Y_IF_REALLOC_STR
3d00: 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72  ESS(aOp==0) ) br
3d10: 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30  eak;.      aOp[0
3d20: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
3d30: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
3d40: 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 36 5d 2e  b;.      aOp[6].
3d50: 70 31 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  p1 = SQLITE_DEFA
3d60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a  ULT_CACHE_SIZE;.
3d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3d80: 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69   int size = sqli
3d90: 74 65 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69  te3AbsInt32(sqli
3da0: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29  te3Atoi(zRight))
3db0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3dc0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
3dd0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
3de0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
3df0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3e00: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
3e10: 2c 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f  , BTREE_DEFAULT_
3e20: 43 41 43 48 45 5f 53 49 5a 45 2c 20 73 69 7a 65  CACHE_SIZE, size
3e30: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3e40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3e50: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3e60: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 44 62   0) );.      pDb
3e70: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
3e80: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
3e90: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
3ea0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62  SetCacheSize(pDb
3eb0: 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68  ->pBt, pDb->pSch
3ec0: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29  ema->cache_size)
3ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
3ee0: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
3ef0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41   !SQLITE_OMIT_PA
3f00: 47 45 52 5f 50 52 41 47 4d 41 53 20 26 26 20 21  GER_PRAGMAS && !
3f10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
3f20: 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69 66 20 21  ECATED */..#if !
3f30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3f40: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
3f50: 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  S).  /*.  **  PR
3f60: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f70: 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  ge_size.  **  PR
3f80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f90: 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  ge_size=N.  **. 
3fa0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
3fb0: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
3fc0: 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66  urrent setting f
3fd0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  or the.  ** data
3fe0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 69  base page size i
3ff0: 6e 20 62 79 74 65 73 2e 20 20 54 68 65 20 73 65  n bytes.  The se
4000: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
4010: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
4020: 20 70 61 67 65 20 73 69 7a 65 20 76 61 6c 75 65   page size value
4030: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 63 61 6e  .  The value can
4040: 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 0a   only be set if.
4050: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
4060: 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
4070: 65 6e 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  en created..  */
4080: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4090: 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  PAGE_SIZE: {.   
40a0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
40b0: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  b->pBt;.    asse
40c0: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
40d0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
40e0: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
40f0: 3d 20 41 4c 57 41 59 53 28 70 42 74 29 20 3f 20  = ALWAYS(pBt) ? 
4100: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
4110: 61 67 65 53 69 7a 65 28 70 42 74 29 20 3a 20 30  ageSize(pBt) : 0
4120: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
4130: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69 7a 65 29  ngleInt(v, size)
4140: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4150: 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79     /* Malloc may
4160: 20 66 61 69 6c 20 77 68 65 6e 20 73 65 74 74 69   fail when setti
4170: 6e 67 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  ng the page-size
4180: 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 61 6e  , as there is an
4190: 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20   internal.      
41a0: 2a 2a 20 62 75 66 66 65 72 20 74 68 61 74 20 74  ** buffer that t
41b0: 68 65 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20  he pager module 
41c0: 72 65 73 69 7a 65 73 20 75 73 69 6e 67 20 73 71  resizes using sq
41d0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e  lite3_realloc().
41e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
41f0: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4200: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
4210: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66  Right);.      if
4220: 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
4230: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
4240: 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
4250: 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 2d 31  >nextPagesize,-1
4260: 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ,0) ){.        s
4270: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
4280: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
4290: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
42a0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
42b0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63  GMA [schema.]sec
42c0: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
42d0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
42e0: 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f  ]secure_delete=O
42f0: 4e 2f 4f 46 46 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N/OFF.  **.  ** 
4300: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
4310: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
4320: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
4330: 68 65 0a 20 20 2a 2a 20 73 65 63 75 72 65 5f 64  he.  ** secure_d
4340: 65 6c 65 74 65 20 66 6c 61 67 2e 20 20 54 68 65  elete flag.  The
4350: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 68 61   second form cha
4360: 6e 67 65 73 20 74 68 65 20 73 65 63 75 72 65 5f  nges the secure_
4370: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 66 6c 61 67  delete.  ** flag
4380: 20 73 65 74 74 69 6e 67 20 61 6e 64 20 72 65 70   setting and rep
4390: 6f 72 74 73 20 74 68 65 6e 65 77 20 76 61 6c 75  orts thenew valu
43a0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  e..  */.  case P
43b0: 72 61 67 54 79 70 5f 53 45 43 55 52 45 5f 44 45  ragTyp_SECURE_DE
43c0: 4c 45 54 45 3a 20 7b 0a 20 20 20 20 42 74 72 65  LETE: {.    Btre
43d0: 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42  e *pBt = pDb->pB
43e0: 74 3b 0a 20 20 20 20 69 6e 74 20 62 20 3d 20 2d  t;.    int b = -
43f0: 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
4400: 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  Bt!=0 );.    if(
4410: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
4420: 20 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 42   b = sqlite3GetB
4430: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
4440: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4450: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62   pId2->n==0 && b
4460: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
4470: 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
4480: 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
4490: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
44a0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
44b0: 72 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62  reDelete(db->aDb
44c0: 5b 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20  [ii].pBt, b);.  
44d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
44e0: 62 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  b = sqlite3Btree
44f0: 53 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74  SecureDelete(pBt
4500: 2c 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , b);.    return
4510: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b  SingleInt(v, b);
4520: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4530: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4540: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f  MA [schema.]max_
4550: 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20  page_count.  ** 
4560: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4570: 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d  ]max_page_count=
4580: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
4590: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
45a0: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
45b0: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
45c0: 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62   ** maximum numb
45d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
45e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
45f0: 2e 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63  .  The .  ** sec
4600: 6f 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74  ond form attempt
4610: 73 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73  s to change this
4620: 20 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a   setting.  Both.
4630: 20 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72    ** forms retur
4640: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  n the current se
4650: 74 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tting..  **.  **
4660: 20 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   The absolute va
4670: 6c 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64  lue of N is used
4680: 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
4690: 75 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68  umented and migh
46a0: 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20  t.  ** change.  
46b0: 54 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65  The only purpose
46c0: 20 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61   is to provide a
46d0: 6e 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65  n easy way to te
46e0: 73 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  st.  ** the sqli
46f0: 74 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75  te3AbsInt32() fu
4700: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  nction..  **.  *
4710: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4720: 61 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20  a.]page_count.  
4730: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
4740: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
4750: 65 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  es in the specif
4760: 69 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ied database..  
4770: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
4780: 70 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a  p_PAGE_COUNT: {.
4790: 20 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20      int iReg;.  
47a0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
47b0: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
47c0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67  , iDb);.    iReg
47d0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
47e0: 6d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  m;.    if( sqlit
47f0: 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b  e3Tolower(zLeft[
4800: 30 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20  0])=='p' ){.    
4810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4820: 4f 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f  Op2(v, OP_Pageco
4830: 75 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b  unt, iDb, iReg);
4840: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4860: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63  Op3(v, OP_MaxPgc
4870: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a  nt, iDb, iReg, .
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
48a0: 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41  bsInt32(sqlite3A
48b0: 74 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20  toi(zRight)));. 
48c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
48d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
48e0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67  _ResultRow, iReg
48f0: 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 1);.    break;
4900: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4910: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4920: 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20  ]locking_mode.  
4930: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4940: 6d 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ma.]locking_mode
4950: 20 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75   = (normal|exclu
4960: 73 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73  sive).  */.  cas
4970: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e  e PragTyp_LOCKIN
4980: 47 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f  G_MODE: {.    co
4990: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  nst char *zRet =
49a0: 20 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69   "normal";.    i
49b0: 6e 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f  nt eMode = getLo
49c0: 63 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74  ckingMode(zRight
49d0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32  );..    if( pId2
49e0: 2d 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d  ->n==0 && eMode=
49f0: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4a00: 44 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20  DE_QUERY ){.    
4a10: 20 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41    /* Simple "PRA
4a20: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
4a30: 3b 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ;" statement. Th
4a40: 69 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f  is is a query fo
4a50: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
4a60: 75 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c  urrent default l
4a70: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69  ocking mode (whi
4a80: 63 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  ch may be differ
4a90: 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ent to.      ** 
4aa0: 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
4ab0: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
4ac0: 61 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f  abase)..      */
4ad0: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64  .      eMode = d
4ae0: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b  b->dfltLockMode;
4af0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b00: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
4b10: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d  .      if( pId2-
4b20: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >n==0 ){.       
4b30: 20 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   /* This indicat
4b40: 65 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62  es that no datab
4b50: 61 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65  ase name was spe
4b60: 63 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20  cified as part. 
4b70: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
4b80: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e   PRAGMA command.
4b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
4ba0: 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d  e locking-mode m
4bb0: 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
4bc0: 2a 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74  * set on all att
4bd0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c  ached databases,
4be0: 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
4bf0: 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20  main db file..  
4c00: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
4c10: 20 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71   ** Also, the sq
4c20: 6c 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f  lite3.dfltLockMo
4c30: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  de variable is s
4c40: 65 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20  et so that.     
4c50: 20 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71     ** any subseq
4c60: 75 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20  uently attached 
4c70: 64 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75  databases also u
4c80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
4c90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
4ca0: 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20  ing mode..      
4cb0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
4cc0: 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
4cd0: 65 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44  ert(pDb==&db->aD
4ce0: 62 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  b[0]);.        f
4cf0: 6f 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e  or(ii=2; ii<db->
4d00: 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
4d10: 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
4d20: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4d30: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4d40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4d50: 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
4d60: 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f  Mode(pPager, eMo
4d70: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  de);.        }. 
4d80: 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c         db->dfltL
4d90: 6f 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  ockMode = (u8)eM
4da0: 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
4db0: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
4dc0: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
4dd0: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65  b->pBt);.      e
4de0: 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Mode = sqlite3Pa
4df0: 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  gerLockingMode(p
4e00: 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  Pager, eMode);. 
4e10: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
4e20: 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
4e30: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
4e40: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
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 45 58 43 4c 55 53  CKINGMODE_EXCLUS
4e70: 49 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65  IVE );.    if( e
4e80: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4e90: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
4ea0: 45 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20  E ){.      zRet 
4eb0: 3d 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20  = "exclusive";. 
4ec0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
4ed0: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65  ingleText(v, zRe
4ee0: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
4ef0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
4f00: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
4f10: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a  ournal_mode.  **
4f20: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4f30: 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  .]journal_mode =
4f40: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
4f50: 20 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65             (dele
4f60: 74 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74  te|persist|off|t
4f70: 72 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77  runcate|memory|w
4f80: 61 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63  al|off).  */.  c
4f90: 61 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52  ase PragTyp_JOUR
4fa0: 4e 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20  NAL_MODE: {.    
4fb0: 69 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20  int eMode;      
4fc0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
4fd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
4fe0: 45 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f  E_XXX symbols */
4ff0: 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
5000: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5010: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69  ounter */..    i
5020: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( zRight==0 ){.
5030: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
5040: 65 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20  e is no "=MODE" 
5050: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67  part of the prag
5060: 6d 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66  ma, do a query f
5070: 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
5080: 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a  current mode */.
5090: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41        eMode = PA
50a0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
50b0: 51 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65  QUERY;.    }else
50c0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
50d0: 61 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20  ar *zMode;.     
50e0: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
50f0: 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29  Strlen30(zRight)
5100: 3b 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64  ;.      for(eMod
5110: 65 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71  e=0; (zMode = sq
5120: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65  lite3JournalMode
5130: 6e 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b  name(eMode))!=0;
5140: 20 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20   eMode++){.     
5150: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
5160: 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a  rNICmp(zRight, z
5170: 4d 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72  Mode, n)==0 ) br
5180: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5190: 20 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b     if( !zMode ){
51a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
51b0: 68 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20  he "=MODE" part 
51c0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
51d0: 6e 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c  ny known journal
51e0: 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a   mode,.        *
51f0: 2a 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72  * then do a quer
5200: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f  y */.        eMo
5210: 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
5220: 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20  ALMODE_QUERY;.  
5230: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5240: 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  if( eMode==PAGER
5250: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
5260: 52 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30  RY && pId2->n==0
5270: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e   ){.      /* Con
5280: 76 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75  vert "PRAGMA jou
5290: 72 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20  rnal_mode" into 
52a0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
52b0: 72 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20  rnal_mode" */.  
52c0: 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20      iDb = 0;.   
52d0: 20 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a     pId2->n = 1;.
52e0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
52f0: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d  =db->nDb-1; ii>=
5300: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
5310: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  if( db->aDb[ii].
5320: 70 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20  pBt && (ii==iDb 
5330: 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29  || pId2->n==0) )
5340: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5350: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
5360: 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73  , ii);.        s
5370: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5380: 28 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  (v, OP_JournalMo
5390: 64 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65  de, ii, 1, eMode
53a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
53b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
53c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
53d0: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
53e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
53f0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
5400: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5410: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a  l_size_limit.  *
5420: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
5430: 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  a.]journal_size_
5440: 6c 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  limit=N.  **.  *
5450: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
5460: 20 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72   size limit on r
5470: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
5480: 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  files..  */.  ca
5490: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
54a0: 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b  AL_SIZE_LIMIT: {
54b0: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
54c0: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
54d0: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
54e0: 3b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74  ;.    i64 iLimit
54f0: 20 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a   = -2;.    if( z
5500: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
5510: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
5520: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69  I64(zRight, &iLi
5530: 6d 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mit);.      if( 
5540: 69 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d  iLimit<-1 ) iLim
5550: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  it = -1;.    }. 
5560: 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69     iLimit = sqli
5570: 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
5580: 69 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c  izeLimit(pPager,
5590: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65   iLimit);.    re
55a0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
55b0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72   iLimit);.    br
55c0: 65 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  eak;.  }..#endif
55d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
55e0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
55f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
5600: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74  GMA [schema.]aut
5610: 6f 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50  o_vacuum.  **  P
5620: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
5630: 75 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a  uto_vacuum=N.  *
5640: 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65  *.  ** Get or se
5650: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
5660: 68 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74  he database 'aut
5670: 6f 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65  o-vacuum' parame
5680: 74 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  ter..  ** The va
5690: 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20  lue is one of:  
56a0: 30 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20  0 NONE 1 FULL 2 
56b0: 49 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f  INCREMENTAL.  */
56c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
56d0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
56e0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
56f0: 55 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20  UTO_VACUUM: {.  
5700: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
5710: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  Db->pBt;.    ass
5720: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
5730: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
5740: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
5750: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74  ngleInt(v, sqlit
5760: 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
5770: 63 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20  cuum(pBt));.    
5780: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
5790: 20 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f   eAuto = getAuto
57a0: 56 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a  Vacuum(zRight);.
57b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41        assert( eA
57c0: 75 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c  uto>=0 && eAuto<
57d0: 3d 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  =2 );.      db->
57e0: 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75  nextAutovac = (u
57f0: 38 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f  8)eAuto;.      /
5800: 2a 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61  * Call SetAutoVa
5810: 63 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e  cuum() to set in
5820: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74  itialize the int
5830: 65 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20  ernal auto and. 
5840: 20 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63       ** incr-vac
5850: 75 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20  uum flags. This 
5860: 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
5870: 61 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ase this connect
5880: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65  ion.      ** cre
5890: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
58a0: 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d  e file. It is im
58b0: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20  portant that it 
58c0: 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  is created.     
58d0: 20 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76   ** as an auto-v
58e0: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62  acuum capable db
58f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5900: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5910: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
5920: 70 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20  pBt, eAuto);.   
5930: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5940: 45 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d  E_OK && (eAuto==
5950: 31 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29  1 || eAuto==2) )
5960: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  {.        /* Whe
5970: 6e 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75  n setting the au
5980: 74 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to_vacuum mode t
5990: 6f 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20  o either "full" 
59a0: 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  or .        ** "
59b0: 69 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72  incremental", wr
59c0: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ite the value of
59d0: 20 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20   meta[6] in the 
59e0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
59f0: 20 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65   ** file. Before
5a00: 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61   writing to meta
5a10: 5b 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20  [6], check that 
5a20: 6d 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65  meta[3] indicate
5a30: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
5a40: 74 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73  t this really is
5a50: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
5a60: 63 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65  capable database
5a70: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5a80: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
5a90: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
5aa0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
5ab0: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  );.        stati
5ac0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
5ad0: 73 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20  st setMeta6[] = 
5ae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50  {.          { OP
5af0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
5b00: 20 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20   0,         1,  
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b20: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
5b30: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61          { OP_Rea
5b40: 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20  dCookie,     0, 
5b50: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5b60: 20 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54     BTREE_LARGEST
5b70: 5f 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20  _ROOT_PAGE},.   
5b80: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20         { OP_If, 
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20              1,  
5ba0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
5bb0: 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20            0},   
5bc0: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20   /* 2 */.       
5bd0: 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20     { OP_Halt,   
5be0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
5bf0: 4b 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20  K, OE_Abort,    
5c00: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c10: 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  3 */.          {
5c20: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
5c30: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42      0,         B
5c40: 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d  TREE_INCR_VACUUM
5c50: 2c 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f  , 0},    /* 4 */
5c60: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
5c70: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
5c80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64  .        int iAd
5c90: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5ca0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
5cb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5cc0: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
5cd0: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
5ce0: 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29  aySize(setMeta6)
5cf0: 29 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d  );.        aOp =
5d00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d10: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
5d20: 7a 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65  ze(setMeta6), se
5d30: 74 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20  tMeta6, iLn);.  
5d40: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
5d50: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
5d60: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
5d70: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d  ;.        aOp[0]
5d80: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
5d90: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
5da0: 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  Db;.        aOp[
5db0: 32 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b  2].p2 = iAddr+4;
5dc0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e  .        aOp[4].
5dd0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5de0: 20 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41    aOp[4].p3 = eA
5df0: 75 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  uto - 1;.       
5e00: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
5e10: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
5e20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5e30: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
5e40: 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  if..  /*.  **  P
5e50: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69  RAGMA [schema.]i
5e60: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
5e70: 6d 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  m(N).  **.  ** D
5e80: 6f 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63  o N steps of inc
5e90: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69  remental vacuumi
5ea0: 6e 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ng on a database
5eb0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5ec0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5ed0: 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61  ACUUM.  case Pra
5ee0: 67 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c  gTyp_INCREMENTAL
5ef0: 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69  _VACUUM: {.    i
5f00: 6e 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b  nt iLimit, addr;
5f10: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
5f20: 3d 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65  =0 || !sqlite3Ge
5f30: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
5f40: 69 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69  iLimit) || iLimi
5f50: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  t<=0 ){.      iL
5f60: 69 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66  imit = 0x7ffffff
5f70: 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  f;.    }.    sql
5f80: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5f90: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5fa0: 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
5fb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5fc0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c  , OP_Integer, iL
5fd0: 69 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64  imit, 1);.    ad
5fe0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5ff0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63  AddOp1(v, OP_Inc
6000: 72 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56  rVacuum, iDb); V
6010: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6020: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6030: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp1(v, OP_Resu
6040: 6c 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73  ltRow, 1);.    s
6050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6060: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
6070: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
6080: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6090: 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64  OP_IfPos, 1, add
60a0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
60b0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
60c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
60d0: 61 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b  addr);.    break
60e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
60f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6100: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
6110: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6120: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6130: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
6140: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6150: 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20  e_size=N.  **.  
6160: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
6170: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
6180: 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74  rrent local sett
6190: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
61a0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
61b0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  . The second for
61c0: 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c  m sets the local
61d0: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
61e0: 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66   size value.  If
61f0: 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74   N is positive t
6200: 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a  hen that is the.
6210: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
6220: 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
6230: 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61  e.  If N is nega
6240: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  tive, then the. 
6250: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
6260: 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20  ges is adjusted 
6270: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
6280: 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79  e uses -N kibiby
6290: 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f  tes.  ** of memo
62a0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
62b0: 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49  PragTyp_CACHE_SI
62c0: 5a 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE: {.    assert
62d0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
62e0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
62f0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
6300: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6310: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6320: 28 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  (v, pDb->pSchema
6330: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
6340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6350: 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74  int size = sqlit
6360: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
6370: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
6380: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  ma->cache_size =
6390: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
63a0: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
63b0: 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20  eSize(pDb->pBt, 
63c0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
63d0: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
63e0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
63f0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
6400: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6410: 65 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52  e_spill.  **  PR
6420: 41 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c  AGMA cache_spill
6430: 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50  =BOOLEAN.  **  P
6440: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63  RAGMA [schema.]c
6450: 61 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a  ache_spill=N.  *
6460: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
6470: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
6480: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20  e current local 
6490: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
64a0: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
64b0: 73 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20  spill size. The 
64c0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e  second form turn
64d0: 73 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e  s cache spill on
64e0: 0a 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57  .  ** or off.  W
64f0: 68 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63  hen turnning cac
6500: 68 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65  he spill on, the
6510: 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
6520: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
6530: 20 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68   cache_size.  Th
6540: 65 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74  e third form set
6550: 73 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74  s a spill size t
6560: 68 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  hat.  ** may be 
6570: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74  different form t
6580: 68 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  he cache size.. 
6590: 20 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69   ** If N is posi
65a0: 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69  tive then that i
65b0: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
65c0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
65d0: 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69  e cache.  If N i
65e0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
65f0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
6600: 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a   of pages is adj
6610: 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  usted so that th
6620: 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20  e cache uses -N 
6630: 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f  kibibytes.  ** o
6640: 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20  f memory..  **. 
6650: 20 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   ** If the numbe
6660: 72 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c  r of cache_spill
6670: 20 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74   pages is less t
6680: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
6690: 66 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a  f.  ** cache_siz
66a0: 65 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c  e pages, no spil
66b0: 6c 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69  ling occurs unti
66c0: 6c 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  l the page count
66d0: 20 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68   exceeds.  ** th
66e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
66f0: 65 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20  e_size pages..  
6700: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68  **.  ** The cach
6710: 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20  e_spill=BOOLEAN 
6720: 73 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20  setting applies 
6730: 74 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  to all attached 
6740: 73 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f  schemas,.  ** no
6750: 74 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d  t just the schem
6760: 61 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a  a specified..  *
6770: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
6780: 5f 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a  _CACHE_SPILL: {.
6790: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
67a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
67b0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
67c0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
67d0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
67e0: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20  nSingleInt(v,.  
67f0: 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67         (db->flag
6800: 73 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65  s & SQLITE_Cache
6810: 53 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20  Spill)==0 ? 0 : 
6820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6830: 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
6840: 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30  lSize(pDb->pBt,0
6850: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
6860: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
6870: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  1;.      if( sql
6880: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
6890: 67 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20  ght, &size) ){. 
68a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
68b0: 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
68c0: 70 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b  pDb->pBt, size);
68d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
68e0: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
68f0: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a  lean(zRight, siz
6900: 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  e!=0) ){.       
6910: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
6920: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b  LITE_CacheSpill;
6930: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6940: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6950: 26 3d 20 7e 53 51 4c 49 54 45 5f 43 61 63 68 65  &= ~SQLITE_Cache
6960: 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  Spill;.      }. 
6970: 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72       setAllPager
6980: 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d  Flags(db);.    }
6990: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
69a0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
69b0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70  MA [schema.]mmap
69c0: 5f 73 69 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20  _size(N).  **.  
69d0: 2a 2a 20 55 73 65 64 20 74 6f 20 73 65 74 20 6d  ** Used to set m
69e0: 61 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69  apping size limi
69f0: 74 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 73  t. The mapping s
6a00: 69 7a 65 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a  ize limit is.  *
6a10: 2a 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  * used to limit 
6a20: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 73 69  the aggregate si
6a30: 7a 65 20 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79  ze of all memory
6a40: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20   mapped regions 
6a50: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  of the.  ** data
6a60: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
6a70: 69 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  is parameter is 
6a80: 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  set to zero, the
6a90: 6e 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  n memory mapping
6aa0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65  .  ** is not use
6ab0: 64 20 61 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20  d at all.  If N 
6ac0: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
6ad0: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 65  n the default me
6ae0: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69  mory map.  ** li
6af0: 6d 69 74 20 64 65 74 65 72 6d 69 6e 65 64 20 62  mit determined b
6b00: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
6b10: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
6b20: 4d 41 50 5f 53 49 5a 45 29 20 69 73 20 73 65 74  MAP_SIZE) is set
6b30: 2e 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 61 6d  ..  ** The param
6b40: 65 74 65 72 20 4e 20 69 73 20 6d 65 61 73 75 72  eter N is measur
6b50: 65 64 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a  ed in bytes..  *
6b60: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 76 61 6c 75  *.  ** This valu
6b70: 65 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20  e is advisory.  
6b80: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56  The underlying V
6b90: 46 53 20 69 73 20 66 72 65 65 20 74 6f 20 6d 65  FS is free to me
6ba0: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73  mory map.  ** as
6bb0: 20 6c 69 74 74 6c 65 20 6f 72 20 61 73 20 6d 75   little or as mu
6bc0: 63 68 20 61 73 20 69 74 20 77 61 6e 74 73 2e 20  ch as it wants. 
6bd0: 20 45 78 63 65 70 74 2c 20 69 66 20 4e 20 69 73   Except, if N is
6be0: 20 73 65 74 20 74 6f 20 30 20 74 68 65 6e 20 74   set to 0 then t
6bf0: 68 65 0a 20 20 2a 2a 20 75 70 70 65 72 20 6c 61  he.  ** upper la
6c00: 79 65 72 73 20 77 69 6c 6c 20 6e 65 76 65 72 20  yers will never 
6c10: 69 6e 76 6f 6b 65 20 74 68 65 20 78 46 65 74 63  invoke the xFetc
6c20: 68 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20  h interfaces to 
6c30: 74 68 65 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20  the VFS..  */.  
6c40: 63 61 73 65 20 50 72 61 67 54 79 70 5f 4d 4d 41  case PragTyp_MMA
6c50: 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71  P_SIZE: {.    sq
6c60: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
6c70: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
6c80: 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61  MAP_SIZE>0.    a
6c90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
6ca0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
6cb0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
6cc0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
6cd0: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
6ce0: 20 20 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48     sqlite3DecOrH
6cf0: 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20  exToI64(zRight, 
6d00: 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &sz);.      if( 
6d10: 73 7a 3c 30 20 29 20 73 7a 20 3d 20 73 71 6c 69  sz<0 ) sz = sqli
6d20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
6d30: 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 69 66  szMmap;.      if
6d40: 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64  ( pId2->n==0 ) d
6d50: 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a  b->szMmap = sz;.
6d60: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d        for(ii=db-
6d70: 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69  >nDb-1; ii>=0; i
6d80: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i--){.        if
6d90: 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  ( db->aDb[ii].pB
6da0: 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c  t && (ii==iDb ||
6db0: 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a   pId2->n==0) ){.
6dc0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6dd0: 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
6de0: 69 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  it(db->aDb[ii].p
6df0: 42 74 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  Bt, sz);.       
6e00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6e10: 0a 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20  .    sz = -1;.  
6e20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
6e30: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
6e40: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  zDb, SQLITE_FCNT
6e50: 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
6e60: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 7a 20  );.#else.    sz 
6e70: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 0;.    rc = SQ
6e80: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
6e90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6ea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6eb0: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
6ec0: 2c 20 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , sz);.    }else
6ed0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6ee0: 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
6ef0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6f00: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
6f10: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  rc = rc;.    }. 
6f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6f30: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
6f40: 41 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a  A temp_store.  *
6f50: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
6f60: 73 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74  store = "default
6f70: 22 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65  "|"memory"|"file
6f80: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
6f90: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
6fa0: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
6fb0: 20 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67   temp_store flag
6fc0: 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a  .  Changing.  **
6fd0: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
6fe0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63   does not make c
6ff0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69  hanges to the di
7000: 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  sk file and the 
7010: 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c  default.  ** val
7020: 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f  ue will be resto
7030: 72 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d  red the next tim
7040: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
7050: 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20  s opened..  **. 
7060: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74   ** Note that it
7070: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
7080: 20 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d   the library com
7090: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
70a0: 73 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69  s to.  ** overri
70b0: 64 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a  de this setting.
70c0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
70d0: 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20  Typ_TEMP_STORE: 
70e0: 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  {.    if( !zRigh
70f0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
7100: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62  nSingleInt(v, db
7110: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20  ->temp_store);. 
7120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7130: 63 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67  changeTempStorag
7140: 65 28 70 50 61 72 73 65 2c 20 7a 52 69 67 68 74  e(pParse, zRight
7150: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
7160: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
7170: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
7180: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
7190: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
71a0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
71b0: 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74  ory = ""|"direct
71c0: 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20  ory_name".  **. 
71d0: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
71e0: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
71f0: 65 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74  e of the temp_st
7200: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c  ore_directory fl
7210: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7220: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7230: 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72  s a specific dir
7240: 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65  ectory to be use
7250: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
7260: 66 69 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74  files..  ** Sett
7270: 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74  ing to a null st
7280: 72 69 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20  ring reverts to 
7290: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70  the default temp
72a0: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
72b0: 73 65 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20  search..  ** If 
72c0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
72d0: 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ory is changed, 
72e0: 74 68 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54  then invalidateT
72f0: 65 6d 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a  empStorage..  **
7300: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
7310: 67 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f  gTyp_TEMP_STORE_
7320: 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20  DIRECTORY: {.   
7330: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7340: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
7350: 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65  leText(v, sqlite
7360: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
7370: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
7380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7390: 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20  T_WSD.      if( 
73a0: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
73b0: 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
73c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
73d0: 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70  e3OsAccess(db->p
73e0: 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c  Vfs, zRight, SQL
73f0: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
7400: 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20  RITE, &res);.   
7410: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
7420: 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30  ITE_OK || res==0
7430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7440: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7450: 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69  arse, "not a wri
7460: 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22  table directory"
7470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
7480: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
7490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
74a0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
74b0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20  _TEMP_STORE==0. 
74c0: 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45        || (SQLITE
74d0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26  _TEMP_STORE==1 &
74e0: 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  & db->temp_store
74f0: 3c 3d 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  <=1).       || (
7500: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7510: 45 3d 3d 32 20 26 26 20 64 62 2d 3e 74 65 6d 70  E==2 && db->temp
7520: 5f 73 74 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20  _store==1).     
7530: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
7540: 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67  lidateTempStorag
7550: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
7560: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7570: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 74 65  _free(sqlite3_te
7580: 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
7590: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
75a0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
75b0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
75c0: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
75d0: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
75e0: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
75f0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7600: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7610: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7620: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7630: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7640: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7650: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7660: 57 49 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  WIN.  /*.  **   
7670: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
7680: 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a  e_directory.  **
7690: 20 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73     PRAGMA data_s
76a0: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d  tore_directory =
76b0: 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e   ""|"directory_n
76c0: 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ame".  **.  ** R
76d0: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
76e0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20   local value of 
76f0: 74 68 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  the data_store_d
7700: 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20  irectory flag.  
7710: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
7720: 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73  e value sets a s
7730: 70 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72  pecific director
7740: 79 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  y to be used for
7750: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
7760: 74 68 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73  that.  ** were s
7770: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 20  pecified with a 
7780: 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
7790: 65 2e 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61  e.  Setting to a
77a0: 20 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76   null string rev
77b0: 65 72 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  erts.  ** to the
77c0: 20 64 65 66 61 75 6c 74 20 64 61 74 61 62 61 73   default databas
77d0: 65 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69  e directory, whi
77e0: 63 68 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ch for database 
77f0: 66 69 6c 65 73 20 73 70 65 63 69 66 69 65 64 20  files specified 
7800: 77 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61  with.  ** a rela
7810: 74 69 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70  tive path will p
7820: 72 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65 64  robably be based
7830: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
7840: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
7850: 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20  e.  ** process. 
7860: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   Database file s
7870: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 6e  pecified with an
7880: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61   absolute path a
7890: 72 65 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a  re not impacted.
78a0: 20 20 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74    ** by this set
78b0: 74 69 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73  ting, regardless
78c0: 20 6f 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20   of its value.. 
78d0: 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
78e0: 50 72 61 67 54 79 70 5f 44 41 54 41 5f 53 54 4f  PragTyp_DATA_STO
78f0: 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a  RE_DIRECTORY: {.
7900: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
7910: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
7920: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 73 71 6c  ingleText(v, sql
7930: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
7940: 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ory);.    }else{
7950: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7960: 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 69  OMIT_WSD.      i
7970: 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a  f( zRight[0] ){.
7980: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
7990: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
79a0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 64 62  lite3OsAccess(db
79b0: 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68 74 2c 20  ->pVfs, zRight, 
79c0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
79d0: 41 44 57 52 49 54 45 2c 20 26 72 65 73 29 3b 0a  ADWRITE, &res);.
79e0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
79f0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73  SQLITE_OK || res
7a00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7a10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7a20: 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 20  (pParse, "not a 
7a30: 77 72 69 74 61 62 6c 65 20 64 69 72 65 63 74 6f  writable directo
7a40: 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ry");.          
7a50: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
7a60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7a70: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7a80: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 64 61  _free(sqlite3_da
7a90: 74 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  ta_directory);. 
7aa0: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
7ab0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
7ac0: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
7ad0: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
7ae0: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
7af0: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
7b00: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7b10: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7b20: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7b30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7b40: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7b50: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7b60: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
7b70: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
7b80: 4e 47 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20  NG_STYLE.  /*.  
7b90: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
7ba0: 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ema.]lock_proxy_
7bb0: 66 69 6c 65 0a 20 20 2a 2a 20 20 20 50 52 41 47  file.  **   PRAG
7bc0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b  MA [schema.]lock
7bd0: 5f 70 72 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a  _proxy_file = ":
7be0: 61 75 74 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c  auto:"|"lock_fil
7bf0: 65 5f 70 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a  e_path".  **.  *
7c00: 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
7c10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
7c20: 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
7c30: 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
7c40: 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
7c50: 73 65 74 73 20 61 20 73 70 65 63 69 66 69 63 20  sets a specific 
7c60: 66 69 6c 65 20 74 6f 20 62 65 20 75 73 65 64 20  file to be used 
7c70: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 63 63  for database acc
7c80: 65 73 73 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a  ess locks..  **.
7c90: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7ca0: 54 79 70 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46  Typ_LOCK_PROXY_F
7cb0: 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21  ILE: {.    if( !
7cc0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
7cd0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
7ce0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
7cf0: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  r(pDb->pBt);.   
7d00: 20 20 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66     char *proxy_f
7d10: 69 6c 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b  ile_path = NULL;
7d20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7d30: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c  ile *pFile = sql
7d40: 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
7d50: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
7d60: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
7d70: 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c  lHint(pFile, SQL
7d80: 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
7d90: 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  YFILE, .        
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7db0: 20 20 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70     &proxy_file_p
7dc0: 61 74 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ath);.      retu
7dd0: 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20  rnSingleText(v, 
7de0: 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29  proxy_file_path)
7df0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e00: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
7e10: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7e20: 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  ager(pDb->pBt);.
7e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
7e40: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
7e50: 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
7e60: 67 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ger);.      int 
7e70: 72 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  res;.      if( z
7e80: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7e90: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7ea0: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7eb0: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7ec0: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 20 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20      zRight);.   
7f00: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
7f10: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7f20: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7f30: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7f40: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f70: 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20      NULL);.     
7f80: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73   }.      if( res
7f90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7fa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7fb0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7fc0: 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f  failed to set lo
7fd0: 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b  ck proxy file");
7fe0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72  .        goto pr
7ff0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
8000: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
8010: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
8020: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
8030: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20  OCKING_STYLE */ 
8040: 20 20 20 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a       .    .  /*.
8050: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
8060: 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f  chema.]synchrono
8070: 75 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  us.  **   PRAGMA
8080: 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72   [schema.]synchr
8090: 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52  onous=OFF|ON|NOR
80a0: 4d 41 4c 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20  MAL|FULL|EXTRA. 
80b0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
80c0: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
80d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
80e0: 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20  nchronous flag. 
80f0: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
8100: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64  he local value d
8110: 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61  oes not make cha
8120: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b  nges to the disk
8130: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20   file and the.  
8140: 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
8150: 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65   will be restore
8160: 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  d the next time 
8170: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
8180: 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a    ** opened..  *
8190: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
81a0: 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a  _SYNCHRONOUS: {.
81b0: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
81c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
81d0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d  ingleInt(v, pDb-
81e0: 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29  >safety_level-1)
81f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8200: 20 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f     if( !db->auto
8210: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
8220: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8230: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
8240: 20 20 20 20 20 20 20 22 53 61 66 65 74 79 20 6c         "Safety l
8250: 65 76 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20  evel may not be 
8260: 63 68 61 6e 67 65 64 20 69 6e 73 69 64 65 20 61  changed inside a
8270: 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a   transaction");.
8280: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8290: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
82a0: 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28    int iLevel = (
82b0: 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a  getSafetyLevel(z
82c0: 52 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26 20  Right,0,1)+1) & 
82d0: 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
82e0: 53 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20  S_MASK;.        
82f0: 69 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20  if( iLevel==0 ) 
8300: 69 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20  iLevel = 1;.    
8310: 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
8320: 6c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a  level = iLevel;.
8330: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53 79          pDb->bSy
8340: 6e 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  ncSet = 1;.     
8350: 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c     setAllPagerFl
8360: 61 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  ags(db);.      }
8370: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
8380: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
8390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
83a0: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  R_PRAGMAS */..#i
83b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
83c0: 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20  T_FLAG_PRAGMAS. 
83d0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4c   case PragTyp_FL
83e0: 41 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  AG: {.    if( zR
83f0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
8400: 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74   setPragmaResult
8410: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70  ColumnNames(v, p
8420: 50 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20 72  Pragma);.      r
8430: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
8440: 2c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 70  , (db->flags & p
8450: 50 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30  Pragma->iArg)!=0
8460: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
8470: 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
8480: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20  pPragma->iArg;  
8490: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
84a0: 73 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65 61  s to set or clea
84b0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
84c0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
84d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
84e0: 46 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70  Foreign key supp
84f0: 6f 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 65  ort may not be e
8500: 6e 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62 6c  nabled or disabl
8510: 65 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20  ed while not.   
8520: 20 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d       ** in auto-
8530: 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f  commit mode.  */
8540: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d  .        mask &=
8550: 20 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   ~(SQLITE_Foreig
8560: 6e 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a  nKeys);.      }.
8570: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
8580: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
8590: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
85a0: 68 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55  h.authLevel==UAU
85b0: 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20  TH_User ){.     
85c0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
85d0: 6f 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65  ow non-admin use
85e0: 72 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  rs to modify the
85f0: 20 73 63 68 65 6d 61 20 61 72 62 69 74 72 61 72   schema arbitrar
8600: 69 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ily */.        m
8610: 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ask &= ~(SQLITE_
8620: 57 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20 20  WriteSchema);.  
8630: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
8640: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
8650: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
8660: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
8670: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73  db->flags |= mas
8680: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
8690: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
86a0: 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  s &= ~mask;.    
86b0: 20 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51      if( mask==SQ
86c0: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 20  LITE_DeferFKs ) 
86d0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
86e0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
86f0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79  }..      /* Many
8700: 20 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72 61   of the flag-pra
8710: 67 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65 20  gmas modify the 
8720: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
8730: 79 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20 20  y the SQL .     
8740: 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65 67   ** compiler (eg
8750: 2e 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29  . count_changes)
8760: 2e 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f  . So add an opco
8770: 64 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c 6c  de to expire all
8780: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
8790: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
87a0: 73 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69 6e  s after modifyin
87b0: 67 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75 65  g a pragma value
87c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
87d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
87e0: 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29  p0(v, OP_Expire)
87f0: 3b 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61  ;.      setAllPa
8800: 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20  gerFlags(db);.  
8810: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8820: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8830: 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52  ITE_OMIT_FLAG_PR
8840: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
8850: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  f SQLITE_OMIT_SC
8860: 48 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f  HEMA_PRAGMAS.  /
8870: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
8880: 74 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c  table_info(<tabl
8890: 65 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  e>).  **.  ** Re
88a0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
88b0: 77 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  w for each colum
88c0: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74  n of the named t
88d0: 61 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e  able. The column
88e0: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65  s of.  ** the re
88f0: 74 75 72 6e 65 64 20 64 61 74 61 20 73 65 74 20  turned data set 
8900: 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  are:.  **.  ** c
8910: 69 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  id:        Colum
8920: 6e 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20 66  n id (numbered f
8930: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
8940: 74 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20 30  t, starting at 0
8950: 29 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20  ).  ** name:    
8960: 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20     Column name. 
8970: 20 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20 20   ** type:       
8980: 43 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  Column declarati
8990: 6f 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f  on type..  ** no
89a0: 74 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20 69  tnull:    True i
89b0: 66 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20  f 'NOT NULL' is 
89c0: 70 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64  part of column d
89d0: 65 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  eclaration.  ** 
89e0: 64 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65 20  dflt_value: The 
89f0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
8a00: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66  r the column, if
8a10: 20 61 6e 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   any..  */.  cas
8a20: 65 20 50 72 61 67 54 79 70 5f 54 41 42 4c 45 5f  e PragTyp_TABLE_
8a30: 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74  INFO: if( zRight
8a40: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
8a50: 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  Tab;.    pTab = 
8a60: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
8a70: 6c 65 28 70 50 61 72 73 65 2c 20 4c 4f 43 41 54  le(pParse, LOCAT
8a80: 45 5f 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c  E_NOERR, zRight,
8a90: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
8aa0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Tab ){.      int
8ab0: 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69 6e 74   i, k;.      int
8ac0: 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a 20 20   nHidden = 0;.  
8ad0: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
8ae0: 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
8af0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
8b00: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
8b10: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
8b20: 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20  >nMem = 6;.     
8b30: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
8b40: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
8b50: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
8b60: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
8b70: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
8b80: 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Tab);.      for(
8b90: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
8ba0: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
8bb0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
8bc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
8bd0: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f  HiddenColumn(pCo
8be0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
8bf0: 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20  nHidden++;.     
8c00: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8c10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8c20: 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46   if( (pCol->colF
8c30: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
8c40: 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20 20  RIMKEY)==0 ){.  
8c50: 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20          k = 0;. 
8c60: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8c70: 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPk==0 ){.     
8c80: 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20       k = 1;.    
8c90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ca0: 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
8cb0: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70  =pTab->nCol && p
8cc0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31  Pk->aiColumn[k-1
8cd0: 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20  ]!=i; k++){}.   
8ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
8cf0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70 44 66  ssert( pCol->pDf
8d00: 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70  lt==0 || pCol->p
8d10: 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41  Dflt->op==TK_SPA
8d20: 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
8d30: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
8d40: 64 28 76 2c 20 31 2c 20 22 69 73 73 69 73 69 22  d(v, 1, "issisi"
8d50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8d60: 20 69 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20   i-nHidden,.    
8d70: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
8d80: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
8d90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
8da0: 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22  lumnType(pCol,""
8db0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
8dc0: 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20    pCol->notNull 
8dd0: 3f 20 31 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  ? 1 : 0,.       
8de0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44          pCol->pD
8df0: 66 6c 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c  flt ? pCol->pDfl
8e00: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c  t->u.zToken : 0,
8e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e20: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
8e30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8e40: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
8e50: 2c 20 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 6);.      }.  
8e60: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
8e70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8e80: 44 45 42 55 47 0a 20 20 63 61 73 65 20 50 72 61  DEBUG.  case Pra
8e90: 67 54 79 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20  gTyp_STATS: {.  
8ea0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
8eb0: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a     HashElem *i;.
8ec0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8ed0: 20 3d 20 35 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 5;.    sqlite
8ee0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
8ef0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
8f00: 20 20 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65      for(i=sqlite
8f10: 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
8f20: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
8f30: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
8f40: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
8f50: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8f60: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
8f70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8f80: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
8f90: 20 31 2c 20 22 73 73 69 69 69 22 2c 0a 20 20 20   1, "ssiii",.   
8fa0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
8fb0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
8fc0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  0,.           pT
8fd0: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20  ab->szTabRow,.  
8fe0: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
8ff0: 52 6f 77 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20  RowLogEst,.     
9000: 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
9010: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  lags);.      sql
9020: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9030: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
9040: 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 66 6f 72  1, 5);.      for
9050: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
9060: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
9070: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9090: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20  MultiLoad(v, 2, 
90a0: 22 73 69 69 69 22 2c 0a 20 20 20 20 20 20 20 20  "siii",.        
90b0: 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a     pIdx->zName,.
90c0: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
90d0: 3e 73 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20  >szIdxRow,.     
90e0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f        pIdx->aiRo
90f0: 77 4c 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20 20  wLogEst[0],.    
9100: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 68 61 73         pIdx->has
9110: 53 74 61 74 31 29 3b 0a 20 20 20 20 20 20 20 20  Stat1);.        
9120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9130: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
9140: 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20  w, 1, 5);.      
9150: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
9160: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63  eak;.#endif..  c
9170: 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45  ase PragTyp_INDE
9180: 58 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67  X_INFO: if( zRig
9190: 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  ht ){.    Index 
91a0: 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65  *pIdx;.    Table
91b0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78   *pTab;.    pIdx
91c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
91d0: 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  dex(db, zRight, 
91e0: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49  zDb);.    if( pI
91f0: 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  dx ){.      int 
9200: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 3b  i;.      int mx;
9210: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 61 67  .      if( pPrag
9220: 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20 20  ma->iArg ){.    
9230: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
9240: 64 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77 65 72  dex_xinfo (newer
9250: 20 76 65 72 73 69 6f 6e 20 77 69 74 68 20 6d 6f   version with mo
9260: 72 65 20 72 6f 77 73 20 61 6e 64 20 63 6f 6c 75  re rows and colu
9270: 6d 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  mns) */.        
9280: 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  mx = pIdx->nColu
9290: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  mn;.        pPar
92a0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20  se->nMem = 6;.  
92b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
92c0: 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64     /* PRAGMA ind
92d0: 65 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63 79 20  ex_info (legacy 
92e0: 76 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  version) */.    
92f0: 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e      mx = pIdx->n
9300: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
9310: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33  pParse->nMem = 3
9320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9330: 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  pTab = pIdx->pTa
9340: 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ble;.      sqlit
9350: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
9360: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
9370: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9380: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72  Parse->nMem<=pPr
9390: 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65  agma->nPragCName
93a0: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
93b0: 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20  0; i<mx; i++){. 
93c0: 20 20 20 20 20 20 20 69 31 36 20 63 6e 75 6d 20         i16 cnum 
93d0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
93e0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  [i];.        sql
93f0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9400: 64 28 76 2c 20 31 2c 20 22 69 69 73 22 2c 20 69  d(v, 1, "iis", i
9410: 2c 20 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  , cnum,.        
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 20 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20       cnum<0 ? 0 
9440: 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75  : pTab->aCol[cnu
9450: 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m].zName);.     
9460: 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e     if( pPragma->
9470: 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iArg ){.        
9480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9490: 74 69 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73  tiLoad(v, 4, "is
94a0: 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i",.            
94b0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
94c0: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
94d0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
94e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 3c  ,.            i<
94f0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a  pIdx->nKeyCol);.
9500: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9520: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9530: 52 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  Row, 1, pParse->
9540: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  nMem);.      }. 
9550: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
9560: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
9570: 70 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66  p_INDEX_LIST: if
9580: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
9590: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
95a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
95b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54 61    int i;.    pTa
95c0: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
95d0: 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c  able(db, zRight,
95e0: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
95f0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Tab ){.      pPa
9600: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20  rse->nMem = 5;. 
9610: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
9620: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
9630: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
9640: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
9650: 70 49 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49 64  pIndex, i=0; pId
9660: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9670: 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ext, i++){.     
9680: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
9690: 7a 4f 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63  zOrigin[] = { "c
96a0: 22 2c 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a  ", "u", "pk" };.
96b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
96c0: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
96d0: 31 2c 20 22 69 73 69 73 69 22 2c 0a 20 20 20 20  1, "isisi",.    
96e0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
96f0: 20 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65       pIdx->zName
9700: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 49 73 55  ,.           IsU
9710: 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
9720: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 4f  ,.           azO
9730: 72 69 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54  rigin[pIdx->idxT
9740: 79 70 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  ype],.          
9750: 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
9760: 68 65 72 65 21 3d 30 29 3b 0a 20 20 20 20 20 20  here!=0);.      
9770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9780: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9790: 52 6f 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20  Row, 1, 5);.    
97a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
97b0: 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50  break;..  case P
97c0: 72 61 67 54 79 70 5f 44 41 54 41 42 41 53 45 5f  ragTyp_DATABASE_
97d0: 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  LIST: {.    int 
97e0: 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  i;.    pParse->n
97f0: 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 66 6f 72  Mem = 3;.    for
9800: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
9810: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
9820: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d   db->aDb[i].pBt=
9830: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
9840: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
9850: 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
9860: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
9870: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9880: 64 28 76 2c 20 31 2c 20 22 69 73 73 22 2c 0a 20  d(v, 1, "iss",. 
9890: 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20          i,.     
98a0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a      db->aDb[i].z
98b0: 44 62 53 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  DbSName,.       
98c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
98d0: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
98e0: 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20  b[i].pBt));.    
98f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9900: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9910: 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 20 20  Row, 1, 3);.    
9920: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
9930: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
9940: 4f 4c 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b  OLLATION_LIST: {
9950: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
9960: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
9970: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
9980: 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 70  m = 2;.    for(p
9990: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
99a0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
99b0: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
99c0: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20  Next(p)){.      
99d0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
99e0: 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69   (CollSeq *)sqli
99f0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
9a00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9a10: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
9a20: 22 69 73 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c  "is", i++, pColl
9a30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
9a40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9a50: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
9a60: 77 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a  w, 1, 2);.    }.
9a70: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
9a80: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9a90: 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d 41  IT_SCHEMA_PRAGMA
9aa0: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
9ab0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
9ac0: 4e 5f 4b 45 59 0a 20 20 63 61 73 65 20 50 72 61  N_KEY.  case Pra
9ad0: 67 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  gTyp_FOREIGN_KEY
9ae0: 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52 69 67 68  _LIST: if( zRigh
9af0: 74 20 29 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70  t ){.    FKey *p
9b00: 46 4b 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  FK;.    Table *p
9b10: 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  Tab;.    pTab = 
9b20: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
9b30: 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  (db, zRight, zDb
9b40: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
9b50: 29 7b 0a 20 20 20 20 20 20 70 46 4b 20 3d 20 70  ){.      pFK = p
9b60: 54 61 62 2d 3e 70 46 4b 65 79 3b 0a 20 20 20 20  Tab->pFKey;.    
9b70: 20 20 69 66 28 20 70 46 4b 20 29 7b 0a 20 20 20    if( pFK ){.   
9b80: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20       int i = 0; 
9b90: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
9ba0: 3e 6e 4d 65 6d 20 3d 20 38 3b 0a 20 20 20 20 20  >nMem = 8;.     
9bb0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
9bc0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
9bd0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
9be0: 20 77 68 69 6c 65 28 70 46 4b 29 7b 0a 20 20 20   while(pFK){.   
9bf0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
9c00: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
9c10: 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b   j<pFK->nCol; j+
9c20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
9c30: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9c40: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 69 73 73  Load(v, 1, "iiss
9c50: 73 73 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20  ssss",.         
9c60: 20 20 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20            i,.   
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
9c90: 20 20 20 20 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a        pFK->zTo,.
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 46     pTab->aCol[pF
9cc0: 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d  K->aCol[j].iFrom
9cd0: 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ].zName,.       
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d              pFK-
9cf0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20  >aCol[j].zCol,. 
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b    actionName(pFK
9d20: 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 29 2c 20 20  ->aAction[1]),  
9d30: 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 2a 2f 0a  /* ON UPDATE */.
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46     actionName(pF
9d60: 4b 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29 2c 20  K->aAction[0]), 
9d70: 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 2a 2f   /* ON DELETE */
9d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9d90: 20 20 20 20 22 4e 4f 4e 45 22 29 3b 0a 20 20 20      "NONE");.   
9da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9db0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9dc0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 38  _ResultRow, 1, 8
9dd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
9de0: 20 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20           ++i;.  
9df0: 20 20 20 20 20 20 20 20 70 46 4b 20 3d 20 70 46          pFK = pF
9e00: 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  K->pNextFrom;.  
9e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9e20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9e30: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  k;.#endif /* !de
9e40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9e50: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
9e60: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
9e70: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
9e80: 45 59 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  EY.#ifndef SQLIT
9e90: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
9ea0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f   case PragTyp_FO
9eb0: 52 45 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a  REIGN_KEY_CHECK:
9ec0: 20 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b   {.    FKey *pFK
9ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9ee0: 20 41 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63   A foreign key c
9ef0: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
9f00: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
9f10: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64          /* Child
9f20: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22   table contain "
9f30: 52 45 46 45 52 45 4e 43 45 53 22 20 6b 65 79 77  REFERENCES" keyw
9f40: 6f 72 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ord */.    Table
9f50: 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
9f60: 20 20 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c    /* Parent tabl
9f70: 65 20 74 68 61 74 20 63 68 69 6c 64 20 70 6f 69  e that child poi
9f80: 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e  nts to */.    In
9f90: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
9fa0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
9fb0: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
9fc0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20  e */.    int i; 
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a  /* Loop counter:
9ff0: 20 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75    Foreign key nu
a000: 6d 62 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f  mber for pTab */
a010: 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  .    int j;     
a020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a030: 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 69  oop counter:  Fi
a040: 65 6c 64 20 6f 66 20 74 68 65 20 66 6f 72 65 69  eld of the forei
a050: 67 6e 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61  gn key */.    Ha
a060: 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
a070: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
a080: 6e 74 65 72 3a 20 20 4e 65 78 74 20 74 61 62 6c  nter:  Next tabl
a090: 65 20 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20  e in schema */. 
a0a0: 20 20 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20     int x;       
a0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73            /* res
a0c0: 75 6c 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ult variable */.
a0d0: 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c      int regResul
a0e0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20  t;         /* 3 
a0f0: 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
a100: 64 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  d a result row *
a110: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79  /.    int regKey
a120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a130: 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64  Register to hold
a140: 20 6b 65 79 20 66 6f 72 20 63 68 65 63 6b 69 6e   key for checkin
a150: 67 20 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20  g the FK */.    
a160: 69 6e 74 20 72 65 67 52 6f 77 3b 20 20 20 20 20  int regRow;     
a170: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
a180: 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f  ers to hold a ro
a190: 77 20 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20  w from pTab */. 
a1a0: 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20     int addrTop; 
a1b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
a1c0: 20 6f 66 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b   of a loop check
a1d0: 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  ing foreign keys
a1e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
a1f0: 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Ok;            /
a200: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
a210: 68 65 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a  he key is OK */.
a220: 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b      int *aiCols;
a230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68             /* ch
a240: 69 6c 64 20 74 6f 20 70 61 72 65 6e 74 20 63 6f  ild to parent co
a250: 6c 75 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a  lumn mapping */.
a260: 0a 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 3d  .    regResult =
a270: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
a280: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
a290: 6d 20 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b  m += 4;.    regK
a2a0: 65 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ey = ++pParse->n
a2b0: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  Mem;.    regRow 
a2c0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
a2d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
a2e0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
a2f0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
a300: 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69  k = sqliteHashFi
a310: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62  rst(&db->aDb[iDb
a320: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
a330: 73 68 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  sh);.    while( 
a340: 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  k ){.      if( z
a350: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
a360: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
a370: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
a380: 65 2c 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44  e, 0, zRight, zD
a390: 62 29 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  b);.        k = 
a3a0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
a3b0: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 28          pTab = (
a3c0: 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
a3d0: 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
a3e0: 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68    k = sqliteHash
a3f0: 4e 65 78 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d  Next(k);.      }
a400: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
a410: 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65  =0 || pTab->pFKe
a420: 79 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  y==0 ) continue;
a430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
a440: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
a450: 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
a460: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
a470: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
a480: 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50  ->nCol+regRow>pP
a490: 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61  arse->nMem ) pPa
a4a0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62  rse->nMem = pTab
a4b0: 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b  ->nCol + regRow;
a4c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
a4d0: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
a4e0: 30 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  0, iDb, pTab, OP
a4f0: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
a500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
a510: 64 53 74 72 69 6e 67 28 76 2c 20 72 65 67 52 65  dString(v, regRe
a520: 73 75 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  sult, pTab->zNam
a530: 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  e);.      for(i=
a540: 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b  1, pFK=pTab->pFK
a550: 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46  ey; pFK; i++, pF
a560: 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d  K=pFK->pNextFrom
a570: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65  ){.        pPare
a580: 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nt = sqlite3Find
a590: 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a  Table(db, pFK->z
a5a0: 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  To, zDb);.      
a5b0: 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30    if( pParent==0
a5c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a5d0: 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20       pIdx = 0;. 
a5e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61         sqlite3Ta
a5f0: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
a600: 69 44 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e  iDb, pParent->tn
a610: 75 6d 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e  um, 0, pParent->
a620: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
a630: 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63  x = sqlite3FkLoc
a640: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
a650: 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26   pParent, pFK, &
a660: 70 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  pIdx, 0);.      
a670: 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20    if( x==0 ){.  
a680: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
a690: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a6a0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
a6b0: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  ble(pParse, i, i
a6c0: 44 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50 5f  Db, pParent, OP_
a6d0: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
a6e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a6f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a700: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a710: 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20 70 49 64  OpenRead, i, pId
a720: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
a730: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a740: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
a750: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
a760: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a770: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a780: 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20         k = 0;.  
a790: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a7a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a7b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a7c0: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c  Parse->nErr>0 ||
a7d0: 20 70 46 4b 3d 3d 30 20 29 3b 0a 20 20 20 20 20   pFK==0 );.     
a7e0: 20 69 66 28 20 70 46 4b 20 29 20 62 72 65 61 6b   if( pFK ) break
a7f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
a800: 73 65 2d 3e 6e 54 61 62 3c 69 20 29 20 70 50 61  se->nTab<i ) pPa
a810: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a 20  rse->nTab = i;. 
a820: 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73       addrTop = s
a830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
a840: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30  (v, OP_Rewind, 0
a850: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
a860: 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  v);.      for(i=
a870: 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b  1, pFK=pTab->pFK
a880: 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46  ey; pFK; i++, pF
a890: 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d  K=pFK->pNextFrom
a8a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65  ){.        pPare
a8b0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nt = sqlite3Find
a8c0: 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a  Table(db, pFK->z
a8d0: 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  To, zDb);.      
a8e0: 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20    pIdx = 0;.    
a8f0: 20 20 20 20 61 69 43 6f 6c 73 20 3d 20 30 3b 0a      aiCols = 0;.
a900: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
a910: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
a920: 20 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f   x = sqlite3FkLo
a930: 63 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  cateIndex(pParse
a940: 2c 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20  , pParent, pFK, 
a950: 26 70 49 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b  &pIdx, &aiCols);
a960: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
a970: 74 28 20 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( x==0 );.     
a980: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
a990: 72 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rOk = sqlite3Vdb
a9a0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
a9b0: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65         if( pPare
a9c0: 6e 74 20 26 26 20 70 49 64 78 3d 3d 30 20 29 7b  nt && pIdx==0 ){
a9d0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
a9e0: 4b 65 79 20 3d 20 70 46 4b 2d 3e 61 43 6f 6c 5b  Key = pFK->aCol[
a9f0: 30 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20  0].iFrom;.      
aa00: 20 20 20 20 61 73 73 65 72 74 28 20 69 4b 65 79      assert( iKey
aa10: 3e 3d 30 20 26 26 20 69 4b 65 79 3c 70 54 61 62  >=0 && iKey<pTab
aa20: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
aa30: 20 20 20 20 69 66 28 20 69 4b 65 79 21 3d 70 54      if( iKey!=pT
aa40: 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
aa50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
aa60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
aa70: 5f 43 6f 6c 75 6d 6e 2c 20 30 2c 20 69 4b 65 79  _Column, 0, iKey
aa80: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20  , regRow);.     
aa90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
aaa0: 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
aab0: 54 61 62 2c 20 69 4b 65 79 2c 20 72 65 67 52 6f  Tab, iKey, regRo
aac0: 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  w);.            
aad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aae0: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
aaf0: 72 65 67 52 6f 77 2c 20 61 64 64 72 4f 6b 29 3b  regRow, addrOk);
ab00: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ab10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
ab20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
ab30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ab40: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c  (v, OP_Rowid, 0,
ab50: 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20   regRow);.      
ab60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ab70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ab80: 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
ab90: 64 2c 20 69 2c 20 30 2c 20 72 65 67 52 6f 77 29  d, i, 0, regRow)
aba0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
abb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
abc0: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
abd0: 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20  addrOk);.       
abe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
abf0: 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65  mpHere(v, sqlite
ac00: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
ac10: 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 20 20  (v)-2);.        
ac20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ac30: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d   for(j=0; j<pFK-
ac40: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
ac50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ac60: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
ac70: 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
ac80: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aca0: 20 61 69 43 6f 6c 73 20 3f 20 61 69 43 6f 6c 73   aiCols ? aiCols
acb0: 5b 6a 5d 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b  [j] : pFK->aCol[
acc0: 6a 5d 2e 69 46 72 6f 6d 2c 20 72 65 67 52 6f 77  j].iFrom, regRow
acd0: 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +j);.           
ace0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
acf0: 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
ad00: 20 72 65 67 52 6f 77 2b 6a 2c 20 61 64 64 72 4f   regRow+j, addrO
ad10: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
ad20: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
ad30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
ad40: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
ad50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ad60: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
ad70: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
ad80: 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67  , pFK->nCol, reg
ad90: 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41     sqlite3IndexA
adc0: 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c 70 49  ffinityStr(db,pI
add0: 64 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b  dx), pFK->nCol);
ade0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
adf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
ae00: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
ae10: 2c 20 61 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79  , addrOk, regKey
ae20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
ae30: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
ae40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
ae50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ae60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ae70: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
ae80: 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b  0, regResult+1);
ae90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
aea0: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
aeb0: 20 72 65 67 52 65 73 75 6c 74 2b 32 2c 20 22 73   regResult+2, "s
aec0: 69 22 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d  i", pFK->zTo, i-
aed0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
aee0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
aef0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
af00: 65 67 52 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20  egResult, 4);.  
af10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
af20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
af30: 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20   addrOk);.      
af40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
af50: 64 62 2c 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20  db, aiCols);.   
af60: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
af70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
af80: 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64 72  OP_Next, 0, addr
af90: 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  Top+1); VdbeCove
afa0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
afb0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
afc0: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
afd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
afe0: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  k;.#endif /* !de
aff0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b000: 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 23 65  T_TRIGGER) */.#e
b010: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
b020: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
b030: 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69  EIGN_KEY) */..#i
b040: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 63  fndef NDEBUG.  c
b050: 61 73 65 20 50 72 61 67 54 79 70 5f 50 41 52 53  ase PragTyp_PARS
b060: 45 52 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20  ER_TRACE: {.    
b070: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
b080: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
b090: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
b0a0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
b0b0: 73 71 6c 69 74 65 33 50 61 72 73 65 72 54 72 61  sqlite3ParserTra
b0c0: 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73  ce(stdout, "pars
b0d0: 65 72 3a 20 22 29 3b 0a 20 20 20 20 20 20 7d 65  er: ");.      }e
b0e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
b0f0: 69 74 65 33 50 61 72 73 65 72 54 72 61 63 65 28  ite3ParserTrace(
b100: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
b110: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
b120: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
b130: 65 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b  einstall the LIK
b140: 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74  E and GLOB funct
b150: 69 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61  ions.  The varia
b160: 6e 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20  nt of LIKE.  ** 
b170: 75 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73  used will be cas
b180: 65 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e  e sensitive or n
b190: 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ot depending on 
b1a0: 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
b1b0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 53  case PragTyp_CAS
b1c0: 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45  E_SENSITIVE_LIKE
b1d0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
b1e0: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
b1f0: 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46  te3RegisterLikeF
b200: 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c  unctions(db, sql
b210: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
b220: 52 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20  Right, 0));.    
b230: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
b240: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49  #ifndef SQLITE_I
b250: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45  NTEGRITY_CHECK_E
b260: 52 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e  RROR_MAX.# defin
b270: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49  e SQLITE_INTEGRI
b280: 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d  TY_CHECK_ERROR_M
b290: 41 58 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23  AX 100.#endif..#
b2a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b2b0: 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
b2c0: 43 4b 0a 20 20 2f 2a 20 20 20 20 50 52 41 47 4d  CK.  /*    PRAGM
b2d0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
b2e0: 6b 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41  k.  **    PRAGMA
b2f0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
b300: 28 4e 29 0a 20 20 2a 2a 20 20 20 20 50 52 41 47  (N).  **    PRAG
b310: 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 0a 20  MA quick_check. 
b320: 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75   **    PRAGMA qu
b330: 69 63 6b 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a  ick_check(N).  *
b340: 2a 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  *.  ** Verify th
b350: 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
b360: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
b370: 2a 0a 20 20 2a 2a 20 54 68 65 20 22 71 75 69 63  *.  ** The "quic
b380: 6b 5f 63 68 65 63 6b 22 20 69 73 20 72 65 64 75  k_check" is redu
b390: 63 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a  ced version of .
b3a0: 20 20 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f 63    ** integrity_c
b3b0: 68 65 63 6b 20 64 65 73 69 67 6e 65 64 20 74 6f  heck designed to
b3c0: 20 64 65 74 65 63 74 20 6d 6f 73 74 20 64 61 74   detect most dat
b3d0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
b3e0: 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .  ** without th
b3f0: 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 63 72  e overhead of cr
b400: 6f 73 73 2d 63 68 65 63 6b 69 6e 67 20 69 6e 64  oss-checking ind
b410: 65 78 65 73 2e 20 20 51 75 69 63 6b 5f 63 68 65  exes.  Quick_che
b420: 63 6b 0a 20 20 2a 2a 20 69 73 20 6c 69 6e 65 61  ck.  ** is linea
b430: 72 20 74 69 6d 65 20 77 68 65 72 65 61 73 65 20  r time wherease 
b440: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
b450: 69 73 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a  is O(NlogN)..  *
b460: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
b470: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
b480: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a  : {.    int i, j
b490: 2c 20 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a 0a  , addr, mxErr;..
b4a0: 20 20 20 20 69 6e 74 20 69 73 51 75 69 63 6b 20      int isQuick 
b4b0: 3d 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65  = (sqlite3Tolowe
b4c0: 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71 27  r(zLeft[0])=='q'
b4d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
b4e0: 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64  e PRAGMA command
b4f0: 20 77 61 73 20 6f 66 20 74 68 65 20 66 6f 72 6d   was of the form
b500: 20 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69 6e   "PRAGMA <db>.in
b510: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 2c 0a  tegrity_check",.
b520: 20 20 20 20 2a 2a 20 74 68 65 6e 20 69 44 62 20      ** then iDb 
b530: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
b540: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
b550: 61 73 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ase identified b
b560: 79 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20 49  y <db>..    ** I
b570: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
b580: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 64 61   integrity of da
b590: 74 61 62 61 73 65 20 69 44 62 20 6f 6e 6c 79 20  tabase iDb only 
b5a0: 69 73 20 76 65 72 69 66 69 65 64 20 62 79 0a 20  is verified by. 
b5b0: 20 20 20 2a 2a 20 74 68 65 20 56 44 42 45 20 63     ** the VDBE c
b5c0: 72 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20 20  reated below..  
b5d0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65    **.    ** Othe
b5e0: 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f  rwise, if the co
b5f0: 6d 6d 61 6e 64 20 77 61 73 20 73 69 6d 70 6c 79  mmand was simply
b600: 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   "PRAGMA integri
b610: 74 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20 20  ty_check" (or.  
b620: 20 20 2a 2a 20 22 50 52 41 47 4d 41 20 71 75 69    ** "PRAGMA qui
b630: 63 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68 65 6e  ck_check"), then
b640: 20 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 30   iDb is set to 0
b650: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
b660: 73 65 74 20 69 44 62 0a 20 20 20 20 2a 2a 20 74  set iDb.    ** t
b670: 6f 20 2d 31 20 68 65 72 65 2c 20 74 6f 20 69 6e  o -1 here, to in
b680: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
b690: 56 44 42 45 20 73 68 6f 75 6c 64 20 76 65 72 69  VDBE should veri
b6a0: 66 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  fy the integrity
b6b0: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 61  .    ** of all a
b6c0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
b6d0: 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  s.  */.    asser
b6e0: 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20  t( iDb>=0 );.   
b6f0: 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20   assert( iDb==0 
b700: 7c 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20 20  || pId2->z );.  
b710: 20 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d 30    if( pId2->z==0
b720: 20 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20 20   ) iDb = -1;..  
b730: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
b740: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
b750: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
b760: 6e 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20 2f  nMem = 6;..    /
b770: 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
b780: 6d 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f  m error count */
b790: 0a 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c  .    mxErr = SQL
b7a0: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
b7b0: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20  ECK_ERROR_MAX;. 
b7c0: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
b7d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65  .      sqlite3Ge
b7e0: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
b7f0: 6d 78 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66  mxErr);.      if
b800: 28 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20  ( mxErr<=0 ){.  
b810: 20 20 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51        mxErr = SQ
b820: 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43  LITE_INTEGRITY_C
b830: 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a  HECK_ERROR_MAX;.
b840: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b860: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
b870: 72 2c 20 6d 78 45 72 72 2d 31 2c 20 31 29 3b 20  r, mxErr-1, 1); 
b880: 2f 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20  /* reg[1] holds 
b890: 65 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a  errors left */..
b8a0: 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74      /* Do an int
b8b0: 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6e 20  egrity check on 
b8c0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
b8d0: 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  le */.    for(i=
b8e0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
b8f0: 2b 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c  +){.      HashEl
b900: 65 6d 20 2a 78 3b 0a 20 20 20 20 20 20 48 61 73  em *x;.      Has
b910: 68 20 2a 70 54 62 6c 73 3b 0a 20 20 20 20 20 20  h *pTbls;.      
b920: 69 6e 74 20 2a 61 52 6f 6f 74 3b 0a 20 20 20 20  int *aRoot;.    
b930: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
b940: 20 20 20 20 20 69 6e 74 20 6d 78 49 64 78 20 3d       int mxIdx =
b950: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   0;.      int nI
b960: 64 78 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 4f  dx;..      if( O
b970: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 3d  MIT_TEMPDB && i=
b980: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =1 ) continue;. 
b990: 20 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20       if( iDb>=0 
b9a0: 26 26 20 69 21 3d 69 44 62 20 29 20 63 6f 6e 74  && i!=iDb ) cont
b9b0: 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c  inue;..      sql
b9c0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
b9d0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b  hema(pParse, i);
b9e0: 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e  ..      /* Do an
b9f0: 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
ba00: 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a 20   of the B-Tree. 
ba10: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
ba20: 20 42 65 67 69 6e 20 62 79 20 66 69 6e 64 69 6e   Begin by findin
ba30: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 73  g the root pages
ba40: 20 6e 75 6d 62 65 72 73 0a 20 20 20 20 20 20 2a   numbers.      *
ba50: 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  * for all tables
ba60: 20 61 6e 64 20 69 6e 64 69 63 65 73 20 69 6e 20   and indices in 
ba70: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
ba80: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
ba90: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
baa0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
bab0: 69 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70  i, 0) );.      p
bac0: 54 62 6c 73 20 3d 20 26 64 62 2d 3e 61 44 62 5b  Tbls = &db->aDb[
bad0: 69 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  i].pSchema->tblH
bae0: 61 73 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 63  ash;.      for(c
baf0: 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61  nt=0, x=sqliteHa
bb00: 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20  shFirst(pTbls); 
bb10: 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e  x; x=sqliteHashN
bb20: 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20  ext(x)){.       
bb30: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
bb40: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29  qliteHashData(x)
bb50: 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  ;.        Index 
bb60: 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69  *pIdx;.        i
bb70: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
bb80: 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  ) ) cnt++;.     
bb90: 20 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70     for(nIdx=0, p
bba0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
bbb0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
bbc0: 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b  x->pNext, nIdx++
bbd0: 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20  ){ cnt++; }.    
bbe0: 20 20 20 20 69 66 28 20 6e 49 64 78 3e 6d 78 49      if( nIdx>mxI
bbf0: 64 78 20 29 20 6d 78 49 64 78 20 3d 20 6e 49 64  dx ) mxIdx = nId
bc00: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
bc10: 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33   aRoot = sqlite3
bc20: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
bc30: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 63  , sizeof(int)*(c
bc40: 6e 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66  nt+1));.      if
bc50: 28 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72 65  ( aRoot==0 ) bre
bc60: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e  ak;.      for(cn
bc70: 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73  t=0, x=sqliteHas
bc80: 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78  hFirst(pTbls); x
bc90: 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; x=sqliteHashNe
bca0: 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(x)){.        
bcb0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
bcc0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b  liteHashData(x);
bcd0: 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
bce0: 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66  pIdx;.        if
bcf0: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
bd00: 20 29 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20   ) aRoot[cnt++] 
bd10: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20  = pTab->tnum;.  
bd20: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
bd30: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
bd40: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
bd50: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
bd60: 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70  aRoot[cnt++] = p
bd70: 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
bd80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
bd90: 20 20 20 61 52 6f 6f 74 5b 63 6e 74 5d 20 3d 20     aRoot[cnt] = 
bda0: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b  0;..      /* Mak
bdb0: 65 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  e sure sufficien
bdc0: 74 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  t number of regi
bdd0: 73 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  sters have been 
bde0: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20  allocated */.   
bdf0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
be00: 3d 20 4d 41 58 28 20 70 50 61 72 73 65 2d 3e 6e  = MAX( pParse->n
be10: 4d 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b 0a  Mem, 8+mxIdx );.
be20: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  .      /* Do the
be30: 20 62 2d 74 72 65 65 20 69 6e 74 65 67 72 69 74   b-tree integrit
be40: 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20 20 20 20  y checks */.    
be50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
be60: 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 65 67 72  Op4(v, OP_Integr
be70: 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74 2c 20 31  ityCk, 2, cnt, 1
be80: 2c 20 28 63 68 61 72 2a 29 61 52 6f 6f 74 2c 50  , (char*)aRoot,P
be90: 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 20  4_INTARRAY);.   
bea0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
beb0: 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 69 29  angeP5(v, (u8)i)
bec0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
bed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
bee0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32  (v, OP_IsNull, 2
bef0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
bf00: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
bf10: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
bf20: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c  P_String8, 0, 3,
bf30: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   0,.         sql
bf40: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
bf50: 22 2a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  "*** in database
bf60: 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e   %s ***\n", db->
bf70: 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[i].zDbSName)
bf80: 2c 0a 20 20 20 20 20 20 20 20 20 50 34 5f 44 59  ,.         P4_DY
bf90: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71  NAMIC);.      sq
bfa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
bfb0: 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 32 2c 20 34  v, OP_Move, 2, 4
bfc0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
bfd0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
bfe0: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33   OP_Concat, 4, 3
bff0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 69 6e 74 65  , 2);.      inte
c000: 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74  grityCheckResult
c010: 52 6f 77 28 76 2c 20 32 29 3b 0a 20 20 20 20 20  Row(v, 2);.     
c020: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c030: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a  Here(v, addr);..
c040: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
c050: 72 65 20 61 6c 6c 20 74 68 65 20 69 6e 64 69 63  re all the indic
c060: 65 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74  es are construct
c070: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ed correctly..  
c080: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72      */.      for
c090: 28 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (x=sqliteHashFir
c0a0: 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d  st(pTbls); x; x=
c0b0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78  sqliteHashNext(x
c0c0: 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  )){.        Tabl
c0d0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
c0e0: 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20  HashData(x);.   
c0f0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
c100: 2c 20 2a 70 50 6b 3b 0a 20 20 20 20 20 20 20 20  , *pPk;.        
c110: 49 6e 64 65 78 20 2a 70 50 72 69 6f 72 20 3d 20  Index *pPrior = 
c120: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  0;.        int l
c130: 6f 6f 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20  oopTop;.        
c140: 69 6e 74 20 69 44 61 74 61 43 75 72 2c 20 69 49  int iDataCur, iI
c150: 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 69  dxCur;.        i
c160: 6e 74 20 72 31 20 3d 20 2d 31 3b 0a 0a 20 20 20  nt r1 = -1;..   
c170: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
c180: 43 68 65 63 6b 3d 3d 30 0a 20 20 20 20 20 20 20  Check==0.       
c190: 20 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46    && (pTab->tabF
c1a0: 6c 61 67 73 20 26 20 54 46 5f 48 61 73 4e 6f 74  lags & TF_HasNot
c1b0: 4e 75 6c 6c 29 3d 3d 30 0a 20 20 20 20 20 20 20  Null)==0.       
c1c0: 20 20 26 26 20 28 70 54 61 62 2d 3e 70 49 6e 64    && (pTab->pInd
c1d0: 65 78 3d 3d 30 20 7c 7c 20 69 73 51 75 69 63 6b  ex==0 || isQuick
c1e0: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
c1f0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
c200: 20 20 2f 2a 20 4e 6f 20 61 64 64 69 74 69 6f 6e    /* No addition
c210: 61 6c 20 63 68 65 63 6b 73 20 6e 65 65 64 65 64  al checks needed
c220: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
c230: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
c240: 20 20 20 20 20 70 50 6b 20 3d 20 48 61 73 52 6f       pPk = HasRo
c250: 77 69 64 28 70 54 61 62 29 20 3f 20 30 20 3a 20  wid(pTab) ? 0 : 
c260: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
c270: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
c280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c290: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
c2a0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
c2b0: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64  ite3OpenTableAnd
c2c0: 49 6e 64 69 63 65 73 28 70 50 61 72 73 65 2c 20  Indices(pParse, 
c2d0: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
c2e0: 64 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  d, 0,.          
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 26           1, 0, &
c310: 69 44 61 74 61 43 75 72 2c 20 26 69 49 64 78 43  iDataCur, &iIdxC
c320: 75 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ur);.        sql
c330: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c340: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
c350: 20 37 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   7);.        for
c360: 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  (j=0, pIdx=pTab-
c370: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
c380: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
c390: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
c3a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c3b0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
c3c0: 2c 20 30 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e  , 0, 8+j); /* in
c3d0: 64 65 78 20 65 6e 74 72 69 65 73 20 63 6f 75 6e  dex entries coun
c3e0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ter */.        }
c3f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c400: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d 38   pParse->nMem>=8
c410: 2b 6a 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  +j );.        as
c420: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4e 6f 54  sert( sqlite3NoT
c430: 65 6d 70 73 49 6e 52 61 6e 67 65 28 70 50 61 72  empsInRange(pPar
c440: 73 65 2c 31 2c 37 2b 6a 29 20 29 3b 0a 20 20 20  se,1,7+j) );.   
c450: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c460: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
c470: 69 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20 30  ind, iDataCur, 0
c480: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
c490: 76 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6f 70  v);.        loop
c4a0: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
c4b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
c4c0: 64 49 6d 6d 2c 20 37 2c 20 31 29 3b 0a 20 20 20  dImm, 7, 1);.   
c4d0: 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
c4e0: 68 61 74 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c  hat all NOT NULL
c4f0: 20 63 6f 6c 75 6d 6e 73 20 72 65 61 6c 6c 79 20   columns really 
c500: 61 72 65 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a  are NOT NULL */.
c510: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
c520: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
c530: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
c540: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20  har *zErr;.     
c550: 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 3b 0a 20       int jmp2;. 
c560: 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
c570: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f  pTab->iPKey ) co
c580: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
c590: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
c5a0: 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  [j].notNull==0 )
c5b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
c5c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c5d0: 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
c5e0: 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 44  able(v, pTab, iD
c5f0: 61 74 61 43 75 72 2c 20 6a 2c 20 33 29 3b 0a 20  ataCur, j, 3);. 
c600: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c610: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
c620: 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
c630: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70  );.          jmp
c640: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
c650: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
c660: 75 6c 6c 2c 20 33 29 3b 20 56 64 62 65 43 6f 76  ull, 3); VdbeCov
c670: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
c680: 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74      zErr = sqlit
c690: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 4e  e3MPrintf(db, "N
c6a0: 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 25 73 2e  ULL value in %s.
c6b0: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
c6c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
c6f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
c700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c710: 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
c720: 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c 20   0, 3, 0, zErr, 
c730: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
c740: 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74 79         integrity
c750: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76  CheckResultRow(v
c760: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
c770: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
c780: 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20  ere(v, jmp2);.  
c790: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c7a0: 2f 2a 20 56 65 72 69 66 79 20 43 48 45 43 4b 20  /* Verify CHECK 
c7b0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
c7c0: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d         if( pTab-
c7d0: 3e 70 43 68 65 63 6b 20 26 26 20 28 64 62 2d 3e  >pCheck && (db->
c7e0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
c7f0: 67 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30 20  gnoreChecks)==0 
c800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
c810: 20 61 64 64 72 43 6b 46 61 75 6c 74 20 3d 20 73   addrCkFault = s
c820: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
c830: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
c840: 20 20 69 6e 74 20 61 64 64 72 43 6b 4f 6b 20 3d    int addrCkOk =
c850: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
c860: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
c870: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43      ExprList *pC
c880: 68 65 63 6b 20 3d 20 70 54 61 62 2d 3e 70 43 68  heck = pTab->pCh
c890: 65 63 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eck;.          c
c8a0: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20  har *zErr;.     
c8b0: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
c8c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53        pParse->iS
c8d0: 65 6c 66 54 61 62 20 3d 20 69 44 61 74 61 43 75  elfTab = iDataCu
c8e0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  r;.          sql
c8f0: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
c900: 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
c910: 20 20 20 20 20 66 6f 72 28 6b 3d 70 43 68 65 63       for(k=pChec
c920: 6b 2d 3e 6e 45 78 70 72 2d 31 3b 20 6b 3e 30 3b  k->nExpr-1; k>0;
c930: 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20   k--){.         
c940: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
c950: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43  False(pParse, pC
c960: 68 65 63 6b 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  heck->a[k].pExpr
c970: 2c 20 61 64 64 72 43 6b 46 61 75 6c 74 2c 20 30  , addrCkFault, 0
c980: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
c990: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c9a0: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
c9b0: 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b 30 5d 2e  e, pCheck->a[0].
c9c0: 70 45 78 70 72 2c 20 61 64 64 72 43 6b 4f 6b 2c  pExpr, addrCkOk,
c9d0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
c9f0: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
ca00: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ca10: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ca20: 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 46 61 75  bel(v, addrCkFau
ca30: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  lt);.          z
ca40: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Err = sqlite3MPr
ca50: 69 6e 74 66 28 64 62 2c 20 22 43 48 45 43 4b 20  intf(db, "CHECK 
ca60: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
ca70: 64 20 69 6e 20 25 73 22 2c 0a 20 20 20 20 20 20  d in %s",.      
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
caa0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
cab0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cac0: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
cad0: 38 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72  8, 0, 3, 0, zErr
cae0: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
caf0: 20 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69           integri
cb00: 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77  tyCheckResultRow
cb10: 28 76 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  (v, 3);.        
cb20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
cb30: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
cb40: 72 43 6b 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20  rCkOk);.        
cb50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
cb60: 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
cb70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cb80: 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 69 6e 64   /* Validate ind
cb90: 65 78 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ex entries for t
cba0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a  he current row *
cbb0: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  /.        for(j=
cbc0: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
cbd0: 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 21 69  ndex; pIdx && !i
cbe0: 73 51 75 69 63 6b 3b 20 70 49 64 78 3d 70 49 64  sQuick; pIdx=pId
cbf0: 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a  x->pNext, j++){.
cc00: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d            int jm
cc10: 70 32 2c 20 6a 6d 70 33 2c 20 6a 6d 70 34 2c 20  p2, jmp3, jmp4, 
cc20: 6a 6d 70 35 3b 0a 20 20 20 20 20 20 20 20 20 20  jmp5;.          
cc30: 69 6e 74 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c  int ckUniq = sql
cc40: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
cc50: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l(v);.          
cc60: 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20  if( pPk==pIdx ) 
cc70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
cc80: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
cc90: 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
cca0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69  (pParse, pIdx, i
ccb0: 44 61 74 61 43 75 72 2c 20 30 2c 20 30 2c 20 26  DataCur, 0, 0, &
ccc0: 6a 6d 70 33 2c 0a 20 20 20 20 20 20 20 20 20 20  jmp3,.          
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
ccf0: 69 6f 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ior, r1);.      
cd00: 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 49 64      pPrior = pId
cd10: 78 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  x;.          sql
cd20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cd30: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 38 2b 6a  , OP_AddImm, 8+j
cd40: 2c 20 31 29 3b 20 20 2f 2a 20 69 6e 63 72 65 6d  , 1);  /* increm
cd50: 65 6e 74 20 65 6e 74 72 79 20 63 6f 75 6e 74 20  ent entry count 
cd60: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  */.          /* 
cd70: 56 65 72 69 66 79 20 74 68 61 74 20 61 6e 20 69  Verify that an i
cd80: 6e 64 65 78 20 65 6e 74 72 79 20 65 78 69 73 74  ndex entry exist
cd90: 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
cda0: 74 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20  t table row */. 
cdb0: 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20           jmp2 = 
cdc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cdd0: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
cde0: 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 63 6b 55  , iIdxCur+j, ckU
cdf0: 6e 69 71 2c 20 72 31 2c 0a 20 20 20 20 20 20 20  niq, r1,.       
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
ce20: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 20 56  Idx->nColumn); V
ce30: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
ce40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ce50: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
ce60: 76 2c 20 33 2c 20 22 72 6f 77 20 22 29 3b 0a 20  v, 3, "row ");. 
ce70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ce80: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
ce90: 5f 43 6f 6e 63 61 74 2c 20 37 2c 20 33 2c 20 33  _Concat, 7, 3, 3
cea0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ceb0: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
cec0: 6e 67 28 76 2c 20 34 2c 20 22 20 6d 69 73 73 69  ng(v, 4, " missi
ced0: 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78 20 22 29  ng from index ")
cee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cef0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
cf00: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33   OP_Concat, 4, 3
cf10: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
cf20: 6a 6d 70 35 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp5 = sqlite3Vd
cf30: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
cf40: 34 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  4, pIdx->zName);
cf50: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cf60: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
cf70: 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c  OP_Concat, 4, 3,
cf80: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a   3);.          j
cf90: 6d 70 34 20 3d 20 69 6e 74 65 67 72 69 74 79 43  mp4 = integrityC
cfa0: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 2c  heckResultRow(v,
cfb0: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   3);.          s
cfc0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
cfd0: 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20  re(v, jmp2);.   
cfe0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e         /* For UN
cff0: 49 51 55 45 20 69 6e 64 65 78 65 73 2c 20 76 65  IQUE indexes, ve
d000: 72 69 66 79 20 74 68 61 74 20 6f 6e 6c 79 20 6f  rify that only o
d010: 6e 65 20 65 6e 74 72 79 20 65 78 69 73 74 73 20  ne entry exists 
d020: 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 20  with the.       
d030: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 6b 65     ** current ke
d040: 79 2e 20 20 54 68 65 20 65 6e 74 72 79 20 69 73  y.  The entry is
d050: 20 75 6e 69 71 75 65 20 69 66 20 28 31 29 20 61   unique if (1) a
d060: 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c  ny column is NUL
d070: 4c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  L.          ** o
d080: 72 20 28 32 29 20 74 68 65 20 6e 65 78 74 20 65  r (2) the next e
d090: 6e 74 72 79 20 68 61 73 20 61 20 64 69 66 66 65  ntry has a diffe
d0a0: 72 65 6e 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20  rent key */.    
d0b0: 20 20 20 20 20 20 69 66 28 20 49 73 55 6e 69 71        if( IsUniq
d0c0: 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b  ueIndex(pIdx) ){
d0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d0e0: 20 75 6e 69 71 4f 6b 20 3d 20 73 71 6c 69 74 65   uniqOk = sqlite
d0f0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
d100: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
d110: 6e 74 20 6a 6d 70 36 3b 0a 20 20 20 20 20 20 20  nt jmp6;.       
d120: 20 20 20 20 20 69 6e 74 20 6b 6b 3b 0a 20 20 20       int kk;.   
d130: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 6b 3d           for(kk=
d140: 30 3b 20 6b 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79  0; kk<pIdx->nKey
d150: 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20  Col; kk++){.    
d160: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
d170: 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
d180: 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20 20 20 20 20 20  umn[kk];.       
d190: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
d1a0: 43 6f 6c 21 3d 58 4e 5f 52 4f 57 49 44 20 26 26  Col!=XN_ROWID &&
d1b0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
d1c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
d1d0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
d1e0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
d1f0: 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f 6e 74  ].notNull ) cont
d200: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
d210: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d220: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
d230: 6c 6c 2c 20 72 31 2b 6b 6b 2c 20 75 6e 69 71 4f  ll, r1+kk, uniqO
d240: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
d250: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
d260: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
d270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70  .            jmp
d280: 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  6 = sqlite3VdbeA
d290: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp1(v, OP_Next
d2a0: 2c 20 69 49 64 78 43 75 72 2b 6a 29 3b 20 56 64  , iIdxCur+j); Vd
d2b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d2c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d2d0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 75 6e  e3VdbeGoto(v, un
d2e0: 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  iqOk);.         
d2f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d300: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 36 29 3b  mpHere(v, jmp6);
d310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
d330: 74 28 76 2c 20 4f 50 5f 49 64 78 47 54 2c 20 69  t(v, OP_IdxGT, i
d340: 49 64 78 43 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b  IdxCur+j, uniqOk
d350: 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , r1,.          
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 4b 65         pIdx->nKe
d380: 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  yCol); VdbeCover
d390: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
d3a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
d3b0: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20  oadString(v, 3, 
d3c0: 22 6e 6f 6e 2d 75 6e 69 71 75 65 20 65 6e 74 72  "non-unique entr
d3d0: 79 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20  y in index ");. 
d3e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d3f0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 6d  e3VdbeGoto(v, jm
d400: 70 35 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p5);.           
d410: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
d420: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 75 6e 69 71  lveLabel(v, uniq
d430: 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Ok);.          }
d440: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d450: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d460: 2c 20 6a 6d 70 34 29 3b 0a 20 20 20 20 20 20 20  , jmp4);.       
d470: 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
d480: 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50  ePartIdxLabel(pP
d490: 61 72 73 65 2c 20 6a 6d 70 33 29 3b 0a 20 20 20  arse, jmp3);.   
d4a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
d4b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d4c0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 44 61  (v, OP_Next, iDa
d4d0: 74 61 43 75 72 2c 20 6c 6f 6f 70 54 6f 70 29 3b  taCur, loopTop);
d4e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d4f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d500: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
d510: 20 6c 6f 6f 70 54 6f 70 2d 31 29 3b 0a 23 69 66   loopTop-1);.#if
d520: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d530: 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20  _BTREECOUNT.    
d540: 20 20 20 20 69 66 28 20 21 69 73 51 75 69 63 6b      if( !isQuick
d550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
d560: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
d570: 69 6e 67 28 76 2c 20 32 2c 20 22 77 72 6f 6e 67  ing(v, 2, "wrong
d580: 20 23 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e   # of entries in
d590: 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20   index ");.     
d5a0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
d5b0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
d5c0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
d5d0: 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20  ->pNext, j++){. 
d5e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
d5f0: 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74 69  Pk==pIdx ) conti
d600: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
d610: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d620: 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
d630: 69 49 64 78 43 75 72 2b 6a 2c 20 33 29 3b 0a 20  iIdxCur+j, 3);. 
d640: 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20             addr 
d650: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d660: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 38 2b  Op3(v, OP_Eq, 8+
d670: 6a 2c 20 30 2c 20 33 29 3b 20 56 64 62 65 43 6f  j, 0, 3); VdbeCo
d680: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
d690: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d6a0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
d6b0: 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  LITE_NOTNULL);. 
d6c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d6d0: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
d6e0: 28 76 2c 20 33 2c 20 70 49 64 78 2d 3e 7a 4e 61  (v, 3, pIdx->zNa
d6f0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
d700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d710: 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c  p3(v, OP_Concat,
d720: 20 33 2c 20 32 2c 20 37 29 3b 0a 20 20 20 20 20   3, 2, 7);.     
d730: 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74 79         integrity
d740: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76  CheckResultRow(v
d750: 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 7);.          
d760: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d770: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
d780: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d790: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
d7a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
d7b0: 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20  ECOUNT */.      
d7c0: 7d 20 0a 20 20 20 20 7d 0a 20 20 20 20 7b 0a 20  } .    }.    {. 
d7d0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
d7e0: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
d7f0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
d800: 29 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  );.      static 
d810: 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
d820: 20 65 6e 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20   endCode[] = {. 
d830: 20 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49         { OP_AddI
d840: 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20  mm,      1, 0,  
d850: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
d860: 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  0 */.        { O
d870: 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 20 20 31  P_IfNotZero,   1
d880: 2c 20 34 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 4,        0}, 
d890: 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20     /* 1 */.     
d8a0: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c     { OP_String8,
d8b0: 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20       0, 3,      
d8c0: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f    0},    /* 2 */
d8d0: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  .        { OP_Re
d8e0: 73 75 6c 74 52 6f 77 2c 20 20 20 33 2c 20 31 2c  sultRow,   3, 1,
d8f0: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
d900: 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a  * 3 */.      };.
d910: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f        VdbeOp *aO
d920: 70 3b 0a 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  p;..      aOp = 
d930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d940: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
d950: 65 28 65 6e 64 43 6f 64 65 29 2c 20 65 6e 64 43  e(endCode), endC
d960: 6f 64 65 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20  ode, iLn);.     
d970: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20   if( aOp ){.    
d980: 20 20 20 20 61 4f 70 5b 30 5d 2e 70 32 20 3d 20      aOp[0].p2 = 
d990: 31 2d 6d 78 45 72 72 3b 0a 20 20 20 20 20 20 20  1-mxErr;.       
d9a0: 20 61 4f 70 5b 32 5d 2e 70 34 74 79 70 65 20 3d   aOp[2].p4type =
d9b0: 20 50 34 5f 53 54 41 54 49 43 3b 0a 20 20 20 20   P4_STATIC;.    
d9c0: 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 2e 7a 20      aOp[2].p4.z 
d9d0: 3d 20 22 6f 6b 22 3b 0a 20 20 20 20 20 20 7d 0a  = "ok";.      }.
d9e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
d9f0: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
da00: 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
da10: 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
da20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
da30: 5f 55 54 46 31 36 0a 20 20 2f 2a 0a 20 20 2a 2a  _UTF16.  /*.  **
da40: 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69     PRAGMA encodi
da50: 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  ng.  **   PRAGMA
da60: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75 74 66   encoding = "utf
da70: 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c 22 75 74  -8"|"utf-16"|"ut
da80: 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31 36 62  f-16le"|"utf-16b
da90: 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  e".  **.  ** In 
daa0: 69 74 73 20 66 69 72 73 74 20 66 6f 72 6d 2c 20  its first form, 
dab0: 74 68 69 73 20 70 72 61 67 6d 61 20 72 65 74 75  this pragma retu
dac0: 72 6e 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  rns the encoding
dad0: 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a   of the main.  *
dae0: 2a 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  * database. If t
daf0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
db00: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  ot initialized, 
db10: 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
db20: 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  d now..  **.  **
db30: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
db40: 20 6f 66 20 74 68 69 73 20 70 72 61 67 6d 61 20   of this pragma 
db50: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
db60: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
db70: 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6e 6f  file.  ** has no
db80: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  t already been i
db90: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 6e 20 74  nitialized. In t
dba0: 68 69 73 20 63 61 73 65 20 69 74 20 73 65 74 73  his case it sets
dbb0: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a   the default.  *
dbc0: 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68 61 74 20  * encoding that 
dbd0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
dbe0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
dbf0: 73 65 20 66 69 6c 65 20 69 66 20 61 20 6e 65 77  se file if a new
dc00: 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 63 72   file.  ** is cr
dc10: 65 61 74 65 64 2e 20 49 66 20 61 6e 20 65 78 69  eated. If an exi
dc20: 73 74 69 6e 67 20 6d 61 69 6e 20 64 61 74 61 62  sting main datab
dc30: 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
dc40: 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ed, then the.  *
dc50: 2a 20 64 65 66 61 75 6c 74 20 74 65 78 74 20 65  * default text e
dc60: 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20  ncoding for the 
dc70: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
dc80: 65 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2a 20  e is used..  ** 
dc90: 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73  .  ** In all cas
dca0: 65 73 20 6e 65 77 20 64 61 74 61 62 61 73 65 73  es new databases
dcb0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
dcc0: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
dcd0: 64 20 61 72 65 0a 20 20 2a 2a 20 63 72 65 61 74  d are.  ** creat
dce0: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 73 61  ed to use the sa
dcf0: 6d 65 20 64 65 66 61 75 6c 74 20 74 65 78 74 20  me default text 
dd00: 65 6e 63 6f 64 69 6e 67 20 61 73 20 74 68 65 20  encoding as the 
dd10: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 49  main database. I
dd20: 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20  f.  ** the main 
dd30: 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74  database has not
dd40: 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
dd50: 64 20 61 6e 64 2f 6f 72 20 63 72 65 61 74 65 64  d and/or created
dd60: 20 77 68 65 6e 20 41 54 54 41 43 48 0a 20 20 2a   when ATTACH.  *
dd70: 2a 20 69 73 20 65 78 65 63 75 74 65 64 2c 20 74  * is executed, t
dd80: 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
dd90: 72 65 20 74 68 65 20 41 54 54 41 43 48 20 6f 70  re the ATTACH op
dda0: 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20  eration..  **.  
ddb0: 2a 2a 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** In the second
ddc0: 20 66 6f 72 6d 20 74 68 69 73 20 70 72 61 67 6d   form this pragm
ddd0: 61 20 73 65 74 73 20 74 68 65 20 74 65 78 74 20  a sets the text 
dde0: 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65 20 75  encoding to be u
ddf0: 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e 65 77 20  sed in.  ** new 
de00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63  database files c
de10: 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 69  reated using thi
de20: 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
de30: 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a 20 20  e. It is only.  
de40: 2a 2a 20 75 73 65 66 75 6c 20 69 66 20 69 6e 76  ** useful if inv
de50: 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  oked immediately
de60: 20 61 66 74 65 72 20 74 68 65 20 6d 61 69 6e 20   after the main 
de70: 64 61 74 61 62 61 73 65 20 69 0a 20 20 2a 2f 0a  database i.  */.
de80: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 45    case PragTyp_E
de90: 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20 20 20 20 73  NCODING: {.    s
dea0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
deb0: 63 74 20 45 6e 63 4e 61 6d 65 20 7b 0a 20 20 20  ct EncName {.   
dec0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
ded0: 20 20 20 20 20 20 75 38 20 65 6e 63 3b 0a 20 20        u8 enc;.  
dee0: 20 20 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d    } encnames[] =
def0: 20 7b 0a 20 20 20 20 20 20 7b 20 22 55 54 46 38   {.      { "UTF8
df00: 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  ",     SQLITE_UT
df10: 46 38 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  F8        },.   
df20: 20 20 20 7b 20 22 55 54 46 2d 38 22 2c 20 20 20     { "UTF-8",   
df30: 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20   SQLITE_UTF8    
df40: 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20      },  /* Must 
df50: 62 65 20 65 6c 65 6d 65 6e 74 20 5b 31 5d 20 2a  be element [1] *
df60: 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31  /.      { "UTF-1
df70: 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  6le", SQLITE_UTF
df80: 31 36 4c 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20  16LE     },  /* 
df90: 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20  Must be element 
dfa0: 5b 32 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22  [2] */.      { "
dfb0: 55 54 46 2d 31 36 62 65 22 2c 20 53 51 4c 49 54  UTF-16be", SQLIT
dfc0: 45 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c  E_UTF16BE     },
dfd0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65    /* Must be ele
dfe0: 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a 20 20 20 20  ment [3] */.    
dff0: 20 20 7b 20 22 55 54 46 31 36 6c 65 22 2c 20 20    { "UTF16le",  
e000: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20  SQLITE_UTF16LE  
e010: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55     },.      { "U
e020: 54 46 31 36 62 65 22 2c 20 20 53 51 4c 49 54 45  TF16be",  SQLITE
e030: 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c 0a  _UTF16BE     },.
e040: 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 22        { "UTF-16"
e050: 2c 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  ,   0           
e060: 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c         }, /* SQL
e070: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
e080: 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31  */.      { "UTF1
e090: 36 22 2c 20 20 20 20 30 20 20 20 20 20 20 20 20  6",    0        
e0a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20            }, /* 
e0b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
e0c0: 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 30 2c  VE */.      { 0,
e0d0: 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0 }.    };.    
e0e0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45 6e 63  const struct Enc
e0f0: 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a 20 20 20 20  Name *pEnc;.    
e100: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 20 20  if( !zRight ){  
e110: 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63    /* "PRAGMA enc
e120: 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20 20 20 20  oding" */.      
e130: 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53  if( sqlite3ReadS
e140: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
e150: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
e160: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
e170: 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55  ncnames[SQLITE_U
e180: 54 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45  TF8].enc==SQLITE
e190: 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 61  _UTF8 );.      a
e1a0: 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b  ssert( encnames[
e1b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 5d 2e  SQLITE_UTF16LE].
e1c0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
e1d0: 36 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  6LE );.      ass
e1e0: 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51  ert( encnames[SQ
e1f0: 4c 49 54 45 5f 55 54 46 31 36 42 45 5d 2e 65 6e  LITE_UTF16BE].en
e200: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c==SQLITE_UTF16B
e210: 45 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  E );.      retur
e220: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 65  nSingleText(v, e
e230: 6e 63 6e 61 6d 65 73 5b 45 4e 43 28 70 50 61 72  ncnames[ENC(pPar
e240: 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61 6d 65 29 3b  se->db)].zName);
e250: 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20  .    }else{     
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e     /* "PRAGMA en
e280: 63 6f 64 69 6e 67 20 3d 20 58 58 58 22 20 2a 2f  coding = XXX" */
e290: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 63  .      /* Only c
e2a0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
e2b0: 6f 66 20 73 71 6c 69 74 65 2e 65 6e 63 20 69 66  of sqlite.enc if
e2c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
e2d0: 6e 64 6c 65 20 69 73 20 6e 6f 74 0a 20 20 20 20  ndle is not.    
e2e0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
e2f0: 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61  . If the main da
e300: 74 61 62 61 73 65 20 65 78 69 73 74 73 2c 20 74  tabase exists, t
e310: 68 65 20 6e 65 77 20 73 71 6c 69 74 65 2e 65 6e  he new sqlite.en
e320: 63 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  c value.      **
e330: 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69   will be overwri
e340: 74 74 65 6e 20 77 68 65 6e 20 74 68 65 20 73 63  tten when the sc
e350: 68 65 6d 61 20 69 73 20 6e 65 78 74 20 6c 6f 61  hema is next loa
e360: 64 65 64 2e 20 49 66 20 69 74 20 64 6f 65 73 20  ded. If it does 
e370: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72  not.      ** alr
e380: 65 61 64 79 20 65 78 69 73 74 73 2c 20 69 74 20  eady exists, it 
e390: 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
e3a0: 74 6f 20 75 73 65 20 74 68 65 20 6e 65 77 20 65  to use the new e
e3b0: 6e 63 6f 64 69 6e 67 20 76 61 6c 75 65 2e 0a 20  ncoding value.. 
e3c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
e3d0: 28 20 0a 20 20 20 20 20 20 20 20 21 28 44 62 48  ( .        !(DbH
e3e0: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 30  asProperty(db, 0
e3f0: 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
e400: 64 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  d)) || .        
e410: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
e420: 2c 20 30 2c 20 44 42 5f 45 6d 70 74 79 29 20 0a  , 0, DB_Empty) .
e430: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
e440: 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e 63 6e 61   for(pEnc=&encna
e450: 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e 7a 4e  mes[0]; pEnc->zN
e460: 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a 20 20  ame; pEnc++){.  
e470: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
e480: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52  qlite3StrICmp(zR
e490: 69 67 68 74 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d  ight, pEnc->zNam
e4a0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
e4b0: 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29    SCHEMA_ENC(db)
e4c0: 20 3d 20 45 4e 43 28 64 62 29 20 3d 0a 20 20 20   = ENC(db) =.   
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 6e               pEn
e4e0: 63 2d 3e 65 6e 63 20 3f 20 70 45 6e 63 2d 3e 65  c->enc ? pEnc->e
e4f0: 6e 63 20 3a 20 53 51 4c 49 54 45 5f 55 54 46 31  nc : SQLITE_UTF1
e500: 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 20 20 20  6NATIVE;.       
e510: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e520: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e530: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  }.        if( !p
e540: 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  Enc->zName ){.  
e550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e560: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e570: 22 75 6e 73 75 70 70 6f 72 74 65 64 20 65 6e 63  "unsupported enc
e580: 6f 64 69 6e 67 3a 20 25 73 22 2c 20 7a 52 69 67  oding: %s", zRig
e590: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ht);.        }. 
e5a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e5b0: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
e5c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e5d0: 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65  UTF16 */..#ifnde
e5e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  f SQLITE_OMIT_SC
e5f0: 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41  HEMA_VERSION_PRA
e600: 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  GMAS.  /*.  **  
e610: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
e620: 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 0a  ]schema_version.
e630: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
e640: 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65  chema.]schema_ve
e650: 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72  rsion = <integer
e660: 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52  >.  **.  **   PR
e670: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73  AGMA [schema.]us
e680: 65 72 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20  er_version.  ** 
e690: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
e6a0: 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 20 3d  .]user_version =
e6b0: 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a   <integer>.  **.
e6c0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
e6d0: 63 68 65 6d 61 2e 5d 66 72 65 65 6c 69 73 74 5f  chema.]freelist_
e6e0: 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  count.  **.  ** 
e6f0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
e700: 2e 5d 64 61 74 61 5f 76 65 72 73 69 6f 6e 0a 20  .]data_version. 
e710: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
e720: 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69  A [schema.]appli
e730: 63 61 74 69 6f 6e 5f 69 64 0a 20 20 2a 2a 20 20  cation_id.  **  
e740: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
e750: 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 20  ]application_id 
e760: 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a  = <integer>.  **
e770: 0a 20 20 2a 2a 20 54 68 65 20 70 72 61 67 6d 61  .  ** The pragma
e780: 27 73 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  's schema_versio
e790: 6e 20 61 6e 64 20 75 73 65 72 5f 76 65 72 73 69  n and user_versi
e7a0: 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  on are used to s
e7b0: 65 74 20 6f 72 20 67 65 74 0a 20 20 2a 2a 20 74  et or get.  ** t
e7c0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
e7d0: 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61  schema-version a
e7e0: 6e 64 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 2c  nd user-version,
e7f0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 42   respectively. B
e800: 6f 74 68 0a 20 20 2a 2a 20 74 68 65 20 73 63 68  oth.  ** the sch
e810: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20  ema-version and 
e820: 74 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e  the user-version
e830: 20 61 72 65 20 33 32 2d 62 69 74 20 73 69 67 6e   are 32-bit sign
e840: 65 64 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a  ed integers.  **
e850: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
e860: 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 0a  atabase header..
e870: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 63    **.  ** The sc
e880: 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 69 73 20 75  hema-cookie is u
e890: 73 75 61 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69  sually only mani
e8a0: 70 75 6c 61 74 65 64 20 69 6e 74 65 72 6e 61 6c  pulated internal
e8b0: 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74  ly by SQLite. It
e8c0: 0a 20 20 2a 2a 20 69 73 20 69 6e 63 72 65 6d 65  .  ** is increme
e8d0: 6e 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  nted by SQLite w
e8e0: 68 65 6e 65 76 65 72 20 74 68 65 20 64 61 74 61  henever the data
e8f0: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6d  base schema is m
e900: 6f 64 69 66 69 65 64 20 28 62 79 0a 20 20 2a 2a  odified (by.  **
e910: 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 72 6f   creating or dro
e920: 70 70 69 6e 67 20 61 20 74 61 62 6c 65 20 6f 72  pping a table or
e930: 20 69 6e 64 65 78 29 2e 20 54 68 65 20 73 63 68   index). The sch
e940: 65 6d 61 20 76 65 72 73 69 6f 6e 20 69 73 20 75  ema version is u
e950: 73 65 64 20 62 79 0a 20 20 2a 2a 20 53 51 4c 69  sed by.  ** SQLi
e960: 74 65 20 65 61 63 68 20 74 69 6d 65 20 61 20 71  te each time a q
e970: 75 65 72 79 20 69 73 20 65 78 65 63 75 74 65 64  uery is executed
e980: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
e990: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
e9a0: 68 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  he.  ** of the s
e9b0: 63 68 65 6d 61 20 75 73 65 64 20 77 68 65 6e 20  chema used when 
e9c0: 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51  compiling the SQ
e9d0: 4c 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 20  L query matches 
e9e0: 74 68 65 20 73 63 68 65 6d 61 20 6f 66 0a 20 20  the schema of.  
e9f0: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
ea00: 61 67 61 69 6e 73 74 20 77 68 69 63 68 20 74 68  against which th
ea10: 65 20 63 6f 6d 70 69 6c 65 64 20 71 75 65 72 79  e compiled query
ea20: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 65 78 65   is actually exe
ea30: 63 75 74 65 64 2e 0a 20 20 2a 2a 20 53 75 62 76  cuted..  ** Subv
ea40: 65 72 74 69 6e 67 20 74 68 69 73 20 6d 65 63 68  erting this mech
ea50: 61 6e 69 73 6d 20 62 79 20 75 73 69 6e 67 20 22  anism by using "
ea60: 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65  PRAGMA schema_ve
ea70: 72 73 69 6f 6e 22 20 74 6f 20 6d 6f 64 69 66 79  rsion" to modify
ea80: 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
ea90: 2d 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 74 65  -version is pote
eaa0: 6e 74 69 61 6c 6c 79 20 64 61 6e 67 65 72 6f 75  ntially dangerou
eab0: 73 20 61 6e 64 20 6d 61 79 20 6c 65 61 64 20 74  s and may lead t
eac0: 6f 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 63  o program.  ** c
ead0: 72 61 73 68 65 73 20 6f 72 20 64 61 74 61 62 61  rashes or databa
eae0: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 55  se corruption. U
eaf0: 73 65 20 77 69 74 68 20 63 61 75 74 69 6f 6e 21  se with caution!
eb00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 75  .  **.  ** The u
eb10: 73 65 72 2d 76 65 72 73 69 6f 6e 20 69 73 20 6e  ser-version is n
eb20: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
eb30: 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74  ly by SQLite. It
eb40: 20 6d 61 79 20 62 65 20 75 73 65 64 20 62 79 0a   may be used by.
eb50: 20 20 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e    ** application
eb60: 73 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73  s for any purpos
eb70: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  e..  */.  case P
eb80: 72 61 67 54 79 70 5f 48 45 41 44 45 52 5f 56 41  ragTyp_HEADER_VA
eb90: 4c 55 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  LUE: {.    int i
eba0: 43 6f 6f 6b 69 65 20 3d 20 70 50 72 61 67 6d 61  Cookie = pPragma
ebb0: 2d 3e 69 41 72 67 3b 20 20 2f 2a 20 57 68 69 63  ->iArg;  /* Whic
ebc0: 68 20 63 6f 6f 6b 69 65 20 74 6f 20 72 65 61 64  h cookie to read
ebd0: 20 6f 72 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   or write */.   
ebe0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
ebf0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
ec00: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 26 26     if( zRight &&
ec10: 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67   (pPragma->mPrag
ec20: 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65  Flg & PragFlg_Re
ec30: 61 64 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a 20 20  adOnly)==0 ){.  
ec40: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
ec50: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f 6b 69   specified cooki
ec60: 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20  e value */.     
ec70: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
ec80: 62 65 4f 70 4c 69 73 74 20 73 65 74 43 6f 6f 6b  beOpList setCook
ec90: 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ie[] = {.       
eca0: 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f   { OP_Transactio
ecb0: 6e 2c 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d  n,    0,  1,  0}
ecc0: 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20  ,    /* 0 */.   
ecd0: 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f       { OP_SetCoo
ece0: 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 30 2c  kie,      0,  0,
ecf0: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f    0},    /* 1 */
ed00: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
ed10: 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20  VdbeOp *aOp;.   
ed20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
ed30: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
ed40: 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a  ired(v, ArraySiz
ed50: 65 28 73 65 74 43 6f 6f 6b 69 65 29 29 3b 0a 20  e(setCookie));. 
ed60: 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74       aOp = sqlit
ed70: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
ed80: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65 74  v, ArraySize(set
ed90: 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43 6f 6f 6b  Cookie), setCook
eda0: 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ie, 0);.      if
edb0: 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f  ( ONLY_IF_REALLO
edc0: 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29  C_STRESS(aOp==0)
edd0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
ede0: 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[0].p1 = iDb;
edf0: 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31  .      aOp[1].p1
ee00: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
ee10: 70 5b 31 5d 2e 70 32 20 3d 20 69 43 6f 6f 6b 69  p[1].p2 = iCooki
ee20: 65 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e  e;.      aOp[1].
ee30: 70 33 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69  p3 = sqlite3Atoi
ee40: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 65  (zRight);.    }e
ee50: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  lse{.      /* Re
ee60: 61 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ad the specified
ee70: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f   cookie value */
ee80: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
ee90: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 72  nst VdbeOpList r
eea0: 65 61 64 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a  eadCookie[] = {.
eeb0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61          { OP_Tra
eec0: 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 30 2c  nsaction,     0,
eed0: 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20    0,  0},    /* 
eee0: 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  0 */.        { O
eef0: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 20  P_ReadCookie,   
ef00: 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20     0,  1,  0},  
ef10: 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20    /* 1 */.      
ef20: 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77    { OP_ResultRow
ef30: 2c 20 20 20 20 20 20 20 31 2c 20 20 31 2c 20 20  ,       1,  1,  
ef40: 30 7d 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  0}.      };.    
ef50: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
ef60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ef70: 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65  VerifyNoMallocRe
ef80: 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79 53  quired(v, ArrayS
ef90: 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 29  ize(readCookie))
efa0: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
efb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
efc0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
efd0: 72 65 61 64 43 6f 6f 6b 69 65 29 2c 72 65 61 64  readCookie),read
efe0: 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20 20 20 20 20  Cookie,0);.     
eff0: 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41   if( ONLY_IF_REA
f000: 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d  LLOC_STRESS(aOp=
f010: 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
f020: 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69     aOp[0].p1 = i
f030: 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  Db;.      aOp[1]
f040: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
f050: 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 69 43 6f   aOp[1].p3 = iCo
f060: 6f 6b 69 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  okie;.      sqli
f070: 74 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28  te3VdbeReusable(
f080: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  v);.    }.  }.  
f090: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
f0a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
f0b0: 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47  EMA_VERSION_PRAG
f0c0: 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  MAS */..#ifndef 
f0d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
f0e0: 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a  ILEOPTION_DIAGS.
f0f0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
f100: 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f 70 74 69 6f  MA compile_optio
f110: 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  ns.  **.  ** Ret
f120: 75 72 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  urn the names of
f130: 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   all compile-tim
f140: 65 20 6f 70 74 69 6f 6e 73 20 75 73 65 64 20 69  e options used i
f150: 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 0a 20 20  n this build,.  
f160: 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f 6e 20 70 65  ** one option pe
f170: 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61  r row..  */.  ca
f180: 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4d 50 49  se PragTyp_COMPI
f190: 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20 7b 0a 20 20  LE_OPTIONS: {.  
f1a0: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
f1b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
f1c0: 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  t;.    pParse->n
f1d0: 4d 65 6d 20 3d 20 31 3b 0a 20 20 20 20 77 68 69  Mem = 1;.    whi
f1e0: 6c 65 28 20 28 7a 4f 70 74 20 3d 20 73 71 6c 69  le( (zOpt = sqli
f1f0: 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  te3_compileoptio
f200: 6e 5f 67 65 74 28 69 2b 2b 29 29 21 3d 30 20 29  n_get(i++))!=0 )
f210: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
f220: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
f230: 20 31 2c 20 7a 4f 70 74 29 3b 0a 20 20 20 20 20   1, zOpt);.     
f240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f250: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
f260: 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ow, 1, 1);.    }
f270: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f280: 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20 20 7d  Reusable(v);.  }
f290: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
f2a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f2b0: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
f2c0: 41 47 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  AGS */..#ifndef 
f2d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
f2e0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
f2f0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 77 61 6c 5f  MA [schema.]wal_
f300: 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 70 61 73  checkpoint = pas
f310: 73 69 76 65 7c 66 75 6c 6c 7c 72 65 73 74 61 72  sive|full|restar
f320: 74 7c 74 72 75 6e 63 61 74 65 0a 20 20 2a 2a 0a  t|truncate.  **.
f330: 20 20 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20    ** Checkpoint 
f340: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
f350: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
f360: 70 5f 57 41 4c 5f 43 48 45 43 4b 50 4f 49 4e 54  p_WAL_CHECKPOINT
f370: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 42 74 20  : {.    int iBt 
f380: 3d 20 28 70 49 64 32 2d 3e 7a 3f 69 44 62 3a 53  = (pId2->z?iDb:S
f390: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
f3a0: 45 44 29 3b 0a 20 20 20 20 69 6e 74 20 65 4d 6f  ED);.    int eMo
f3b0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
f3c0: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3b 0a  KPOINT_PASSIVE;.
f3d0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
f3e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
f3f0: 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68  te3StrICmp(zRigh
f400: 74 2c 20 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b  t, "full")==0 ){
f410: 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
f420: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
f430: 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  NT_FULL;.      }
f440: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
f450: 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  StrICmp(zRight, 
f460: 22 72 65 73 74 61 72 74 22 29 3d 3d 30 20 29 7b  "restart")==0 ){
f470: 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
f480: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
f490: 4e 54 5f 52 45 53 54 41 52 54 3b 0a 20 20 20 20  NT_RESTART;.    
f4a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
f4b0: 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68  te3StrICmp(zRigh
f4c0: 74 2c 20 22 74 72 75 6e 63 61 74 65 22 29 3d 3d  t, "truncate")==
f4d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
f4e0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
f4f0: 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 3b  KPOINT_TRUNCATE;
f500: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f510: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
f520: 3d 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 3;.    sqlite3
f530: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f540: 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 42 74  _Checkpoint, iBt
f550: 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a 20 20 20  , eMode, 1);.   
f560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f570: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
f580: 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 7d 0a 20  ow, 1, 3);.  }. 
f590: 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a 0a 20 20   break;..  /*.  
f5a0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  **   PRAGMA wal_
f5b0: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 0a 20  autocheckpoint. 
f5c0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c   **   PRAGMA wal
f5d0: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20  _autocheckpoint 
f5e0: 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  = N.  **.  ** Co
f5f0: 6e 66 69 67 75 72 65 20 61 20 64 61 74 61 62 61  nfigure a databa
f600: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
f610: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
f620: 68 65 63 6b 70 6f 69 6e 74 20 61 20 64 61 74 61  heckpoint a data
f630: 62 61 73 65 0a 20 20 2a 2a 20 61 66 74 65 72 20  base.  ** after 
f640: 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 4e 20 66  accumulating N f
f650: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
f660: 2e 20 4f 72 20 71 75 65 72 79 20 66 6f 72 20 74  . Or query for t
f670: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
f680: 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20 20 2a 2f  .  ** of N..  */
f690: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
f6a0: 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49  WAL_AUTOCHECKPOI
f6b0: 4e 54 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  NT: {.    if( zR
f6c0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
f6d0: 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
f6e0: 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 73 71 6c  eckpoint(db, sql
f6f0: 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29  ite3Atoi(zRight)
f700: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
f710: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
f720: 0a 20 20 20 20 20 20 20 64 62 2d 3e 78 57 61 6c  .       db->xWal
f730: 43 61 6c 6c 62 61 63 6b 3d 3d 73 71 6c 69 74 65  Callback==sqlite
f740: 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 20  3WalDefaultHook 
f750: 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 53 51  ? .           SQ
f760: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
f770: 64 62 2d 3e 70 57 61 6c 41 72 67 29 20 3a 20 30  db->pWalArg) : 0
f780: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
f790: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
f7a0: 2a 20 20 50 52 41 47 4d 41 20 73 68 72 69 6e 6b  *  PRAGMA shrink
f7b0: 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a 0a 20 20 2a  _memory.  **.  *
f7c0: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
f7d0: 2d 4f 46 3a 20 52 2d 32 33 34 34 35 2d 34 36 31  -OF: R-23445-461
f7e0: 30 39 20 54 68 69 73 20 70 72 61 67 6d 61 20 63  09 This pragma c
f7f0: 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
f800: 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69  se.  ** connecti
f810: 6f 6e 20 6f 6e 20 77 68 69 63 68 20 69 74 20 69  on on which it i
f820: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 66 72 65  s invoked to fre
f830: 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d  e up as much mem
f840: 6f 72 79 20 61 73 20 69 74 0a 20 20 2a 2a 20 63  ory as it.  ** c
f850: 61 6e 2c 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  an, by calling s
f860: 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73  qlite3_db_releas
f870: 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 20 20 2a 2f  e_memory()..  */
f880: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
f890: 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52 59 3a 20 7b  SHRINK_MEMORY: {
f8a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
f8b0: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64  release_memory(d
f8c0: 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  b);.    break;. 
f8d0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
f8e0: 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a 65 0a 20  RAGMA optimize. 
f8f0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70 74 69   **  PRAGMA opti
f900: 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20 2a 2a 20  mize(MASK).  ** 
f910: 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61 2e 6f   PRAGMA schema.o
f920: 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20 20 50 52  ptimize.  **  PR
f930: 41 47 4d 41 20 73 63 68 65 6d 61 2e 6f 70 74 69  AGMA schema.opti
f940: 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20 2a 2a 0a  mize(MASK).  **.
f950: 20 20 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    ** Attempt to 
f960: 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 64 61 74  optimize the dat
f970: 61 62 61 73 65 2e 20 20 41 6c 6c 20 73 63 68 65  abase.  All sche
f980: 6d 61 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  mas are optimize
f990: 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 0a 20  d in the first. 
f9a0: 20 2a 2a 20 74 77 6f 20 66 6f 72 6d 73 2c 20 61   ** two forms, a
f9b0: 6e 64 20 6f 6e 6c 79 20 74 68 65 20 73 70 65 63  nd only the spec
f9c0: 69 66 69 65 64 20 73 63 68 65 6d 61 20 69 73 20  ified schema is 
f9d0: 6f 70 74 69 6d 69 7a 65 64 20 69 6e 20 74 68 65  optimized in the
f9e0: 20 6c 61 74 74 65 72 20 74 77 6f 2e 0a 20 20 2a   latter two..  *
f9f0: 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 74 61 69  *.  ** The detai
fa00: 6c 73 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69  ls of optimizati
fa10: 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79  ons performed by
fa20: 20 74 68 69 73 20 70 72 61 67 6d 61 20 61 72 65   this pragma are
fa30: 20 65 78 70 65 63 74 65 64 0a 20 20 2a 2a 20 74   expected.  ** t
fa40: 6f 20 63 68 61 6e 67 65 20 61 6e 64 20 69 6d 70  o change and imp
fa50: 72 6f 76 65 20 6f 76 65 72 20 74 69 6d 65 2e 20  rove over time. 
fa60: 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 73 68   Applications sh
fa70: 6f 75 6c 64 20 61 6e 74 69 63 69 70 61 74 65 20  ould anticipate 
fa80: 74 68 61 74 0a 20 20 2a 2a 20 74 68 69 73 20 70  that.  ** this p
fa90: 72 61 67 6d 61 20 77 69 6c 6c 20 70 65 72 66 6f  ragma will perfo
faa0: 72 6d 20 6e 65 77 20 6f 70 74 69 6d 69 7a 61 74  rm new optimizat
fab0: 69 6f 6e 73 20 69 6e 20 66 75 74 75 72 65 20 72  ions in future r
fac0: 65 6c 65 61 73 65 73 2e 0a 20 20 2a 2a 0a 20 20  eleases..  **.  
fad0: 2a 2a 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 20  ** The optional 
fae0: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 62 69  argument is a bi
faf0: 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a  tmask of optimiz
fb00: 61 74 69 6f 6e 73 20 74 6f 20 70 65 72 66 6f 72  ations to perfor
fb10: 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
fb20: 30 78 30 30 30 31 20 20 20 20 44 65 62 75 67 67  0x0001    Debugg
fb30: 69 6e 67 20 6d 6f 64 65 2e 20 20 44 6f 20 6e 6f  ing mode.  Do no
fb40: 74 20 61 63 74 75 61 6c 6c 79 20 70 65 72 66 6f  t actually perfo
fb50: 72 6d 20 61 6e 79 20 6f 70 74 69 6d 69 7a 61 74  rm any optimizat
fb60: 69 6f 6e 73 0a 20 20 2a 2a 20 20 20 20 20 20 20  ions.  **       
fb70: 20 20 20 20 20 20 20 62 75 74 20 69 6e 73 74 65         but inste
fb80: 61 64 20 72 65 74 75 72 6e 20 6f 6e 65 20 6c 69  ad return one li
fb90: 6e 65 20 6f 66 20 74 65 78 74 20 66 6f 72 20 65  ne of text for e
fba0: 61 63 68 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ach optimization
fbb0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
fbc0: 20 20 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61     that would ha
fbd0: 76 65 20 62 65 65 6e 20 64 6f 6e 65 2e 20 20 4f  ve been done.  O
fbe0: 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 20  ff by default.. 
fbf0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30   **.  **    0x00
fc00: 30 32 20 20 20 20 52 75 6e 20 41 4e 41 4c 59 5a  02    Run ANALYZ
fc10: 45 20 6f 6e 20 74 61 62 6c 65 73 20 74 68 61 74  E on tables that
fc20: 20 6d 69 67 68 74 20 62 65 6e 65 66 69 74 2e 20   might benefit. 
fc30: 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 2e 0a   On by default..
fc40: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
fc50: 20 20 53 65 65 20 62 65 6c 6f 77 20 66 6f 72 20    See below for 
fc60: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
fc70: 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  mation..  **.  *
fc80: 2a 20 20 20 20 30 78 30 30 30 34 20 20 20 20 28  *    0x0004    (
fc90: 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d 65 6e  Not yet implemen
fca0: 74 65 64 29 20 52 65 63 6f 72 64 20 75 73 61 67  ted) Record usag
fcb0: 65 20 61 6e 64 20 70 65 72 66 6f 72 6d 61 6e 63  e and performanc
fcc0: 65 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  e .  **         
fcd0: 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e       information
fce0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
fcf0: 74 20 73 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  t session in the
fd00: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
fd10: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
fd20: 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
fd30: 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   be available to
fd40: 20 22 6f 70 74 69 6d 69 7a 65 22 0a 20 20 2a 2a   "optimize".  **
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
fd60: 61 67 6d 61 73 20 72 75 6e 20 62 79 20 66 75 74  agmas run by fut
fd70: 75 72 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ure database con
fd80: 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20  nections..  **. 
fd90: 20 2a 2a 20 20 20 20 30 78 30 30 30 38 20 20 20   **    0x0008   
fda0: 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d   (Not yet implem
fdb0: 65 6e 74 65 64 29 20 43 72 65 61 74 65 20 69 6e  ented) Create in
fdc0: 64 65 78 65 73 20 74 68 61 74 20 6d 69 67 68 74  dexes that might
fdd0: 20 68 61 76 65 0a 20 20 2a 2a 20 20 20 20 20 20   have.  **      
fde0: 20 20 20 20 20 20 20 20 62 65 65 6e 20 68 65 6c          been hel
fdf0: 70 66 75 6c 20 74 6f 20 72 65 63 65 6e 74 20 71  pful to recent q
fe00: 75 65 72 69 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a  ueries.  **.  **
fe10: 20 54 68 65 20 64 65 66 61 75 6c 74 20 4d 41 53   The default MAS
fe20: 4b 20 69 73 20 61 6e 64 20 61 6c 77 61 79 73 20  K is and always 
fe30: 73 68 61 6c 6c 20 62 65 20 30 78 66 66 66 65 2e  shall be 0xfffe.
fe40: 20 20 30 78 66 66 66 65 20 6d 65 61 6e 73 20 70    0xfffe means p
fe50: 65 72 66 6f 72 6d 20 61 6c 6c 20 20 20 20 2a 2a  erform all    **
fe60: 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   of the optimiza
fe70: 74 69 6f 6e 73 20 6c 69 73 74 65 64 20 61 62 6f  tions listed abo
fe80: 76 65 20 65 78 63 65 70 74 20 44 65 62 75 67 20  ve except Debug 
fe90: 4d 6f 64 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  Mode, including 
fea0: 6e 65 77 0a 20 20 2a 2a 20 6f 70 74 69 6d 69 7a  new.  ** optimiz
feb0: 61 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ations that have
fec0: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e   not yet been in
fed0: 76 65 6e 74 65 64 2e 20 20 49 66 20 6e 65 77 20  vented.  If new 
fee0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61 72  optimizations ar
fef0: 65 0a 20 20 2a 2a 20 65 76 65 72 20 61 64 64 65  e.  ** ever adde
ff00: 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  d that should be
ff10: 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2c   off by default,
ff20: 20 74 68 6f 73 65 20 6f 66 66 2d 62 79 2d 64 65   those off-by-de
ff30: 66 61 75 6c 74 20 0a 20 20 2a 2a 20 6f 70 74 69  fault .  ** opti
ff40: 6d 69 7a 61 74 69 6f 6e 73 20 77 69 6c 6c 20 68  mizations will h
ff50: 61 76 65 20 62 69 74 6d 61 73 6b 73 20 6f 66 20  ave bitmasks of 
ff60: 30 78 31 30 30 30 30 20 6f 72 20 6c 61 72 67 65  0x10000 or large
ff70: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 45 54  r..  **.  ** DET
ff80: 45 52 4d 49 4e 41 54 49 4f 4e 20 4f 46 20 57 48  ERMINATION OF WH
ff90: 45 4e 20 54 4f 20 52 55 4e 20 41 4e 41 4c 59 5a  EN TO RUN ANALYZ
ffa0: 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74  E.  **.  ** In t
ffb0: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
ffc0: 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20 74 61 62  mentation, a tab
ffd0: 6c 65 20 69 73 20 61 6e 61 6c 79 7a 65 64 20 69  le is analyzed i
ffe0: 66 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 6f 66  f only if all of
fff0: 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
10000 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
10010 2a 2a 0a 20 20 2a 2a 20 28 31 29 20 4d 41 53 4b  **.  ** (1) MASK
10020 20 62 69 74 20 30 78 30 32 20 69 73 20 73 65 74   bit 0x02 is set
10030 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 32 29 20  ..  **.  ** (2) 
10040 54 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  The query planne
10050 72 20 75 73 65 64 20 73 71 6c 69 74 65 5f 73 74  r used sqlite_st
10060 61 74 31 2d 73 74 79 6c 65 20 73 74 61 74 69 73  at1-style statis
10070 74 69 63 73 20 66 6f 72 20 6f 6e 65 20 6f 72 0a  tics for one or.
10080 20 20 2a 2a 20 20 20 20 20 6d 6f 72 65 20 69 6e    **     more in
10090 64 65 78 65 73 20 6f 66 20 74 68 65 20 74 61 62  dexes of the tab
100a0 6c 65 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  le at some point
100b0 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65   during the life
100c0 74 69 6d 65 20 6f 66 0a 20 20 2a 2a 20 20 20 20  time of.  **    
100d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
100e0 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20  nection..  **.  
100f0 2a 2a 20 28 33 29 20 4f 6e 65 20 6f 72 20 6d 6f  ** (3) One or mo
10100 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 68  re indexes of th
10110 65 20 74 61 62 6c 65 20 61 72 65 20 63 75 72 72  e table are curr
10120 65 6e 74 6c 79 20 75 6e 61 6e 61 6c 79 7a 65 64  ently unanalyzed
10130 20 4f 52 0a 20 20 2a 2a 20 20 20 20 20 74 68 65   OR.  **     the
10140 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
10150 69 6e 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  in the table has
10160 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 32 35   increased by 25
10170 20 74 69 6d 65 73 20 6f 72 20 6d 6f 72 65 0a 20   times or more. 
10180 20 2a 2a 20 20 20 20 20 73 69 6e 63 65 20 74 68   **     since th
10190 65 20 6c 61 73 74 20 74 69 6d 65 20 41 4e 41 4c  e last time ANAL
101a0 59 5a 45 20 77 61 73 20 72 75 6e 2e 0a 20 20 2a  YZE was run..  *
101b0 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 73  *.  ** The rules
101c0 20 66 6f 72 20 77 68 65 6e 20 74 61 62 6c 65 73   for when tables
101d0 20 61 72 65 20 61 6e 61 6c 79 7a 65 64 20 61 72   are analyzed ar
101e0 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 68 61 6e  e likely to chan
101f0 67 65 20 69 6e 0a 20 20 2a 2a 20 66 75 74 75 72  ge in.  ** futur
10200 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a 2f  e releases..  */
10210 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
10220 4f 50 54 49 4d 49 5a 45 3a 20 7b 0a 20 20 20 20  OPTIMIZE: {.    
10230 69 6e 74 20 69 44 62 4c 61 73 74 3b 20 20 20 20  int iDbLast;    
10240 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
10250 65 72 6d 69 6e 61 74 69 6f 6e 20 70 6f 69 6e 74  ermination point
10260 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20   for the schema 
10270 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20  loop */.    int 
10280 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20 20  iTabCur;        
10290 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72     /* Cursor for
102a0 20 61 20 74 61 62 6c 65 20 77 68 6f 73 65 20 73   a table whose s
102b0 69 7a 65 20 6e 65 65 64 73 20 63 68 65 63 6b 69  ize needs checki
102c0 6e 67 20 2a 2f 0a 20 20 20 20 48 61 73 68 45 6c  ng */.    HashEl
102d0 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
102e0 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 61   /* Loop over ta
102f0 62 6c 65 73 20 6f 66 20 61 20 73 63 68 65 6d 61  bles of a schema
10300 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a   */.    Schema *
10310 70 53 63 68 65 6d 61 3b 20 20 20 20 20 20 20 2f  pSchema;       /
10320 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 73 63  * The current sc
10330 68 65 6d 61 20 2a 2f 0a 20 20 20 20 54 61 62 6c  hema */.    Tabl
10340 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
10350 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
10360 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20   the schema */. 
10370 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
10380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
10390 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  index of the tab
103a0 6c 65 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74  le */.    LogEst
103b0 20 73 7a 54 68 72 65 73 68 6f 6c 64 3b 20 20 20   szThreshold;   
103c0 20 2f 2a 20 53 69 7a 65 20 74 68 72 65 73 68 6f   /* Size thresho
103d0 6c 64 20 61 62 6f 76 65 20 77 68 69 63 68 20 72  ld above which r
103e0 65 61 6e 61 6c 79 73 69 73 20 69 73 20 6e 65 65  eanalysis is nee
103f0 64 64 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  dd */.    char *
10400 7a 53 75 62 53 71 6c 3b 20 20 20 20 20 20 20 20  zSubSql;        
10410 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   /* SQL statemen
10420 74 20 66 6f 72 20 74 68 65 20 4f 50 5f 53 71 6c  t for the OP_Sql
10430 45 78 65 63 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  Exec opcode */. 
10440 20 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20 20     u32 opMask;  
10450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
10460 6b 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20  k of operations 
10470 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 0a 20  to perform */.. 
10480 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
10490 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  .      opMask = 
104a0 28 75 33 32 29 73 71 6c 69 74 65 33 41 74 6f 69  (u32)sqlite3Atoi
104b0 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
104c0 69 66 28 20 28 6f 70 4d 61 73 6b 20 26 20 30 78  if( (opMask & 0x
104d0 30 32 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  02)==0 ) break;.
104e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
104f0 20 6f 70 4d 61 73 6b 20 3d 20 30 78 66 66 66 65   opMask = 0xfffe
10500 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62  ;.    }.    iTab
10510 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
10520 61 62 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 69 44  ab++;.    for(iD
10530 62 4c 61 73 74 20 3d 20 7a 44 62 3f 69 44 62 3a  bLast = zDb?iDb:
10540 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3c 3d  db->nDb-1; iDb<=
10550 69 44 62 4c 61 73 74 3b 20 69 44 62 2b 2b 29 7b  iDbLast; iDb++){
10560 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d  .      if( iDb==
10570 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  1 ) continue;.  
10580 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
10590 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
105a0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
105b0 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
105c0 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
105d0 20 20 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69        for(k=sqli
105e0 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
105f0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
10600 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
10610 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 20  ext(k)){.       
10620 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29   pTab = (Table*)
10630 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b  sqliteHashData(k
10640 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  );..        /* I
10650 66 20 74 61 62 6c 65 20 70 54 61 62 20 68 61 73  f table pTab has
10660 20 6e 6f 74 20 62 65 65 6e 20 75 73 65 64 20 69   not been used i
10670 6e 20 61 20 77 61 79 20 74 68 61 74 20 77 6f 75  n a way that wou
10680 6c 64 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 0a  ld benefit from.
10690 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 69 6e          ** havin
106a0 67 20 61 6e 61 6c 79 73 69 73 20 73 74 61 74 69  g analysis stati
106b0 73 74 69 63 73 20 64 75 72 69 6e 67 20 74 68 65  stics during the
106c0 20 63 75 72 72 65 6e 74 20 73 65 73 73 69 6f 6e   current session
106d0 2c 20 74 68 65 6e 20 73 6b 69 70 20 69 74 2e 0a  , then skip it..
106e0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
106f0 61 6c 73 6f 20 68 61 73 20 74 68 65 20 65 66 66  also has the eff
10700 65 63 74 20 6f 66 20 73 6b 69 70 70 69 6e 67 20  ect of skipping 
10710 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 61  virtual tables a
10720 6e 64 20 76 69 65 77 73 20 2a 2f 0a 20 20 20 20  nd views */.    
10730 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
10740 61 62 46 6c 61 67 73 20 26 20 54 46 5f 53 74 61  abFlags & TF_Sta
10750 74 73 55 73 65 64 29 3d 3d 30 20 29 20 63 6f 6e  tsUsed)==0 ) con
10760 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20 20  tinue;..        
10770 2f 2a 20 52 65 61 6e 61 6c 79 7a 65 20 69 66 20  /* Reanalyze if 
10780 74 68 65 20 74 61 62 6c 65 20 69 73 20 32 35 20  the table is 25 
10790 74 69 6d 65 73 20 6c 61 72 67 65 72 20 74 68 61  times larger tha
107a0 6e 20 74 68 65 20 6c 61 73 74 20 61 6e 61 6c 79  n the last analy
107b0 73 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  sis */.        s
107c0 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 70 54 61  zThreshold = pTa
107d0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 2b 20  b->nRowLogEst + 
107e0 34 36 3b 20 61 73 73 65 72 74 28 20 73 71 6c 69  46; assert( sqli
107f0 74 65 33 4c 6f 67 45 73 74 28 32 35 29 3d 3d 34  te3LogEst(25)==4
10800 36 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  6 );.        for
10810 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
10820 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
10830 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
10840 20 20 20 20 20 20 20 69 66 28 20 21 70 49 64 78         if( !pIdx
10850 2d 3e 68 61 73 53 74 61 74 31 20 29 7b 0a 20 20  ->hasStat1 ){.  
10860 20 20 20 20 20 20 20 20 20 20 73 7a 54 68 72 65            szThre
10870 73 68 6f 6c 64 20 3d 20 30 3b 20 2f 2a 20 41 6c  shold = 0; /* Al
10880 77 61 79 73 20 61 6e 61 6c 79 7a 65 20 69 66 20  ways analyze if 
10890 61 6e 79 20 69 6e 64 65 78 20 6c 61 63 6b 73 20  any index lacks 
108a0 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20  statistics */.  
108b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
108c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
108d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
108e0 66 28 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 29  f( szThreshold )
108f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10900 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
10910 72 73 65 2c 20 69 54 61 62 43 75 72 2c 20 69 44  rse, iTabCur, iD
10920 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
10930 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  Read);.         
10940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10950 70 33 28 76 2c 20 4f 50 5f 49 66 53 6d 61 6c 6c  p3(v, OP_IfSmall
10960 65 72 2c 20 69 54 61 62 43 75 72 2c 20 0a 20 20  er, iTabCur, .  
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10990 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
109a0 2b 32 2b 28 6f 70 4d 61 73 6b 26 31 29 2c 20 73  +2+(opMask&1), s
109b0 7a 54 68 72 65 73 68 6f 6c 64 29 3b 0a 20 20 20  zThreshold);.   
109c0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
109d0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
109e0 7d 0a 20 20 20 20 20 20 20 20 7a 53 75 62 53 71  }.        zSubSq
109f0 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  l = sqlite3MPrin
10a00 74 66 28 64 62 2c 20 22 41 4e 41 4c 59 5a 45 20  tf(db, "ANALYZE 
10a10 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22 22 2c 0a  \"%w\".\"%w\"",.
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a40 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
10a50 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  bSName, pTab->zN
10a60 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
10a70 28 20 6f 70 4d 61 73 6b 20 26 20 30 78 30 31 20  ( opMask & 0x01 
10a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
10a90 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
10aa0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
10ab0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10ac0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
10ad0 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72  OP_String8, 0, r
10ae0 31 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20 50  1, 0, zSubSql, P
10af0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
10b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10b10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
10b20 73 75 6c 74 52 6f 77 2c 20 72 31 2c 20 31 29 3b  sultRow, r1, 1);
10b30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
10b40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10b50 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
10b60 50 5f 53 71 6c 45 78 65 63 2c 20 30 2c 20 30 2c  P_SqlExec, 0, 0,
10b70 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20 50 34 5f   0, zSubSql, P4_
10b80 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
10b90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10ba0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
10bb0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78  eAddOp0(v, OP_Ex
10bc0 70 69 72 65 29 3b 0a 20 20 20 20 62 72 65 61 6b  pire);.    break
10bd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
10be0 20 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f 74     PRAGMA busy_t
10bf0 69 6d 65 6f 75 74 0a 20 20 2a 2a 20 20 20 50 52  imeout.  **   PR
10c00 41 47 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f 75  AGMA busy_timeou
10c10 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t = N.  **.  ** 
10c20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 62 75 73  Call sqlite3_bus
10c30 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 4e 29  y_timeout(db, N)
10c40 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  .  Return the cu
10c50 72 72 65 6e 74 20 74 69 6d 65 6f 75 74 20 76 61  rrent timeout va
10c60 6c 75 65 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20  lue.  ** if one 
10c70 69 73 20 73 65 74 2e 20 20 49 66 20 6e 6f 20 62  is set.  If no b
10c80 75 73 79 20 68 61 6e 64 6c 65 72 20 6f 72 20 61  usy handler or a
10c90 20 64 69 66 66 65 72 65 6e 74 20 62 75 73 79 20   different busy 
10ca0 68 61 6e 64 6c 65 72 20 69 73 20 73 65 74 0a 20  handler is set. 
10cb0 20 2a 2a 20 74 68 65 6e 20 30 20 69 73 20 72 65   ** then 0 is re
10cc0 74 75 72 6e 65 64 2e 20 20 53 65 74 74 69 6e 67  turned.  Setting
10cd0 20 74 68 65 20 62 75 73 79 5f 74 69 6d 65 6f 75   the busy_timeou
10ce0 74 20 74 6f 20 30 20 6f 72 20 6e 65 67 61 74 69  t to 0 or negati
10cf0 76 65 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 73  ve.  ** disables
10d00 20 74 68 65 20 74 69 6d 65 6f 75 74 2e 0a 20 20   the timeout..  
10d10 2a 2f 0a 20 20 2f 2a 63 61 73 65 20 50 72 61 67  */.  /*case Prag
10d20 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55 54  Typ_BUSY_TIMEOUT
10d30 2a 2f 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20  */ default: {.  
10d40 20 20 61 73 73 65 72 74 28 20 70 50 72 61 67 6d    assert( pPragm
10d50 61 2d 3e 65 50 72 61 67 54 79 70 3d 3d 50 72 61  a->ePragTyp==Pra
10d60 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55  gTyp_BUSY_TIMEOU
10d70 54 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69  T );.    if( zRi
10d80 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ght ){.      sql
10d90 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
10da0 74 28 64 62 2c 20 73 71 6c 69 74 65 33 41 74 6f  t(db, sqlite3Ato
10db0 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20  i(zRight));.    
10dc0 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
10dd0 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 62 75 73  leInt(v, db->bus
10de0 79 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20 62  yTimeout);.    b
10df0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
10e00 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f    **   PRAGMA so
10e10 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 0a 20 20  ft_heap_limit.  
10e20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f 66 74  **   PRAGMA soft
10e30 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3d 20 4e 0a  _heap_limit = N.
10e40 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
10e50 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32  ENTATION-OF: R-2
10e60 36 33 34 33 2d 34 35 39 33 30 20 54 68 69 73 20  6343-45930 This 
10e70 70 72 61 67 6d 61 20 69 6e 76 6f 6b 65 73 20 74  pragma invokes t
10e80 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  he.  ** sqlite3_
10e90 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
10ea0 34 28 29 20 69 6e 74 65 72 66 61 63 65 20 77 69  4() interface wi
10eb0 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  th the argument 
10ec0 4e 2c 20 69 66 20 4e 20 69 73 0a 20 20 2a 2a 20  N, if N is.  ** 
10ed0 73 70 65 63 69 66 69 65 64 20 61 6e 64 20 69 73  specified and is
10ee0 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
10ef0 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 20 49 4d  integer..  ** IM
10f00 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
10f10 20 52 2d 36 34 34 35 31 2d 30 37 31 36 33 20 54   R-64451-07163 T
10f20 68 65 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  he soft_heap_lim
10f30 69 74 20 70 72 61 67 6d 61 20 61 6c 77 61 79 73  it pragma always
10f40 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68  .  ** returns th
10f50 65 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20 74  e same integer t
10f60 68 61 74 20 77 6f 75 6c 64 20 62 65 20 72 65 74  hat would be ret
10f70 75 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20 2a  urned by the.  *
10f80 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68  * sqlite3_soft_h
10f90 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29 20  eap_limit64(-1) 
10fa0 43 2d 6c 61 6e 67 75 61 67 65 20 66 75 6e 63 74  C-language funct
10fb0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
10fc0 20 50 72 61 67 54 79 70 5f 53 4f 46 54 5f 48 45   PragTyp_SOFT_HE
10fd0 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20  AP_LIMIT: {.    
10fe0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b  sqlite3_int64 N;
10ff0 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
11000 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48  && sqlite3DecOrH
11010 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20  exToI64(zRight, 
11020 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  &N)==SQLITE_OK )
11030 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11040 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
11050 34 28 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  4(N);.    }.    
11060 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
11070 76 2c 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  v, sqlite3_soft_
11080 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29  heap_limit64(-1)
11090 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
110a0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  }..  /*.  **   P
110b0 52 41 47 4d 41 20 74 68 72 65 61 64 73 0a 20 20  RAGMA threads.  
110c0 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72 65  **   PRAGMA thre
110d0 61 64 73 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a  ads = N.  **.  *
110e0 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * Configure the 
110f0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
11100 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73  f worker threads
11110 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
11120 77 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 2c 20  w.  ** maximum, 
11130 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c  which might be l
11140 65 73 73 20 74 68 61 6e 20 72 65 71 75 65 73 74  ess than request
11150 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
11160 50 72 61 67 54 79 70 5f 54 48 52 45 41 44 53 3a  PragTyp_THREADS:
11170 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69   {.    sqlite3_i
11180 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20  nt64 N;.    if( 
11190 7a 52 69 67 68 74 0a 20 20 20 20 20 26 26 20 73  zRight.     && s
111a0 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
111b0 49 36 34 28 7a 52 69 67 68 74 2c 20 26 4e 29 3d  I64(zRight, &N)=
111c0 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
111d0 26 26 20 4e 3e 3d 30 0a 20 20 20 20 29 7b 0a 20  && N>=0.    ){. 
111e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d       sqlite3_lim
111f0 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c 49  it(db, SQLITE_LI
11200 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
11210 44 53 2c 20 28 69 6e 74 29 28 4e 26 30 78 37 66  DS, (int)(N&0x7f
11220 66 66 66 66 66 66 29 29 3b 0a 20 20 20 20 7d 0a  ffffff));.    }.
11230 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
11240 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 6c  Int(v, sqlite3_l
11250 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  imit(db, SQLITE_
11260 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
11270 45 41 44 53 2c 20 2d 31 29 29 3b 0a 20 20 20 20  EADS, -1));.    
11280 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66 20  break;.  }..#if 
11290 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
112a0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
112b0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
112c0 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f 72 74 20 74  /*.  ** Report t
112d0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
112e0 20 6f 66 20 66 69 6c 65 20 6c 6f 67 73 20 66 6f   of file logs fo
112f0 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 0a  r all databases.
11300 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
11310 54 79 70 5f 4c 4f 43 4b 5f 53 54 41 54 55 53 3a  Typ_LOCK_STATUS:
11320 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
11330 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20  nst char *const 
11340 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20 3d 20 7b  azLockName[] = {
11350 0a 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 65 64  .      "unlocked
11360 22 2c 20 22 73 68 61 72 65 64 22 2c 20 22 72 65  ", "shared", "re
11370 73 65 72 76 65 64 22 2c 20 22 70 65 6e 64 69 6e  served", "pendin
11380 67 22 2c 20 22 65 78 63 6c 75 73 69 76 65 22 0a  g", "exclusive".
11390 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69      };.    int i
113a0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
113b0 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28  em = 2;.    for(
113c0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
113d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
113e0 65 20 2a 70 42 74 3b 0a 20 20 20 20 20 20 63 6f  e *pBt;.      co
113f0 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65  nst char *zState
11400 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20   = "unknown";.  
11410 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
11420 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
11430 7a 44 62 53 4e 61 6d 65 3d 3d 30 20 29 20 63 6f  zDbSName==0 ) co
11440 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 42  ntinue;.      pB
11450 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
11460 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
11470 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42  t==0 || sqlite3B
11480 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3d 3d  treePager(pBt)==
11490 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 74  0 ){.        zSt
114a0 61 74 65 20 3d 20 22 63 6c 6f 73 65 64 22 3b 0a  ate = "closed";.
114b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
114c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
114d0 74 72 6f 6c 28 64 62 2c 20 69 20 3f 20 64 62 2d  trol(db, i ? db-
114e0 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
114f0 20 3a 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20   : 0, .         
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11510 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
11520 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
11530 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49 54 45 5f  TE, &j)==SQLITE_
11540 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 7a  OK ){.         z
11550 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63 6b 4e 61  State = azLockNa
11560 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  me[j];.      }. 
11570 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11580 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
11590 22 73 73 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d  "ss", db->aDb[i]
115a0 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 53 74 61 74  .zDbSName, zStat
115b0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
115c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
115d0 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
115e0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  2);.    }.    br
115f0 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  eak;.  }.#endif.
11600 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
11610 41 53 5f 43 4f 44 45 43 0a 20 20 63 61 73 65 20  AS_CODEC.  case 
11620 50 72 61 67 54 79 70 5f 4b 45 59 3a 20 7b 0a 20  PragTyp_KEY: {. 
11630 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 20     if( zRight ) 
11640 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64  sqlite3_key_v2(d
11650 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c 20  b, zDb, zRight, 
11660 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11670 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 62 72  zRight));.    br
11680 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65 20  eak;.  }.  case 
11690 50 72 61 67 54 79 70 5f 52 45 4b 45 59 3a 20 7b  PragTyp_REKEY: {
116a0 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
116b0 29 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f  ) sqlite3_rekey_
116c0 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67  v2(db, zDb, zRig
116d0 68 74 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ht, sqlite3Strle
116e0 6e 33 30 28 7a 52 69 67 68 74 29 29 3b 0a 20 20  n30(zRight));.  
116f0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63    break;.  }.  c
11700 61 73 65 20 50 72 61 67 54 79 70 5f 48 45 58 4b  ase PragTyp_HEXK
11710 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  EY: {.    if( zR
11720 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 75 38  ight ){.      u8
11730 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e   iByte;.      in
11740 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20  t i;.      char 
11750 7a 4b 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20  zKey[40];.      
11760 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30  for(i=0, iByte=0
11770 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29  ; i<sizeof(zKey)
11780 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49 73 78  *2 && sqlite3Isx
11790 64 69 67 69 74 28 7a 52 69 67 68 74 5b 69 5d 29  digit(zRight[i])
117a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
117b0 69 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c  iByte = (iByte<<
117c0 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54  4) + sqlite3HexT
117d0 6f 49 6e 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b  oInt(zRight[i]);
117e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69 26  .        if( (i&
117f0 31 29 21 3d 30 20 29 20 7a 4b 65 79 5b 69 2f 32  1)!=0 ) zKey[i/2
11800 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20  ] = iByte;.     
11810 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 7a 4c   }.      if( (zL
11820 65 66 74 5b 33 5d 20 26 20 30 78 66 29 3d 3d 30  eft[3] & 0xf)==0
11830 78 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  xb ){.        sq
11840 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c  lite3_key_v2(db,
11850 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29   zDb, zKey, i/2)
11860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
11880 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  ekey_v2(db, zDb,
11890 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20   zKey, i/2);.   
118a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
118b0 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
118c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
118d0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c  ITE_HAS_CODEC) |
118e0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
118f0 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 29 0a 20  _ENABLE_CEROD). 
11900 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41 43   case PragTyp_AC
11910 54 49 56 41 54 45 5f 45 58 54 45 4e 53 49 4f 4e  TIVATE_EXTENSION
11920 53 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b  S: if( zRight ){
11930 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
11940 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28  AS_CODEC.    if(
11950 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
11960 28 7a 52 69 67 68 74 2c 20 22 73 65 65 2d 22 2c  (zRight, "see-",
11970 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)==0 ){.      
11980 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65  sqlite3_activate
11990 5f 73 65 65 28 26 7a 52 69 67 68 74 5b 34 5d 29  _see(&zRight[4])
119a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
119b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
119c0 42 4c 45 5f 43 45 52 4f 44 0a 20 20 20 20 69 66  BLE_CEROD.    if
119d0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
119e0 70 28 7a 52 69 67 68 74 2c 20 22 63 65 72 6f 64  p(zRight, "cerod
119f0 2d 22 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20  -", 6)==0 ){.   
11a00 20 20 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76     sqlite3_activ
11a10 61 74 65 5f 63 65 72 6f 64 28 26 7a 52 69 67 68  ate_cerod(&zRigh
11a20 74 5b 36 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  t[6]);.    }.#en
11a30 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  dif.  }.  break;
11a40 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a 20  .#endif..  } /* 
11a50 45 6e 64 20 6f 66 20 74 68 65 20 50 52 41 47 4d  End of the PRAGM
11a60 41 20 73 77 69 74 63 68 20 2a 2f 0a 0a 20 20 2f  A switch */..  /
11a70 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
11a80 62 6c 6f 63 6b 20 69 73 20 61 20 6e 6f 2d 6f 70  block is a no-op
11a90 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44   unless SQLITE_D
11aa0 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
11ab0 20 49 74 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70   Its only.  ** p
11ac0 75 72 70 6f 73 65 20 69 73 20 74 6f 20 65 78 65  urpose is to exe
11ad0 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
11ae0 61 74 65 6d 65 6e 74 73 20 74 6f 20 76 65 72 69  atements to veri
11af0 66 79 20 74 68 61 74 20 69 66 20 74 68 65 0a 20  fy that if the. 
11b00 20 2a 2a 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f   ** PragFlg_NoCo
11b10 6c 75 6d 6e 73 31 20 66 6c 61 67 20 69 73 20 73  lumns1 flag is s
11b20 65 74 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65  et and the calle
11b30 72 20 73 70 65 63 69 66 69 65 64 20 61 6e 20 61  r specified an a
11b40 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20  rgument.  ** to 
11b50 74 68 65 20 50 52 41 47 4d 41 2c 20 74 68 65 20  the PRAGMA, the 
11b60 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 68  implementation h
11b70 61 73 20 6e 6f 74 20 61 64 64 65 64 20 61 6e 79  as not added any
11b80 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 0a 20   OP_ResultRow . 
11b90 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
11ba0 20 74 6f 20 74 68 65 20 56 4d 2e 20 20 2a 2f 0a   to the VM.  */.
11bb0 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e    if( (pPragma->
11bc0 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
11bd0 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 20 26  lg_NoColumns1) &
11be0 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  & zRight ){.    
11bf0 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
11c00 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28 76 29 3b  yNoResultRow(v);
11c10 0a 20 20 7d 0a 0a 70 72 61 67 6d 61 5f 6f 75 74  .  }..pragma_out
11c20 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
11c30 65 28 64 62 2c 20 7a 4c 65 66 74 29 3b 0a 20 20  e(db, zLeft);.  
11c40 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11c50 2c 20 7a 52 69 67 68 74 29 3b 0a 7d 0a 23 69 66  , zRight);.}.#if
11c60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11c70 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
11c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
11cd0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
11ce0 66 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76  f an eponymous v
11cf0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61  irtual table tha
11d00 74 20 72 75 6e 73 20 61 20 70 72 61 67 6d 61 2e  t runs a pragma.
11d10 0a 2a 2a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  .**.*/.typedef s
11d20 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62  truct PragmaVtab
11d30 20 50 72 61 67 6d 61 56 74 61 62 3b 0a 74 79 70   PragmaVtab;.typ
11d40 65 64 65 66 20 73 74 72 75 63 74 20 50 72 61 67  edef struct Prag
11d50 6d 61 56 74 61 62 43 75 72 73 6f 72 20 50 72 61  maVtabCursor Pra
11d60 67 6d 61 56 74 61 62 43 75 72 73 6f 72 3b 0a 73  gmaVtabCursor;.s
11d70 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62  truct PragmaVtab
11d80 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
11d90 62 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 2f  b base;        /
11da0 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20 20 4d  * Base class.  M
11db0 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a  ust be first */.
11dc0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11de0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
11df0 65 63 74 69 6f 6e 20 74 6f 20 77 68 69 63 68 20  ection to which 
11e00 69 74 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  it belongs */.  
11e10 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65  const PragmaName
11e20 20 2a 70 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d   *pName;  /* Nam
11e30 65 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20  e of the pragma 
11e40 2a 2f 0a 20 20 75 38 20 6e 48 69 64 64 65 6e 3b  */.  u8 nHidden;
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11e60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68 69 64 64  * Number of hidd
11e70 65 6e 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  en columns */.  
11e80 75 38 20 69 48 69 64 64 65 6e 3b 20 20 20 20 20  u8 iHidden;     
11e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
11ea0 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ex of the first 
11eb0 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a 2f  hidden column */
11ec0 0a 7d 3b 0a 73 74 72 75 63 74 20 50 72 61 67 6d  .};.struct Pragm
11ed0 61 56 74 61 62 43 75 72 73 6f 72 20 7b 0a 20 20  aVtabCursor {.  
11ee0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
11ef0 73 6f 72 20 62 61 73 65 3b 20 2f 2a 20 42 61 73  sor base; /* Bas
11f00 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62  e class.  Must b
11f10 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c  e first */.  sql
11f20 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 72 61 67  ite3_stmt *pPrag
11f30 6d 61 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 72  ma;    /* The pr
11f40 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 20 74  agma statement t
11f50 6f 20 72 75 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  o run */.  sqlit
11f60 65 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 3b 20  e_int64 iRowid; 
11f70 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
11f80 72 6f 77 69 64 20 2a 2f 0a 20 20 63 68 61 72 20  rowid */.  char 
11f90 2a 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20 20 20  *azArg[2];      
11fa0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
11fb0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 61 6e   the argument an
11fc0 64 20 73 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a  d schema */.};..
11fd0 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69  /* .** Pragma vi
11fe0 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
11ff0 6c 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68  le xConnect meth
12000 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
12010 74 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e  t pragmaVtabConn
12020 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
12030 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78  db,.  void *pAux
12040 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f  ,.  int argc, co
12050 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a  nst char *const*
12060 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argv,.  sqlite3_
12070 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20  vtab **ppVtab,. 
12080 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
12090 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e  .  const PragmaN
120a0 61 6d 65 20 2a 70 50 72 61 67 6d 61 20 3d 20 28  ame *pPragma = (
120b0 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65  const PragmaName
120c0 2a 29 70 41 75 78 3b 0a 20 20 50 72 61 67 6d 61  *)pAux;.  Pragma
120d0 56 74 61 62 20 2a 70 54 61 62 20 3d 20 30 3b 0a  Vtab *pTab = 0;.
120e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
120f0 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 53 65  i, j;.  char cSe
12100 70 20 3d 20 27 28 27 3b 0a 20 20 53 74 72 41 63  p = '(';.  StrAc
12110 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72 20  cum acc;.  char 
12120 7a 42 75 66 5b 32 30 30 5d 3b 0a 0a 20 20 55 4e  zBuf[200];..  UN
12130 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
12140 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rgc);.  UNUSED_P
12150 41 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b 0a  ARAMETER(argv);.
12160 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
12170 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c 20 7a  mInit(&acc, 0, z
12180 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66  Buf, sizeof(zBuf
12190 29 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ), 0);.  sqlite3
121a0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
121b0 6c 28 26 61 63 63 2c 20 22 43 52 45 41 54 45 20  l(&acc, "CREATE 
121c0 54 41 42 4c 45 20 78 22 29 3b 0a 20 20 66 6f 72  TABLE x");.  for
121d0 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
121e0 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 70  >iPragCName; i<p
121f0 50 72 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61  Pragma->nPragCNa
12200 6d 65 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  me; i++, j++){. 
12210 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
12220 66 28 26 61 63 63 2c 20 22 25 63 5c 22 25 73 5c  f(&acc, "%c\"%s\
12230 22 22 2c 20 63 53 65 70 2c 20 70 72 61 67 43 4e  "", cSep, pragCN
12240 61 6d 65 5b 6a 5d 29 3b 0a 20 20 20 20 63 53 65  ame[j]);.    cSe
12250 70 20 3d 20 27 2c 27 3b 0a 20 20 7d 0a 20 20 69  p = ',';.  }.  i
12260 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( i==0 ){.    s
12270 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 61  qlite3XPrintf(&a
12280 63 63 2c 20 22 28 5c 22 25 73 5c 22 22 2c 20 70  cc, "(\"%s\"", p
12290 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b 0a  Pragma->zName);.
122a0 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a      cSep = ',';.
122b0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6a      i++;.  }.  j
122c0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 72 61   = 0;.  if( pPra
122d0 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
122e0 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 20  PragFlg_Result1 
122f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  ){.    sqlite3St
12300 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
12310 26 61 63 63 2c 20 22 2c 61 72 67 20 48 49 44 44  &acc, ",arg HIDD
12320 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20  EN");.    j++;. 
12330 20 7d 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61   }.  if( pPragma
12340 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 28 50 72  ->mPragFlg & (Pr
12350 61 67 46 6c 67 5f 53 63 68 65 6d 61 4f 70 74 7c  agFlg_SchemaOpt|
12360 50 72 61 67 46 6c 67 5f 53 63 68 65 6d 61 52 65  PragFlg_SchemaRe
12370 71 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  q) ){.    sqlite
12380 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
12390 6c 6c 28 26 61 63 63 2c 20 22 2c 73 63 68 65 6d  ll(&acc, ",schem
123a0 61 20 48 49 44 44 45 4e 22 29 3b 0a 20 20 20 20  a HIDDEN");.    
123b0 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  j++;.  }.  sqlit
123c0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
123d0 28 26 61 63 63 2c 20 22 29 22 2c 20 31 29 3b 0a  (&acc, ")", 1);.
123e0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
123f0 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20  mFinish(&acc);. 
12400 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28   assert( strlen(
12410 7a 42 75 66 29 20 3c 20 73 69 7a 65 6f 66 28 7a  zBuf) < sizeof(z
12420 42 75 66 29 2d 31 20 29 3b 0a 20 20 72 63 20 3d  Buf)-1 );.  rc =
12430 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
12440 5f 76 74 61 62 28 64 62 2c 20 7a 42 75 66 29 3b  _vtab(db, zBuf);
12450 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
12460 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62  E_OK ){.    pTab
12470 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29   = (PragmaVtab*)
12480 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
12490 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62  izeof(PragmaVtab
124a0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ));.    if( pTab
124b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
124c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
124d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
124e0 20 6d 65 6d 73 65 74 28 70 54 61 62 2c 20 30 2c   memset(pTab, 0,
124f0 20 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74   sizeof(PragmaVt
12500 61 62 29 29 3b 0a 20 20 20 20 20 20 70 54 61 62  ab));.      pTab
12510 2d 3e 70 4e 61 6d 65 20 3d 20 70 50 72 61 67 6d  ->pName = pPragm
12520 61 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 64  a;.      pTab->d
12530 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 70 54  b = db;.      pT
12540 61 62 2d 3e 69 48 69 64 64 65 6e 20 3d 20 69 3b  ab->iHidden = i;
12550 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 48 69  .      pTab->nHi
12560 64 64 65 6e 20 3d 20 6a 3b 0a 20 20 20 20 7d 0a  dden = j;.    }.
12570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a    }else{.    *pz
12580 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
12590 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
125a0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
125b0 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20  .  }..  *ppVtab 
125c0 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a  = (sqlite3_vtab*
125d0 29 70 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20  )pTab;.  return 
125e0 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72  rc;.}../* .** Pr
125f0 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
12600 6c 65 20 6d 6f 64 75 6c 65 20 78 44 69 73 63 6f  le module xDisco
12610 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f  nnect method..*/
12620 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
12630 6d 61 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74  maVtabDisconnect
12640 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
12650 56 74 61 62 29 7b 0a 20 20 50 72 61 67 6d 61 56  Vtab){.  PragmaV
12660 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61  tab *pTab = (Pra
12670 67 6d 61 56 74 61 62 2a 29 70 56 74 61 62 3b 0a  gmaVtab*)pVtab;.
12680 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12690 54 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Tab);.  return S
126a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
126b0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 62  Figure out the b
126c0 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65  est index to use
126d0 20 74 6f 20 73 65 61 72 63 68 20 61 20 70 72 61   to search a pra
126e0 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
126f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  e..**.** There a
12700 72 65 20 6e 6f 74 20 72 65 61 6c 6c 79 20 61 6e  re not really an
12710 79 20 69 6e 64 65 78 20 63 68 6f 69 63 65 73 2e  y index choices.
12720 20 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f    But we want to
12730 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65 0a 2a   encourage the.*
12740 2a 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  * query planner 
12750 74 6f 20 67 69 76 65 20 3d 3d 20 63 6f 6e 73 74  to give == const
12760 72 61 69 6e 74 73 20 6f 6e 20 61 73 20 6d 61 6e  raints on as man
12770 79 20 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74  y hidden paramet
12780 65 72 73 20 61 73 0a 2a 2a 20 70 6f 73 73 69 62  ers as.** possib
12790 6c 65 2c 20 61 6e 64 20 65 73 70 65 63 69 61 6c  le, and especial
127a0 6c 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  ly on the first 
127b0 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72  hidden parameter
127c0 2e 20 20 53 6f 20 72 65 74 75 72 6e 20 61 0a 2a  .  So return a.*
127d0 2a 20 68 69 67 68 20 63 6f 73 74 20 69 66 20 68  * high cost if h
127e0 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73  idden parameters
127f0 20 61 72 65 20 75 6e 63 6f 6e 73 74 72 61 69 6e   are unconstrain
12800 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
12810 74 20 70 72 61 67 6d 61 56 74 61 62 42 65 73 74  t pragmaVtabBest
12820 49 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74  Index(sqlite3_vt
12830 61 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33  ab *tab, sqlite3
12840 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
12850 78 49 6e 66 6f 29 7b 0a 20 20 50 72 61 67 6d 61  xInfo){.  Pragma
12860 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72  Vtab *pTab = (Pr
12870 61 67 6d 61 56 74 61 62 2a 29 74 61 62 3b 0a 20  agmaVtab*)tab;. 
12880 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
12890 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
128a0 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61  traint *pConstra
128b0 69 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  int;.  int i, j;
128c0 0a 20 20 69 6e 74 20 73 65 65 6e 5b 32 5d 3b 0a  .  int seen[2];.
128d0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
128e0 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f  imatedCost = (do
128f0 75 62 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 54  uble)1;.  if( pT
12900 61 62 2d 3e 6e 48 69 64 64 65 6e 3d 3d 30 20 29  ab->nHidden==0 )
12910 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
12920 4f 4b 3b 20 7d 0a 20 20 70 43 6f 6e 73 74 72 61  OK; }.  pConstra
12930 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
12940 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 73  aConstraint;.  s
12950 65 65 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 73 65  een[0] = 0;.  se
12960 65 6e 5b 31 5d 20 3d 20 30 3b 0a 20 20 66 6f 72  en[1] = 0;.  for
12970 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
12980 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
12990 2b 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b  ++, pConstraint+
129a0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  +){.    if( pCon
129b0 73 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d  straint->usable=
129c0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
129d0 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69     if( pConstrai
129e0 6e 74 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49  nt->op!=SQLITE_I
129f0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
12a00 45 51 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  EQ ) continue;. 
12a10 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69     if( pConstrai
12a20 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3c 20 70 54  nt->iColumn < pT
12a30 61 62 2d 3e 69 48 69 64 64 65 6e 20 29 20 63 6f  ab->iHidden ) co
12a40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6a 20 3d 20  ntinue;.    j = 
12a50 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f  pConstraint->iCo
12a60 6c 75 6d 6e 20 2d 20 70 54 61 62 2d 3e 69 48 69  lumn - pTab->iHi
12a70 64 64 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  dden;.    assert
12a80 28 20 6a 20 3c 20 32 20 29 3b 0a 20 20 20 20 73  ( j < 2 );.    s
12a90 65 65 6e 5b 6a 5d 20 3d 20 69 2b 31 3b 0a 20 20  een[j] = i+1;.  
12aa0 7d 0a 20 20 69 66 28 20 73 65 65 6e 5b 30 5d 3d  }.  if( seen[0]=
12ab0 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e  =0 ){.    pIdxIn
12ac0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
12ad0 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 31 34 37  t = (double)2147
12ae0 34 38 33 36 34 37 3b 0a 20 20 20 20 70 49 64 78  483647;.    pIdx
12af0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
12b00 6f 77 73 20 3d 20 32 31 34 37 34 38 33 36 34 37  ows = 2147483647
12b10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12b20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6a 20  ITE_OK;.  }.  j 
12b30 3d 20 73 65 65 6e 5b 30 5d 2d 31 3b 0a 20 20 70  = seen[0]-1;.  p
12b40 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
12b50 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67  aintUsage[j].arg
12b60 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 70 49  vIndex = 1;.  pI
12b70 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
12b80 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74  intUsage[j].omit
12b90 20 3d 20 31 3b 0a 20 20 69 66 28 20 73 65 65 6e   = 1;.  if( seen
12ba0 5b 31 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  [1]==0 ) return 
12bb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 49 64  SQLITE_OK;.  pId
12bc0 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
12bd0 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 32  Cost = (double)2
12be0 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  0;.  pIdxInfo->e
12bf0 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32  stimatedRows = 2
12c00 30 3b 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 31 5d  0;.  j = seen[1]
12c10 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  -1;.  pIdxInfo->
12c20 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
12c30 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  [j].argvIndex = 
12c40 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  2;.  pIdxInfo->a
12c50 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
12c60 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 72  j].omit = 1;.  r
12c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12c80 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20 61 20  .}../* Create a 
12c90 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
12ca0 68 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61  he pragma virtua
12cb0 6c 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69  l table */.stati
12cc0 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
12cd0 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  Open(sqlite3_vta
12ce0 62 20 2a 70 56 74 61 62 2c 20 73 71 6c 69 74 65  b *pVtab, sqlite
12cf0 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a  3_vtab_cursor **
12d00 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61  ppCursor){.  Pra
12d10 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
12d20 43 73 72 3b 0a 20 20 70 43 73 72 20 3d 20 28 50  Csr;.  pCsr = (P
12d30 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
12d40 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
12d50 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a  sizeof(*pCsr));.
12d60 20 20 69 66 28 20 70 43 73 72 3d 3d 30 20 29 20    if( pCsr==0 ) 
12d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
12d80 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  MEM;.  memset(pC
12d90 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72  sr, 0, sizeof(Pr
12da0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 29 29  agmaVtabCursor))
12db0 3b 0a 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70  ;.  pCsr->base.p
12dc0 56 74 61 62 20 3d 20 70 56 74 61 62 3b 0a 20 20  Vtab = pVtab;.  
12dd0 2a 70 70 43 75 72 73 6f 72 20 3d 20 26 70 43 73  *ppCursor = &pCs
12de0 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72  r->base;.  retur
12df0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12e00 2f 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6e  /* Clear all con
12e10 74 65 6e 74 20 66 72 6f 6d 20 70 72 61 67 6d 61  tent from pragma
12e20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
12e30 75 72 73 6f 72 2e 20 2a 2f 0a 73 74 61 74 69 63  ursor. */.static
12e40 20 76 6f 69 64 20 70 72 61 67 6d 61 56 74 61 62   void pragmaVtab
12e50 43 75 72 73 6f 72 43 6c 65 61 72 28 50 72 61 67  CursorClear(Prag
12e60 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
12e70 73 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  sr){.  int i;.  
12e80 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
12e90 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b  (pCsr->pPragma);
12ea0 0a 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61  .  pCsr->pPragma
12eb0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
12ec0 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73   i<ArraySize(pCs
12ed0 72 2d 3e 61 7a 41 72 67 29 3b 20 69 2b 2b 29 7b  r->azArg); i++){
12ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12ef0 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d  e(pCsr->azArg[i]
12f00 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a 41  );.    pCsr->azA
12f10 72 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d  rg[i] = 0;.  }.}
12f20 0a 0a 2f 2a 20 43 6c 6f 73 65 20 61 20 70 72 61  ../* Close a pra
12f30 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
12f40 65 20 63 75 72 73 6f 72 20 2a 2f 0a 73 74 61 74  e cursor */.stat
12f50 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
12f60 62 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  bClose(sqlite3_v
12f70 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
12f80 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
12f90 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
12fa0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
12fb0 63 75 72 3b 0a 20 20 70 72 61 67 6d 61 56 74 61  cur;.  pragmaVta
12fc0 62 43 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73  bCursorClear(pCs
12fd0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
12fe0 65 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75  ee(pCsr);.  retu
12ff0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13000 0a 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  ./* Advance the 
13010 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  pragma virtual t
13020 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74  able cursor to t
13030 68 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 73  he next row */.s
13040 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
13050 56 74 61 62 4e 65 78 74 28 73 71 6c 69 74 65 33  VtabNext(sqlite3
13060 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
13070 74 61 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72  tabCursor){.  Pr
13080 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a  agmaVtabCursor *
13090 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74  pCsr = (PragmaVt
130a0 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43  abCursor*)pVtabC
130b0 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20  ursor;.  int rc 
130c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
130d0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
130e0 20 78 52 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f   xRowid value */
130f0 0a 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 2b  .  pCsr->iRowid+
13100 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  +;.  assert( pCs
13110 72 2d 3e 70 50 72 61 67 6d 61 20 29 3b 0a 20 20  r->pPragma );.  
13120 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d  if( SQLITE_ROW!=
13130 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73  sqlite3_step(pCs
13140 72 2d 3e 70 50 72 61 67 6d 61 29 20 29 7b 0a 20  r->pPragma) ){. 
13150 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
13160 66 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70  finalize(pCsr->p
13170 50 72 61 67 6d 61 29 3b 0a 20 20 20 20 70 43 73  Pragma);.    pCs
13180 72 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a  r->pPragma = 0;.
13190 20 20 20 20 70 72 61 67 6d 61 56 74 61 62 43 75      pragmaVtabCu
131a0 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b  rsorClear(pCsr);
131b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
131c0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67  ;.}../* .** Prag
131d0 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
131e0 20 6d 6f 64 75 6c 65 20 78 46 69 6c 74 65 72 20   module xFilter 
131f0 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
13200 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
13210 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65  Filter(.  sqlite
13220 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
13230 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69  VtabCursor, .  i
13240 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74  nt idxNum, const
13250 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20   char *idxStr,. 
13260 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
13270 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
13280 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
13290 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
132a0 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
132b0 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
132c0 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62  PragmaVtab *pTab
132d0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29   = (PragmaVtab*)
132e0 28 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56  (pVtabCursor->pV
132f0 74 61 62 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  tab);.  int rc;.
13300 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 53 74    int i, j;.  St
13310 72 41 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68  rAccum acc;.  ch
13320 61 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20 55 4e 55  ar *zSql;..  UNU
13330 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64  SED_PARAMETER(id
13340 78 4e 75 6d 29 3b 0a 20 20 55 4e 55 53 45 44 5f  xNum);.  UNUSED_
13350 50 41 52 41 4d 45 54 45 52 28 69 64 78 53 74 72  PARAMETER(idxStr
13360 29 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43  );.  pragmaVtabC
13370 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29  ursorClear(pCsr)
13380 3b 0a 20 20 6a 20 3d 20 28 70 54 61 62 2d 3e 70  ;.  j = (pTab->p
13390 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26  Name->mPragFlg &
133a0 20 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31   PragFlg_Result1
133b0 29 21 3d 30 20 3f 20 30 20 3a 20 31 3b 0a 20 20  )!=0 ? 0 : 1;.  
133c0 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
133d0 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
133e0 61 73 73 65 72 74 28 20 6a 3c 41 72 72 61 79 53  assert( j<ArrayS
133f0 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29  ize(pCsr->azArg)
13400 20 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a   );.    pCsr->az
13410 41 72 67 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33  Arg[j] = sqlite3
13420 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
13430 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
13440 74 28 61 72 67 76 5b 69 5d 29 29 3b 0a 20 20 20  t(argv[i]));.   
13450 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67   if( pCsr->azArg
13460 5b 6a 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [j]==0 ){.      
13470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
13480 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
13490 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
134a0 49 6e 69 74 28 26 61 63 63 2c 20 30 2c 20 30 2c  Init(&acc, 0, 0,
134b0 20 30 2c 20 70 54 61 62 2d 3e 64 62 2d 3e 61 4c   0, pTab->db->aL
134c0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
134d0 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 29 3b 0a  T_SQL_LENGTH]);.
134e0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
134f0 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c  mAppendAll(&acc,
13500 20 22 50 52 41 47 4d 41 20 22 29 3b 0a 20 20 69   "PRAGMA ");.  i
13510 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31  f( pCsr->azArg[1
13520 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
13530 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22 25  XPrintf(&acc, "%
13540 51 2e 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67  Q.", pCsr->azArg
13550 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [1]);.  }.  sqli
13560 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
13570 64 41 6c 6c 28 26 61 63 63 2c 20 70 54 61 62 2d  dAll(&acc, pTab-
13580 3e 70 4e 61 6d 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  >pName->zName);.
13590 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72    if( pCsr->azAr
135a0 67 5b 30 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  g[0] ){.    sqli
135b0 74 65 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c  te3XPrintf(&acc,
135c0 20 22 3d 25 51 22 2c 20 70 43 73 72 2d 3e 61 7a   "=%Q", pCsr->az
135d0 41 72 67 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a  Arg[0]);.  }.  z
135e0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Sql = sqlite3Str
135f0 41 63 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63  AccumFinish(&acc
13600 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
13610 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
13620 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73  _NOMEM;.  rc = s
13630 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
13640 32 28 70 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c  2(pTab->db, zSql
13650 2c 20 2d 31 2c 20 26 70 43 73 72 2d 3e 70 50 72  , -1, &pCsr->pPr
13660 61 67 6d 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69  agma, 0);.  sqli
13670 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
13680 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13690 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  _OK ){.    pTab-
136a0 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20  >base.zErrMsg = 
136b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
136c0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
136d0 72 6d 73 67 28 70 54 61 62 2d 3e 64 62 29 29 3b  rmsg(pTab->db));
136e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
136f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 61    }.  return pra
13700 67 6d 61 56 74 61 62 4e 65 78 74 28 70 56 74 61  gmaVtabNext(pVta
13710 62 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a  bCursor);.}../*.
13720 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61  ** Pragma virtua
13730 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
13740 45 6f 66 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  Eof method..*/.s
13750 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
13760 56 74 61 62 45 6f 66 28 73 71 6c 69 74 65 33 5f  VtabEof(sqlite3_
13770 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
13780 61 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61  abCursor){.  Pra
13790 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
137a0 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
137b0 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
137c0 72 73 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  rsor;.  return (
137d0 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 3d 3d 30  pCsr->pPragma==0
137e0 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 78 43 6f  );.}../* The xCo
137f0 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 73 69 6d 70  lumn method simp
13800 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  ly returns the c
13810 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
13820 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  umn from.** the 
13830 50 52 41 47 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61  PRAGMA.  .*/.sta
13840 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
13850 61 62 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69  abColumn(.  sqli
13860 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
13870 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20  *pVtabCursor, . 
13880 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
13890 20 2a 63 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a   *ctx, .  int i.
138a0 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
138b0 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
138c0 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
138d0 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
138e0 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62  PragmaVtab *pTab
138f0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29   = (PragmaVtab*)
13900 28 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56  (pVtabCursor->pV
13910 74 61 62 29 3b 0a 20 20 69 66 28 20 69 3c 70 54  tab);.  if( i<pT
13920 61 62 2d 3e 69 48 69 64 64 65 6e 20 29 7b 0a 20  ab->iHidden ){. 
13930 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
13940 74 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c  t_value(ctx, sql
13950 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
13960 65 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c  e(pCsr->pPragma,
13970 20 69 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   i));.  }else{. 
13980 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
13990 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43 73 72  t_text(ctx, pCsr
139a0 2d 3e 61 7a 41 72 67 5b 69 2d 70 54 61 62 2d 3e  ->azArg[i-pTab->
139b0 69 48 69 64 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49  iHidden],-1,SQLI
139c0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
139d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
139e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  TE_OK;.}../* .**
139f0 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   Pragma virtual 
13a00 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f  table module xRo
13a10 77 69 64 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  wid method..*/.s
13a20 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
13a30 56 74 61 62 52 6f 77 69 64 28 73 71 6c 69 74 65  VtabRowid(sqlite
13a40 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
13a50 56 74 61 62 43 75 72 73 6f 72 2c 20 73 71 6c 69  VtabCursor, sqli
13a60 74 65 5f 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20  te_int64 *p){.  
13a70 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13a80 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61   *pCsr = (Pragma
13a90 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61  VtabCursor*)pVta
13aa0 62 43 75 72 73 6f 72 3b 0a 20 20 2a 70 20 3d 20  bCursor;.  *p = 
13ab0 70 43 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pCsr->iRowid;.  
13ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13ad0 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 70 72 61 67  ;.}../* The prag
13ae0 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
13af0 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69   object */.stati
13b00 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
13b10 6d 6f 64 75 6c 65 20 70 72 61 67 6d 61 56 74 61  module pragmaVta
13b20 62 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c  bModule = {.  0,
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
13b50 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  ersion */.  0,  
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65           /* xCre
13b80 61 74 65 20 2d 20 63 72 65 61 74 65 20 61 20 74  ate - create a t
13b90 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61  able */.  pragma
13ba0 56 74 61 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20  VtabConnect,    
13bb0 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65         /* xConne
13bc0 63 74 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20  ct - connect to 
13bd0 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
13be0 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61  e */.  pragmaVta
13bf0 62 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20  bBestIndex,     
13c00 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65      /* xBestInde
13c10 78 20 2d 20 44 65 74 65 72 6d 69 6e 65 20 73 65  x - Determine se
13c20 61 72 63 68 20 73 74 72 61 74 65 67 79 20 2a 2f  arch strategy */
13c30 0a 20 20 70 72 61 67 6d 61 56 74 61 62 44 69 73  .  pragmaVtabDis
13c40 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  connect,        
13c50 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d  /* xDisconnect -
13c60 20 44 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d   Disconnect from
13c70 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c   a table */.  0,
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
13ca0 65 73 74 72 6f 79 20 2d 20 44 72 6f 70 20 61 20  estroy - Drop a 
13cb0 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d  table */.  pragm
13cc0 61 56 74 61 62 4f 70 65 6e 2c 20 20 20 20 20 20  aVtabOpen,      
13cd0 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
13ce0 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72   - open a cursor
13cf0 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
13d00 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
13d10 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63     /* xClose - c
13d20 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  lose a cursor */
13d30 0a 20 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c  .  pragmaVtabFil
13d40 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
13d50 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e  /* xFilter - con
13d60 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73  figure scan cons
13d70 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 70 72 61  traints */.  pra
13d80 67 6d 61 56 74 61 62 4e 65 78 74 2c 20 20 20 20  gmaVtabNext,    
13d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65            /* xNe
13da0 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63  xt - advance a c
13db0 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d  ursor */.  pragm
13dc0 61 56 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20  aVtabEof,       
13dd0 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20          /* xEof 
13de0 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43  */.  pragmaVtabC
13df0 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
13e00 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72    /* xColumn - r
13e10 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 70 72  ead data */.  pr
13e20 61 67 6d 61 56 74 61 62 52 6f 77 69 64 2c 20 20  agmaVtabRowid,  
13e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
13e40 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61  owid - read data
13e50 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
13e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e70 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2d 20     /* xUpdate - 
13e80 77 72 69 74 65 20 64 61 74 61 20 2a 2f 0a 20 20  write data */.  
13e90 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13eb0 78 42 65 67 69 6e 20 2d 20 62 65 67 69 6e 20 74  xBegin - begin t
13ec0 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
13ed0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13ef0 78 53 79 6e 63 20 2d 20 73 79 6e 63 20 74 72 61  xSync - sync tra
13f00 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c  nsaction */.  0,
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
13f30 6f 6d 6d 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74  ommit - commit t
13f40 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
13f50 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f70 78 52 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c  xRollback - roll
13f80 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e  back transaction
13f90 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74     /* xFindFunct
13fc0 69 6f 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f  ion - function o
13fd0 76 65 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20  verloading */.  
13fe0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14000 78 52 65 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65  xRename - rename
14010 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
14020 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14040 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  xSavepoint */.  
14050 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14070 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20  xRelease */.  0 
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
140a0 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a  ollbackTo */.};.
140b0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
140c0 73 65 65 20 69 66 20 7a 54 61 62 4e 61 6d 65 20  see if zTabName 
140d0 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6e 61  is really the na
140e0 6d 65 20 6f 66 20 61 20 70 72 61 67 6d 61 2e 20  me of a pragma. 
140f0 20 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68   If it is,.** th
14100 65 6e 20 72 65 67 69 73 74 65 72 20 61 6e 20 65  en register an e
14110 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c  ponymous virtual
14120 20 74 61 62 6c 65 20 66 6f 72 20 74 68 61 74 20   table for that 
14130 70 72 61 67 6d 61 20 61 6e 64 20 72 65 74 75 72  pragma and retur
14140 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
14150 6f 20 74 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a  o the Module obj
14160 65 63 74 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ect for the new 
14170 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
14180 2f 0a 4d 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65  /.Module *sqlite
14190 33 50 72 61 67 6d 61 56 74 61 62 52 65 67 69 73  3PragmaVtabRegis
141a0 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ter(sqlite3 *db,
141b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
141c0 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61  me){.  const Pra
141d0 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a  gmaName *pName;.
141e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
141f0 33 5f 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65  3_strnicmp(zName
14200 2c 20 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d  , "pragma_", 7)=
14210 3d 30 20 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20  =0 );.  pName = 
14220 70 72 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61  pragmaLocate(zNa
14230 6d 65 2b 37 29 3b 0a 20 20 69 66 28 20 70 4e 61  me+7);.  if( pNa
14240 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
14250 3b 0a 20 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e  ;.  if( (pName->
14260 6d 50 72 61 67 46 6c 67 20 26 20 28 50 72 61 67  mPragFlg & (Prag
14270 46 6c 67 5f 52 65 73 75 6c 74 30 7c 50 72 61 67  Flg_Result0|Prag
14280 46 6c 67 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30  Flg_Result1))==0
14290 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
142a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 48 61  ssert( sqlite3Ha
142b0 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64  shFind(&db->aMod
142c0 75 6c 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ule, zName)==0 )
142d0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
142e0 65 33 56 74 61 62 43 72 65 61 74 65 4d 6f 64 75  e3VtabCreateModu
142f0 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70  le(db, zName, &p
14300 72 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c  ragmaVtabModule,
14310 20 28 76 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30   (void*)pName, 0
14320 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
14330 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
14340 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e  UALTABLE */..#en
14350 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14360 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a           IT_PRAGMA */.