/ Hex Artifact Content
Login

Artifact f3a391cee6a651aaceea695147d23efdd4cf4c8101cc4a0e630739e1ccc1380b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  K );.    while( 
1ba0: 28 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20  (n--) > 0 ){.   
1bb0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
1bc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bd0: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
1be0: 6c 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20  lags(pDb->pBt,. 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76  (pDb->safety_lev
1c10: 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  el & PAGER_SYNCH
1c20: 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 0a 20 20 20  RONOUS_MASK).   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50  | (db->flags & P
1c50: 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29  AGER_FLAGS_MASK)
1c60: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1c70: 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20    pDb++;.    }. 
1c80: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
1c90: 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72 46  ine setAllPagerF
1ca0: 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d 6f  lags(X)  /* no-o
1cb0: 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  p */.#endif.../*
1cc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75 6d  .** Return a hum
1cd0: 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d 65  an-readable name
1ce0: 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   for a constrain
1cf0: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63 74  t resolution act
1d00: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
1d10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
1d20: 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20 63  IGN_KEY.static c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69 6f  onst char *actio
1d40: 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e 29  nName(u8 action)
1d50: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1d60: 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68 28  zName;.  switch(
1d70: 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 63   action ){.    c
1d80: 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a 20  ase OE_SetNull: 
1d90: 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e 55   zName = "SET NU
1da0: 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  LL";        brea
1db0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 53  k;.    case OE_S
1dc0: 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20 3d  etDflt:  zName =
1dd0: 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b 20   "SET DEFAULT"; 
1de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1df0: 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a 20  ase OE_Cascade: 
1e00: 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41 44   zName = "CASCAD
1e10: 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61  E";         brea
1e20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52  k;.    case OE_R
1e30: 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20 3d  estrict: zName =
1e40: 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20 20   "RESTRICT";    
1e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
1e60: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
1e70: 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43 54   zName = "NO ACT
1e80: 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20 20  ION";  .        
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1ea0: 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f 45  sert( action==OE
1eb0: 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b 0a  _None ); break;.
1ec0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
1ed0: 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  me;.}.#endif.../
1ee0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
1ef0: 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
1f00: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
1f10: 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63 6f  URNALMODE_XXX co
1f20: 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69 6e  nstants.** defin
1f30: 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20 54  ed in pager.h. T
1f40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1f50: 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69 61  urns the associa
1f60: 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a 2a  ted lowercase.**
1f70: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e 61   journal-mode na
1f80: 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  me..*/.const cha
1f90: 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  r *sqlite3Journa
1fa0: 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65 4d  lModename(int eM
1fb0: 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ode){.  static c
1fc0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d 6f  har * const azMo
1fd0: 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20  deName[] = {.   
1fe0: 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72 73   "delete", "pers
1ff0: 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74 72  ist", "off", "tr
2000: 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72 79  uncate", "memory
2010: 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ".#ifndef SQLITE
2020: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 2c  _OMIT_WAL.     ,
2030: 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20 20   "wal".#endif.  
2040: 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  };.  assert( PAG
2050: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
2060: 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61 73  ELETE==0 );.  as
2070: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
2080: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 3d  NALMODE_PERSIST=
2090: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
20a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20b0: 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61 73  E_OFF==2 );.  as
20c0: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
20d0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
20e0: 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==3 );.  assert(
20f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2100: 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b 0a  DE_MEMORY==4 );.
2110: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2120: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 3d  JOURNALMODE_WAL=
2130: 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =5 );.  assert( 
2140: 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f 64  eMode>=0 && eMod
2150: 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 4d  e<=ArraySize(azM
2160: 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20 69  odeName) );..  i
2170: 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79 53  f( eMode==ArrayS
2180: 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29 20  ize(azModeName) 
2190: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
21a0: 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65 5b  turn azModeName[
21b0: 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eMode];.}../*.**
21c0: 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d 61   Locate a pragma
21d0: 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61 4e   in the aPragmaN
21e0: 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ame[] array..*/.
21f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72 61  static const Pra
2200: 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61 4c  gmaName *pragmaL
2210: 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72  ocate(const char
2220: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
2230: 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d 20  upr, lwr, mid = 
2240: 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20 30  0, rc;.  lwr = 0
2250: 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79 53  ;.  upr = ArrayS
2260: 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65 29  ize(aPragmaName)
2270: 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77 72  -1;.  while( lwr
2280: 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69 64  <=upr ){.    mid
2290: 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a   = (lwr+upr)/2;.
22a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22b0: 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  _stricmp(zName, 
22c0: 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64 5d  aPragmaName[mid]
22d0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
22e0: 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a   rc==0 ) break;.
22f0: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a      if( rc<0 ){.
2300: 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64 20        upr = mid 
2310: 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 1;.    }else{.
2320: 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 20        lwr = mid 
2330: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
2340: 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72 20   return lwr>upr 
2350: 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e 61  ? 0 : &aPragmaNa
2360: 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  me[mid];.}../*.*
2370: 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75 74  * Helper subrout
2380: 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20 69  ine for PRAGMA i
2390: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a 0a  ntegrity_check:.
23a0: 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  **.** Generate c
23b0: 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61 20  ode to output a 
23c0: 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72 65  single-column re
23d0: 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 61 20  sult row with a 
23e0: 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
23f0: 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20 72  string held in r
2400: 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63 72  egister 3.  Decr
2410: 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74  ement the result
2420: 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73 74   count in regist
2430: 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c 74  er 1.** and halt
2440: 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   if the maximum 
2450: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
2460: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
2470: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
2480: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
2490: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24a0: 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61 64  be *v){.  int ad
24b0: 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dr;.  sqlite3Vdb
24c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
24d0: 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b 0a  sultRow, 3, 1);.
24e0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
24f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2500: 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69 74  _IfPos, 1, sqlit
2510: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2520: 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56 64  r(v)+2, 1);.  Vd
2530: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2540: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2550: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a  p0(v, OP_Halt);.
2560: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
2570: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
2580: 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  a pragma stateme
2590: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67  nt.  .**.** Prag
25a0: 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73 20  mas are of this 
25b0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
25c0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
25d0: 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a  ]id [= value].**
25e0: 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69  .** The identifi
25f0: 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  er might also be
2600: 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20   a string.  The 
2610: 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
2620: 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69  g, and.** identi
2630: 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65  fier, or a numbe
2640: 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67  r.  If minusFlag
2650: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2660: 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  he value is.** a
2670: 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61 73   number that was
2680: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
2690: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a  inus sign..**.**
26a0: 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69 64   If the left sid
26b0: 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e 69  e is "database.i
26c0: 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73 20  d" then pId1 is 
26d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
26e0: 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69 73  e.** and pId2 is
26f0: 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68 65   the id.  If the
2700: 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a 75   left side is ju
2710: 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49 64  st "id" then pId
2720: 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20 61  1 is the.** id a
2730: 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20 65  nd pId2 is any e
2740: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  mpty string..*/.
2750: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61 67  void sqlite3Prag
2760: 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ma(.  Parse *pPa
2770: 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70  rse, .  Token *p
2780: 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20 46  Id1,        /* F
2790: 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73 63  irst part of [sc
27a0: 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a  hema.]id field *
27b0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c  /.  Token *pId2,
27c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
27d0: 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  d part of [schem
27e0: 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72 20  a.]id field, or 
27f0: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
2800: 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a  *pValue,      /*
2810: 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75   Token for <valu
2820: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2830: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20 20   int minusFlag  
2840: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2850: 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63 65  a '-' sign prece
2860: 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29  ded <value> */.)
2870: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20  {.  char *zLeft 
2880: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2890: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
28a0: 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a  -8 string <id> *
28b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74  /.  char *zRight
28c0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
28d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
28e0: 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75 65  -8 string <value
28f0: 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  >, or NULL */.  
2900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
2910: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  = 0;   /* The da
2920: 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
2930: 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20   Token *pId;    
2940: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2950: 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e  er to <id> token
2960: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63 6e   */.  char *aFcn
2970: 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20  tl[4];       /* 
2980: 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49  Argument to SQLI
2990: 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20  TE_FCNTL_PRAGMA 
29a0: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
29c0: 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66 6f  atabase index fo
29d0: 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a  r <database> */.
29e0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * return value f
2a10: 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  orm SQLITE_FCNTL
2a20: 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c  _PRAGMA */.  sql
2a30: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
2a40: 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68 65  e->db;    /* The
2a50: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2a60: 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44  tion */.  Db *pD
2a70: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2a80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
2a90: 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20  ecific database 
2aa0: 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20 2a  being pragmaed *
2ab0: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
2ac0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
2ad0: 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61 72  rse);  /* Prepar
2ae0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
2af0: 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61    const PragmaNa
2b00: 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f  me *pPragma;   /
2b10: 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a  * The pragma */.
2b20: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
2b30: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
2b40: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76  dbeRunOnlyOnce(v
2b50: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  );.  pParse->nMe
2b60: 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74  m = 2;..  /* Int
2b70: 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68 65  erpret the [sche
2b80: 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68 65  ma.] part of the
2b90: 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e   pragma statemen
2ba0: 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20 20  t. iDb is the.  
2bb0: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
2bc0: 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70 72  database this pr
2bd0: 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61 70  agma is being ap
2be0: 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e 61  plied to in db.a
2bf0: 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d  Db[]. */.  iDb =
2c00: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
2c10: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64 31  ame(pParse, pId1
2c20: 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a 20  , pId2, &pId);. 
2c30: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
2c40: 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  urn;.  pDb = &db
2c50: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f  ->aDb[iDb];..  /
2c60: 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64 61  * If the temp da
2c70: 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
2c80: 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64  explicitly named
2c90: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
2ca0: 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61  .  ** pragma, ma
2cb0: 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f 70  ke sure it is op
2cc0: 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  en. .  */.  if( 
2cd0: 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  iDb==1 && sqlite
2ce0: 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
2cf0: 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  e(pParse) ){.   
2d00: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
2d10: 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 4e  zLeft = sqlite3N
2d20: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2d30: 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c   pId);.  if( !zL
2d40: 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  eft ) return;.  
2d50: 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
2d60: 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71  .    zRight = sq
2d70: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
2d80: 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29 3b   "-%T", pValue);
2d90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52  .  }else{.    zR
2da0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e 61  ight = sqlite3Na
2db0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
2dc0: 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  pValue);.  }..  
2dd0: 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b 0a  assert( pId2 );.
2de0: 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e    zDb = pId2->n>
2df0: 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  0 ? pDb->zDbSNam
2e00: 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  e : 0;.  if( sql
2e10: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2e20: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52 41  arse, SQLITE_PRA
2e30: 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67  GMA, zLeft, zRig
2e40: 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  ht, zDb) ){.    
2e50: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
2e60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20  .  }..  /* Send 
2e70: 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  an SQLITE_FCNTL_
2e80: 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74  PRAGMA file-cont
2e90: 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65 72  rol to the under
2ea0: 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63  lying VFS.  ** c
2eb0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20 69  onnection.  If i
2ec0: 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
2ed0: 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  _OK, then assume
2ee0: 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20 20   that the VFS.  
2ef0: 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20 70  ** handled the p
2f00: 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72 61  ragma and genera
2f10: 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61  te a no-op prepa
2f20: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
2f30: 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
2f40: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32  NTATION-OF: R-12
2f50: 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65 76  238-55120 Whenev
2f60: 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61 74  er a PRAGMA stat
2f70: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
2f80: 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f  .  ** an SQLITE_
2f90: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c  FCNTL_PRAGMA fil
2fa0: 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e  e control is sen
2fb0: 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73 71  t to the open sq
2fc0: 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20  lite3_file.  ** 
2fd0: 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
2fe0: 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ding to the data
2ff0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68 69  base file to whi
3000: 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20 20  ch the pragma.  
3010: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 66  ** statement ref
3020: 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ers..  **.  ** I
3030: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
3040: 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38 20  : R-29875-31678 
3050: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
3060: 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
3070: 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c  _PRAGMA.  ** fil
3080: 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20  e control is an 
3090: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
30a0: 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63 68  s to strings (ch
30b0: 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20 74  ar**) in which t
30c0: 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65  he.  ** second e
30d0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 72  lement of the ar
30e0: 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ray is the name 
30f0: 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61 6e  of the pragma an
3100: 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a 2a  d the third.  **
3110: 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65 20   element is the 
3120: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
3130: 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69  pragma or NULL i
3140: 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61 73  f the pragma has
3150: 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e   no.  ** argumen
3160: 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c  t..  */.  aFcntl
3170: 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74  [0] = 0;.  aFcnt
3180: 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20  l[1] = zLeft;.  
3190: 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67  aFcntl[2] = zRig
31a0: 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20  ht;.  aFcntl[3] 
31b0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  = 0;.  db->busyH
31c0: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
31d0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
31e0: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
31f0: 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
3200: 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69  NTL_PRAGMA, (voi
3210: 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66  d*)aFcntl);.  if
3220: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3230: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
3240: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
3250: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
3260: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
3270: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
3280: 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c  , aFcntl[0], SQL
3290: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
32a0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
32b0: 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30  Text(v, aFcntl[0
32c0: 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
32d0: 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b  free(aFcntl[0]);
32e0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61  .    goto pragma
32f0: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
3300: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc!=SQLITE_NOTFO
3310: 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 61  UND ){.    if( a
3320: 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20  Fcntl[0] ){.    
3330: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3340: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
3350: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
3360: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
3370: 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d  Fcntl[0]);.    }
3380: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
3390: 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  r++;.    pParse-
33a0: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f  >rc = rc;.    go
33b0: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
33c0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
33d0: 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74 68  the pragma in th
33e0: 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a  e lookup table *
33f0: 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70 72  /.  pPragma = pr
3400: 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74  agmaLocate(zLeft
3410: 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61  );.  if( pPragma
3420: 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67 6d  ==0 ) goto pragm
3430: 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  a_out;..  /* Mak
3440: 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
3450: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c 6f  ase schema is lo
3460: 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61 67  aded if the prag
3470: 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ma requires that
3480: 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61 67   */.  if( (pPrag
3490: 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  ma->mPragFlg & P
34a0: 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d  ragFlg_NeedSchem
34b0: 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  a)!=0 ){.    if(
34c0: 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
34d0: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
34e0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
34f0: 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
3500: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
3510: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 70 72 61  mn names for pra
3520: 67 6d 61 73 20 74 68 61 74 20 72 65 74 75 72 6e  gmas that return
3530: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66   results */.  if
3540: 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61  ( (pPragma->mPra
3550: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
3560: 6f 43 6f 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20  oColumns)==0 .  
3570: 20 26 26 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d   && ((pPragma->m
3580: 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
3590: 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30  g_NoColumns1)==0
35a0: 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20   || zRight==0). 
35b0: 20 29 7b 0a 20 20 20 20 73 65 74 50 72 61 67 6d   ){.    setPragm
35c0: 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d  aResultColumnNam
35d0: 65 73 28 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a  es(v, pPragma);.
35e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
35f0: 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
3600: 65 20 70 72 61 67 6d 61 20 68 61 6e 64 6c 65 72  e pragma handler
3610: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 50   */.  switch( pP
3620: 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 20  ragma->ePragTyp 
3630: 29 7b 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e  ){.  .#if !defin
3640: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
3650: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 26 26  AGER_PRAGMAS) &&
3660: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3670: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
3680: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ).  /*.  **  PRA
3690: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66  GMA [schema.]def
36a0: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a  ault_cache_size.
36b0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
36c0: 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61  hema.]default_ca
36d0: 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a  che_size=N.  **.
36e0: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
36f0: 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20  orm reports the 
3700: 63 75 72 72 65 6e 74 20 70 65 72 73 69 73 74 65  current persiste
3710: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
3720: 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63  he.  ** page cac
3730: 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76 61  he size.  The va
3740: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
3750: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
3760: 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73  er of.  ** pages
3770: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
3780: 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  he.  The second 
3790: 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20 74  form sets both t
37a0: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
37b0: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
37c0: 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 65  value and the pe
37d0: 72 73 69 73 74 65 6e 74 20 70 61 67 65 20 63 61  rsistent page ca
37e0: 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a 20  che size value. 
37f0: 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68   ** stored in th
3800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3810: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72  .  **.  ** Older
3820: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
3830: 69 74 65 20 77 6f 75 6c 64 20 73 65 74 20 74 68  ite would set th
3840: 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 20  e default cache 
3850: 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e  size to a.  ** n
3860: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 74  egative number t
3870: 6f 20 69 6e 64 69 63 61 74 65 20 73 79 6e 63 68  o indicate synch
3880: 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65  ronous=OFF.  The
3890: 73 65 20 64 61 79 73 2c 20 73 79 6e 63 68 72 6f  se days, synchro
38a0: 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77  nous.  ** is alw
38b0: 61 79 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c  ays on by defaul
38c0: 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  t regardless of 
38d0: 74 68 65 20 73 69 67 6e 20 6f 66 20 74 68 65 20  the sign of the 
38e0: 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a 20 20  default cache.  
38f0: 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74 20 63 6f  ** size.  But co
3900: 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b 65 20 74  ntinue to take t
3910: 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75  he absolute valu
3920: 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  e of the default
3930: 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65   cache.  ** size
3940: 20 6f 66 20 68 69 73 74 6f 72 69 63 61 6c 20 63   of historical c
3950: 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 20 20  ompatibility..  
3960: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
3970: 70 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  p_DEFAULT_CACHE_
3980: 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 74 61 74  SIZE: {.    stat
3990: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e  ic const int iLn
39a0: 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c   = VDBE_OFFSET_L
39b0: 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74  INENO(2);.    st
39c0: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
39d0: 70 4c 69 73 74 20 67 65 74 43 61 63 68 65 53 69  pList getCacheSi
39e0: 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ze[] = {.      {
39f0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
3a00: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
3a10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2a            /* 0 *
3a30: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61  /.      { OP_Rea
3a40: 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20  dCookie,  0, 1, 
3a50: 20 20 20 20 20 20 20 42 54 52 45 45 5f 44 45 46         BTREE_DEF
3a60: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d  AULT_CACHE_SIZE}
3a70: 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  ,  /* 1 */.     
3a80: 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20   { OP_IfPos,    
3a90: 20 20 20 31 2c 20 38 2c 20 20 20 20 20 20 20 20     1, 8,        
3aa0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  0},.      { OP_I
3ab0: 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 32  nteger,     0, 2
3ac0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3ad0: 20 20 20 7b 20 4f 50 5f 53 75 62 74 72 61 63 74     { OP_Subtract
3ae0: 2c 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20 20  ,    1, 2,      
3af0: 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    1},.      { OP
3b00: 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c  _IfPos,       1,
3b10: 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   8,        0},. 
3b20: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
3b30: 72 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20  r,     0, 1,    
3b40: 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20 20 20      0},         
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 6 */.      { 
3b70: 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20  OP_Noop,        
3b80: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
3b90: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75  .      { OP_Resu
3ba0: 6c 74 52 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20  ltRow,   1, 1,  
3bb0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
3bc0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  .    VdbeOp *aOp
3bd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3be0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
3bf0: 62 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  b);.    if( !zRi
3c00: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ght ){.      pPa
3c10: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a  rse->nMem += 2;.
3c20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3c30: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
3c40: 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79  equired(v, Array
3c50: 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a  Size(getCacheSiz
3c60: 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d  e));.      aOp =
3c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3c80: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
3c90: 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29  ze(getCacheSize)
3ca0: 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 2c 20  , getCacheSize, 
3cb0: 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  iLn);.      if( 
3cc0: 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f  ONLY_IF_REALLOC_
3cd0: 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29  STRESS(aOp==0) )
3ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f   break;.      aO
3cf0: 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[0].p1 = iDb;. 
3d00: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d       aOp[1].p1 =
3d10: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
3d20: 36 5d 2e 70 31 20 3d 20 53 51 4c 49 54 45 5f 44  6].p1 = SQLITE_D
3d30: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
3d40: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
3d50: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 73      int size = s
3d60: 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 73  qlite3AbsInt32(s
3d70: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
3d80: 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
3d90: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
3da0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
3db0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
3dc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
3dd0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
3de0: 69 44 62 2c 20 42 54 52 45 45 5f 44 45 46 41 55  iDb, BTREE_DEFAU
3df0: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 73  LT_CACHE_SIZE, s
3e00: 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ize);.      asse
3e10: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3e20: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3e30: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20  Db, 0) );.      
3e40: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
3e50: 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b  che_size = size;
3e60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
3e70: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
3e80: 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70  pDb->pBt, pDb->p
3e90: 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69  Schema->cache_si
3ea0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ze);.    }.    b
3eb0: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
3ec0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3ed0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 26  _PAGER_PRAGMAS &
3ee0: 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  & !SQLITE_OMIT_D
3ef0: 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69  EPRECATED */..#i
3f00: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3f10: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
3f20: 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  GMAS).  /*.  ** 
3f30: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
3f40: 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20  ]page_size.  ** 
3f50: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
3f60: 5d 70 61 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a  ]page_size=N.  *
3f70: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
3f80: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
3f90: 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
3fa0: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64  g for the.  ** d
3fb0: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
3fc0: 65 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 65  e in bytes.  The
3fd0: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74   second form set
3fe0: 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  s the.  ** datab
3ff0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 76 61  ase page size va
4000: 6c 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  lue.  The value 
4010: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 73 65 74 20  can only be set 
4020: 69 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  if.  ** the data
4030: 62 61 73 65 20 68 61 73 20 6e 6f 74 20 79 65 74  base has not yet
4040: 20 62 65 65 6e 20 63 72 65 61 74 65 64 2e 0a 20   been created.. 
4050: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
4060: 79 70 5f 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a  yp_PAGE_SIZE: {.
4070: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
4080: 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61   pDb->pBt;.    a
4090: 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b  ssert( pBt!=0 );
40a0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
40b0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69   ){.      int si
40c0: 7a 65 20 3d 20 41 4c 57 41 59 53 28 70 42 74 29  ze = ALWAYS(pBt)
40d0: 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   ? sqlite3BtreeG
40e0: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 29 20  etPageSize(pBt) 
40f0: 3a 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  : 0;.      retur
4100: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69  nSingleInt(v, si
4110: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
4120: 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20        /* Malloc 
4130: 6d 61 79 20 66 61 69 6c 20 77 68 65 6e 20 73 65  may fail when se
4140: 74 74 69 6e 67 20 74 68 65 20 70 61 67 65 2d 73  tting the page-s
4150: 69 7a 65 2c 20 61 73 20 74 68 65 72 65 20 69 73  ize, as there is
4160: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20   an internal.   
4170: 20 20 20 2a 2a 20 62 75 66 66 65 72 20 74 68 61     ** buffer tha
4180: 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f 64 75  t the pager modu
4190: 6c 65 20 72 65 73 69 7a 65 73 20 75 73 69 6e 67  le resizes using
41a0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
41b0: 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ()..      */.   
41c0: 20 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73     db->nextPages
41d0: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74 6f  ize = sqlite3Ato
41e0: 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
41f0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
4200: 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
4210: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
4220: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4230: 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  ,-1,0) ){.      
4240: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
4250: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t(db);.      }. 
4260: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
4270: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
4280: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4290: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20  secure_delete.  
42a0: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
42b0: 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65 74  ma.]secure_delet
42c0: 65 3d 4f 4e 2f 4f 46 46 2f 46 41 53 54 0a 20 20  e=ON/OFF/FAST.  
42d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
42e0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
42f0: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
4300: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
4310: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 66 6c  secure_delete fl
4320: 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  ag.  The second 
4330: 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65  form changes the
4340: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
4350: 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69 6e 67   ** flag setting
4360: 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74 68 65   and reports the
4370: 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a 2f   new value..  */
4380: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4390: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20 7b  SECURE_DELETE: {
43a0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
43b0: 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20  = pDb->pBt;.    
43c0: 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20 20  int b = -1;.    
43d0: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
43e0: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
43f0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
4400: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 52  lite3_stricmp(zR
4410: 69 67 68 74 2c 20 22 66 61 73 74 22 29 3d 3d 30  ight, "fast")==0
4420: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 20 3d 20   ){.        b = 
4430: 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
4440: 20 20 20 20 20 20 20 20 62 20 3d 20 73 71 6c 69          b = sqli
4450: 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
4460: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
4470: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4480: 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e  pId2->n==0 && b>
4490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
44a0: 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
44b0: 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20  =0; ii<db->nDb; 
44c0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
44d0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
44e0: 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b  eDelete(db->aDb[
44f0: 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20  ii].pBt, b);.   
4500: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
4510: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
4520: 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74 2c  ecureDelete(pBt,
4530: 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53   b);.    returnS
4540: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b 0a  ingleInt(v, b);.
4550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4560: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
4570: 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70  A [schema.]max_p
4580: 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20  age_count.  **  
4590: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
45a0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e  max_page_count=N
45b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
45c0: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
45d0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  s the current se
45e0: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
45f0: 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  ** maximum numbe
4600: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
4610: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
4620: 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f    The .  ** seco
4630: 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74 73  nd form attempts
4640: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73 20   to change this 
4650: 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20  setting.  Both. 
4660: 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72 6e   ** forms return
4670: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
4680: 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ting..  **.  ** 
4690: 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  The absolute val
46a0: 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64 2e  ue of N is used.
46b0: 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75    This is undocu
46c0: 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68 74  mented and might
46d0: 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54  .  ** change.  T
46e0: 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20  he only purpose 
46f0: 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  is to provide an
4700: 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65 73   easy way to tes
4710: 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  t.  ** the sqlit
4720: 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75 6e  e3AbsInt32() fun
4730: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ction..  **.  **
4740: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4750: 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a  .]page_count.  *
4760: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
4770: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
4780: 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  s in the specifi
4790: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
47a0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
47b0: 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20  _PAGE_COUNT: {. 
47c0: 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20 20     int iReg;.   
47d0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
47e0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
47f0: 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67 20   iDb);.    iReg 
4800: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
4810: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
4820: 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30  3Tolower(zLeft[0
4830: 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20  ])=='p' ){.     
4840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4850: 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f 75  p2(v, OP_Pagecou
4860: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b 0a  nt, iDb, iReg);.
4870: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4880: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4890: 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63 6e  p3(v, OP_MaxPgcn
48a0: 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a 20  t, iDb, iReg, . 
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62         sqlite3Ab
48d0: 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41 74  sInt32(sqlite3At
48e0: 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20 20  oi(zRight)));.  
48f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
4900: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4910: 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67 2c  ResultRow, iReg,
4920: 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a   1);.    break;.
4930: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
4940: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4950: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a  locking_mode.  *
4960: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4970: 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  a.]locking_mode 
4980: 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73  = (normal|exclus
4990: 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ive).  */.  case
49a0: 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47   PragTyp_LOCKING
49b0: 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e  _MODE: {.    con
49c0: 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  st char *zRet = 
49d0: 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e  "normal";.    in
49e0: 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63  t eMode = getLoc
49f0: 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74 29  kingMode(zRight)
4a00: 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d  ;..    if( pId2-
4a10: 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d  >n==0 && eMode==
4a20: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
4a30: 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20 20  E_QUERY ){.     
4a40: 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41 47   /* Simple "PRAG
4a50: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b  MA locking_mode;
4a60: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  " statement. Thi
4a70: 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f 72  s is a query for
4a80: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
4a90: 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f  rrent default lo
4aa0: 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69 63  cking mode (whic
4ab0: 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  h may be differe
4ac0: 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  nt to.      ** t
4ad0: 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
4ae0: 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
4af0: 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  base)..      */.
4b00: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64 62        eMode = db
4b10: 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a  ->dfltLockMode;.
4b20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4b30: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
4b40: 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e        if( pId2->
4b50: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
4b60: 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  /* This indicate
4b70: 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62 61  s that no databa
4b80: 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65 63  se name was spec
4b90: 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20 20  ified as part.  
4ba0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
4bb0: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20  PRAGMA command. 
4bc0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
4bd0: 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75   locking-mode mu
4be0: 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
4bf0: 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61   set on all atta
4c00: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c 20  ched databases, 
4c10: 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d  as well as the m
4c20: 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20 20  ain db file..   
4c30: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
4c40: 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c  ** Also, the sql
4c50: 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64  ite3.dfltLockMod
4c60: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  e variable is se
4c70: 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20  t so that.      
4c80: 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71 75    ** any subsequ
4c90: 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20 64  ently attached d
4ca0: 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75 73  atabases also us
4cb0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  e the specified.
4cc0: 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69          ** locki
4cd0: 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20  ng mode..       
4ce0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
4cf0: 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
4d00: 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62  rt(pDb==&db->aDb
4d10: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
4d20: 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e  r(ii=2; ii<db->n
4d30: 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  Db; ii++){.     
4d40: 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
4d50: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
4d60: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29  db->aDb[ii].pBt)
4d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
4d80: 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
4d90: 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f 64  ode(pPager, eMod
4da0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
4db0: 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f        db->dfltLo
4dc0: 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  ckMode = (u8)eMo
4dd0: 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
4de0: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
4df0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62  e3BtreePager(pDb
4e00: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65 4d  ->pBt);.      eM
4e10: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ode = sqlite3Pag
4e20: 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50  erLockingMode(pP
4e30: 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  ager, eMode);.  
4e40: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
4e50: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4e60: 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
4e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
4e80: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
4e90: 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
4ea0: 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d  VE );.    if( eM
4eb0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
4ec0: 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
4ed0: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d   ){.      zRet =
4ee0: 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20 20   "exclusive";.  
4ef0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
4f00: 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65 74  ngleText(v, zRet
4f10: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
4f20: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  }..  /*.  **  PR
4f30: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f  AGMA [schema.]jo
4f40: 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20  urnal_mode.  ** 
4f50: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4f60: 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a  ]journal_mode =.
4f70: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
4f80: 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65 74            (delet
4f90: 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74 72  e|persist|off|tr
4fa0: 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77 61  uncate|memory|wa
4fb0: 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63 61  l|off).  */.  ca
4fc0: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
4fd0: 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 69  AL_MODE: {.    i
4fe0: 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  nt eMode;       
4ff0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
5000: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
5010: 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  _XXX symbols */.
5020: 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
5030: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
5040: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69 66  unter */..    if
5050: 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( zRight==0 ){. 
5060: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
5070: 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70   is no "=MODE" p
5080: 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67 6d  art of the pragm
5090: 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66 6f  a, do a query fo
50a0: 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  r the.      ** c
50b0: 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20  urrent mode */. 
50c0: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
50d0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
50e0: 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  UERY;.    }else{
50f0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
5100: 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20  r *zMode;.      
5110: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
5120: 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 3b  trlen30(zRight);
5130: 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64 65  .      for(eMode
5140: 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c  =0; (zMode = sql
5150: 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e  ite3JournalModen
5160: 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20  ame(eMode))!=0; 
5170: 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20  eMode++){.      
5180: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
5190: 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d  NICmp(zRight, zM
51a0: 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65  ode, n)==0 ) bre
51b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
51c0: 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a    if( !zMode ){.
51d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
51e0: 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 64  e "=MODE" part d
51f0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
5200: 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20  y known journal 
5210: 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  mode,.        **
5220: 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72 79   then do a query
5230: 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   */.        eMod
5240: 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
5250: 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20 20  LMODE_QUERY;.   
5260: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5270: 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  f( eMode==PAGER_
5280: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
5290: 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30 20  Y && pId2->n==0 
52a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ){.      /* Conv
52b0: 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  ert "PRAGMA jour
52c0: 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20 22  nal_mode" into "
52d0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72  PRAGMA main.jour
52e0: 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20 20  nal_mode" */.   
52f0: 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20 20     iDb = 0;.    
5300: 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20    pId2->n = 1;. 
5310: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
5320: 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30  db->nDb-1; ii>=0
5330: 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  ; ii--){.      i
5340: 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  f( db->aDb[ii].p
5350: 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c  Bt && (ii==iDb |
5360: 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b  | pId2->n==0) ){
5370: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5380: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
5390: 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71   ii);.        sq
53a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
53b0: 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64  v, OP_JournalMod
53c0: 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29  e, ii, 1, eMode)
53d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
53e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
53f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
5400: 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20  ltRow, 1, 1);.  
5410: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
5420: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
5430: 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c  [schema.]journal
5440: 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a 2a  _size_limit.  **
5450: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
5460: 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c  .]journal_size_l
5470: 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  imit=N.  **.  **
5480: 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65 20   Get or set the 
5490: 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72 6f  size limit on ro
54a0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
54b0: 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  iles..  */.  cas
54c0: 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41  e PragTyp_JOURNA
54d0: 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b 0a  L_SIZE_LIMIT: {.
54e0: 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
54f0: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
5500: 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Pager(pDb->pBt);
5510: 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20  .    i64 iLimit 
5520: 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a 52  = -2;.    if( zR
5530: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
5540: 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
5550: 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d  64(zRight, &iLim
5560: 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  it);.      if( i
5570: 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d 69  Limit<-1 ) iLimi
5580: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  t = -1;.    }.  
5590: 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74    iLimit = sqlit
55a0: 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
55b0: 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c 20  zeLimit(pPager, 
55c0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65 74  iLimit);.    ret
55d0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
55e0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72 65  iLimit);.    bre
55f0: 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20  ak;.  }..#endif 
5600: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  /* SQLITE_OMIT_P
5610: 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  AGER_PRAGMAS */.
5620: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
5630: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f  MA [schema.]auto
5640: 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50 52  _vacuum.  **  PR
5650: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75  AGMA [schema.]au
5660: 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a 2a  to_vacuum=N.  **
5670: 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65 74  .  ** Get or set
5680: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
5690: 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74 6f  e database 'auto
56a0: 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65 74  -vacuum' paramet
56b0: 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  er..  ** The val
56c0: 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20 30  ue is one of:  0
56d0: 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20 49   NONE 1 FULL 2 I
56e0: 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f 0a  NCREMENTAL.  */.
56f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5700: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
5710: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41 55   case PragTyp_AU
5720: 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20  TO_VACUUM: {.   
5730: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
5740: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  b->pBt;.    asse
5750: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
5760: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
5770: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
5780: 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65  gleInt(v, sqlite
5790: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
57a0: 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20 7d  uum(pBt));.    }
57b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
57c0: 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f 56  eAuto = getAutoV
57d0: 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a 20  acuum(zRight);. 
57e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41 75       assert( eAu
57f0: 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c 3d  to>=0 && eAuto<=
5800: 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  2 );.      db->n
5810: 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75 38  extAutovac = (u8
5820: 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f 2a  )eAuto;.      /*
5830: 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61 63   Call SetAutoVac
5840: 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e 69  uum() to set ini
5850: 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74 65  tialize the inte
5860: 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20 20  rnal auto and.  
5870: 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63 75      ** incr-vacu
5880: 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20 69  um flags. This i
5890: 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61  s required in ca
58a0: 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  se this connecti
58b0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61  on.      ** crea
58c0: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
58d0: 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d 70   file. It is imp
58e0: 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20 69  ortant that it i
58f0: 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20 20  s created.      
5900: 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76 61  ** as an auto-va
5910: 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62 2e  cuum capable db.
5920: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5930: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
5940: 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70  eSetAutoVacuum(p
5950: 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20 20  Bt, eAuto);.    
5960: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5970: 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d 31  _OK && (eAuto==1
5980: 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29 7b   || eAuto==2) ){
5990: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  .        /* When
59a0: 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75 74   setting the aut
59b0: 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 6f  o_vacuum mode to
59c0: 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20 6f   either "full" o
59d0: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 69  r .        ** "i
59e0: 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72 69  ncremental", wri
59f0: 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
5a00: 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20 64  meta[6] in the d
5a10: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20  atabase.        
5a20: 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65 20  ** file. Before 
5a30: 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61 5b  writing to meta[
5a40: 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20 6d  6], check that m
5a50: 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65 73  eta[3] indicates
5a60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
5a70: 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20   this really is 
5a80: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  an auto-vacuum c
5a90: 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65 2e  apable database.
5aa0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
5ab0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
5ac0: 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f   int iLn = VDBE_
5ad0: 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29  OFFSET_LINENO(2)
5ae0: 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63  ;.        static
5af0: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
5b00: 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20 7b  t setMeta6[] = {
5b10: 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  .          { OP_
5b20: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
5b30: 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20 20  0,         1,   
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d                0}
5b50: 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20  ,    /* 0 */.   
5b60: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64         { OP_Read
5b70: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20 20  Cookie,     0,  
5b80: 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20         1,       
5b90: 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f    BTREE_LARGEST_
5ba0: 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20 20  ROOT_PAGE},.    
5bb0: 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20 20        { OP_If,  
5bc0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20 20             1,   
5bd0: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
5be0: 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20           0},    
5bf0: 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 2 */.        
5c00: 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20    { OP_Halt,    
5c10: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
5c20: 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20 20  , OE_Abort,     
5c30: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33       0},    /* 3
5c40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20   */.          { 
5c50: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20  OP_SetCookie,   
5c60: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42 54     0,         BT
5c70: 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d 2c  REE_INCR_VACUUM,
5c80: 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a   0},    /* 4 */.
5c90: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
5ca0: 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a     VdbeOp *aOp;.
5cb0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
5cc0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
5cd0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
5ce0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5cf0: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
5d00: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
5d10: 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29 29  ySize(setMeta6))
5d20: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d 20  ;.        aOp = 
5d30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d40: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
5d50: 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65 74  e(setMeta6), set
5d60: 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20 20  Meta6, iLn);.   
5d70: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
5d80: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
5d90: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
5da0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  .        aOp[0].
5db0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5dc0: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
5dd0: 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32  b;.        aOp[2
5de0: 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b 0a  ].p2 = iAddr+4;.
5df0: 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e 70          aOp[4].p
5e00: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20  1 = iDb;.       
5e10: 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41 75   aOp[4].p3 = eAu
5e20: 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  to - 1;.        
5e30: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
5e40: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
5e50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5e60: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
5e70: 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  f..  /*.  **  PR
5e80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 6e  AGMA [schema.]in
5e90: 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
5ea0: 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f  (N).  **.  ** Do
5eb0: 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63 72   N steps of incr
5ec0: 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69 6e  emental vacuumin
5ed0: 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 2e  g on a database.
5ee0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
5ef0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
5f00: 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61 67  CUUM.  case Prag
5f10: 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c 5f  Typ_INCREMENTAL_
5f20: 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69 6e  VACUUM: {.    in
5f30: 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b 0a  t iLimit, addr;.
5f40: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d 3d      if( zRight==
5f50: 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65 74  0 || !sqlite3Get
5f60: 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 69  Int32(zRight, &i
5f70: 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69 74  Limit) || iLimit
5f80: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 69  <=0 ){.      iLi
5f90: 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66 66  mit = 0x7fffffff
5fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5fb0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
5fc0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
5fd0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
5fe0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5ff0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c 69   OP_Integer, iLi
6000: 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64 64  mit, 1);.    add
6010: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
6020: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63 72  ddOp1(v, OP_Incr
6030: 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56 64  Vacuum, iDb); Vd
6040: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6060: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp1(v, OP_Resul
6070: 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73 71  tRow, 1);.    sq
6080: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6090: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c  v, OP_AddImm, 1,
60a0: 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   -1);.    sqlite
60b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
60c0: 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64 72  P_IfPos, 1, addr
60d0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
60e0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
60f0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
6100: 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ddr);.    break;
6110: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
6120: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6130: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 20  _PAGER_PRAGMAS. 
6140: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
6150: 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f   [schema.]cache_
6160: 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d  size.  **  PRAGM
6170: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6180: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
6190: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
61a0: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
61b0: 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69  rent local setti
61c0: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
61d0: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e  page cache size.
61e0: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
61f0: 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a   sets the local.
6200: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
6210: 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66 20  size value.  If 
6220: 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74 68  N is positive th
6230: 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a 20  en that is the. 
6240: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
6250: 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
6260: 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74  .  If N is negat
6270: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ive, then the.  
6280: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
6290: 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20 73  es is adjusted s
62a0: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
62b0: 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74   uses -N kibibyt
62c0: 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72  es.  ** of memor
62d0: 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  y..  */.  case P
62e0: 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49 5a  ragTyp_CACHE_SIZ
62f0: 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E: {.    assert(
6300: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
6310: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
6320: 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21   0) );.    if( !
6330: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
6340: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
6350: 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  v, pDb->pSchema-
6360: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
6370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
6380: 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65  nt size = sqlite
6390: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20  3Atoi(zRight);. 
63a0: 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d       pDb->pSchem
63b0: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  a->cache_size = 
63c0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
63d0: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
63e0: 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20 70  Size(pDb->pBt, p
63f0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63  Db->pSchema->cac
6400: 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  he_size);.    }.
6410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6420: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6430: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6440: 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52 41  _spill.  **  PRA
6450: 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d  GMA cache_spill=
6460: 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50 52  BOOLEAN.  **  PR
6470: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61  AGMA [schema.]ca
6480: 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a 2a  che_spill=N.  **
6490: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
64a0: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
64b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73   current local s
64c0: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
64d0: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
64e0: 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20 73  pill size. The s
64f0: 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e 73  econd form turns
6500: 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e 0a   cache spill on.
6510: 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57 68    ** or off.  Wh
6520: 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63 68  en turnning cach
6530: 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65 20  e spill on, the 
6540: 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  size is set to t
6550: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
6560: 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68 65  cache_size.  The
6570: 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74 73   third form sets
6580: 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74 68   a spill size th
6590: 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 64  at.  ** may be d
65a0: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74 68  ifferent form th
65b0: 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  e cache size..  
65c0: 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69 74  ** If N is posit
65d0: 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69 73  ive then that is
65e0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
65f0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6600: 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69 73   cache.  If N is
6610: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
6620: 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
6630: 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a 75  of pages is adju
6640: 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  sted so that the
6650: 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20 6b   cache uses -N k
6660: 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f 66  ibibytes.  ** of
6670: 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20   memory..  **.  
6680: 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
6690: 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c 20   of cache_spill 
66a0: 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74 68  pages is less th
66b0: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
66c0: 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a 65  .  ** cache_size
66d0: 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c 6c   pages, no spill
66e0: 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69 6c  ing occurs until
66f0: 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 20   the page count 
6700: 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68 65  exceeds.  ** the
6710: 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   number of cache
6720: 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20 2a  _size pages..  *
6730: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68 65  *.  ** The cache
6740: 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20 73  _spill=BOOLEAN s
6750: 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20 74  etting applies t
6760: 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 73  o all attached s
6770: 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f 74  chemas,.  ** not
6780: 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d 61   just the schema
6790: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f   specified..  */
67a0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
67b0: 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a 20  CACHE_SPILL: {. 
67c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
67d0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
67e0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
67f0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
6800: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
6810: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20 20  SingleInt(v,.   
6820: 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73        (db->flags
6830: 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53   & SQLITE_CacheS
6840: 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20 0a  pill)==0 ? 0 : .
6850: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6860: 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c  te3BtreeSetSpill
6870: 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30 29  Size(pDb->pBt,0)
6880: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6890: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 31      int size = 1
68a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
68b0: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67  te3GetInt32(zRig
68c0: 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20 20  ht, &size) ){.  
68d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
68e0: 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70  eeSetSpillSize(p
68f0: 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b 0a  Db->pBt, size);.
6900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6910: 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  ( sqlite3GetBool
6920: 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a 65  ean(zRight, size
6930: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
6940: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
6950: 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a  ITE_CacheSpill;.
6960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6970: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
6980: 3d 20 7e 53 51 4c 49 54 45 5f 43 61 63 68 65 53  = ~SQLITE_CacheS
6990: 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pill;.      }.  
69a0: 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46      setAllPagerF
69b0: 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  lags(db);.    }.
69c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
69d0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
69e0: 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f  A [schema.]mmap_
69f0: 73 69 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a  size(N).  **.  *
6a00: 2a 20 55 73 65 64 20 74 6f 20 73 65 74 20 6d 61  * Used to set ma
6a10: 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74  pping size limit
6a20: 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 73 69  . The mapping si
6a30: 7a 65 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a  ze limit is.  **
6a40: 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 74   used to limit t
6a50: 68 65 20 61 67 67 72 65 67 61 74 65 20 73 69 7a  he aggregate siz
6a60: 65 20 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  e of all memory 
6a70: 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20 6f  mapped regions o
6a80: 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  f the.  ** datab
6a90: 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 69  ase file. If thi
6aa0: 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73  s parameter is s
6ab0: 65 74 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  et to zero, then
6ac0: 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a   memory mapping.
6ad0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64    ** is not used
6ae0: 20 61 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69   at all.  If N i
6af0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
6b00: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 65 6d   the default mem
6b10: 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d  ory map.  ** lim
6b20: 69 74 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  it determined by
6b30: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
6b40: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
6b50: 41 50 5f 53 49 5a 45 29 20 69 73 20 73 65 74 2e  AP_SIZE) is set.
6b60: 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 61 6d 65  .  ** The parame
6b70: 74 65 72 20 4e 20 69 73 20 6d 65 61 73 75 72 65  ter N is measure
6b80: 64 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a  d in bytes..  **
6b90: 0a 20 20 2a 2a 20 54 68 69 73 20 76 61 6c 75 65  .  ** This value
6ba0: 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54   is advisory.  T
6bb0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46  he underlying VF
6bc0: 53 20 69 73 20 66 72 65 65 20 74 6f 20 6d 65 6d  S is free to mem
6bd0: 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20  ory map.  ** as 
6be0: 6c 69 74 74 6c 65 20 6f 72 20 61 73 20 6d 75 63  little or as muc
6bf0: 68 20 61 73 20 69 74 20 77 61 6e 74 73 2e 20 20  h as it wants.  
6c00: 45 78 63 65 70 74 2c 20 69 66 20 4e 20 69 73 20  Except, if N is 
6c10: 73 65 74 20 74 6f 20 30 20 74 68 65 6e 20 74 68  set to 0 then th
6c20: 65 0a 20 20 2a 2a 20 75 70 70 65 72 20 6c 61 79  e.  ** upper lay
6c30: 65 72 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 69  ers will never i
6c40: 6e 76 6f 6b 65 20 74 68 65 20 78 46 65 74 63 68  nvoke the xFetch
6c50: 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20 74   interfaces to t
6c60: 68 65 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63  he VFS..  */.  c
6c70: 61 73 65 20 50 72 61 67 54 79 70 5f 4d 4d 41 50  ase PragTyp_MMAP
6c80: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c  _SIZE: {.    sql
6c90: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23  ite3_int64 sz;.#
6ca0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
6cb0: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61 73  AP_SIZE>0.    as
6cc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
6cd0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
6ce0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
6cf0: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
6d00: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
6d10: 20 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65    sqlite3DecOrHe
6d20: 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26  xToI64(zRight, &
6d30: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  sz);.      if( s
6d40: 7a 3c 30 20 29 20 73 7a 20 3d 20 73 71 6c 69 74  z<0 ) sz = sqlit
6d50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
6d60: 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28  zMmap;.      if(
6d70: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62   pId2->n==0 ) db
6d80: 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20  ->szMmap = sz;. 
6d90: 20 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e       for(ii=db->
6da0: 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69  nDb-1; ii>=0; ii
6db0: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
6dc0: 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74   db->aDb[ii].pBt
6dd0: 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20   && (ii==iDb || 
6de0: 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20  pId2->n==0) ){. 
6df0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6e00: 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69  BtreeSetMmapLimi
6e10: 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  t(db->aDb[ii].pB
6e20: 74 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  t, sz);.        
6e30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6e40: 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20      sz = -1;.   
6e50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
6e60: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
6e70: 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
6e80: 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29  _MMAP_SIZE, &sz)
6e90: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d  ;.#else.    sz =
6ea0: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   0;.    rc = SQL
6eb0: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20  ITE_OK;.#endif. 
6ec0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6ed0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
6ee0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
6ef0: 20 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20   sz);.    }else 
6f00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e  if( rc!=SQLITE_N
6f10: 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  OTFOUND ){.     
6f20: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6f30: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
6f40: 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  c = rc;.    }.  
6f50: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
6f60: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
6f70: 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a   temp_store.  **
6f80: 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73     PRAGMA temp_s
6f90: 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74 22  tore = "default"
6fa0: 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22  |"memory"|"file"
6fb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
6fc0: 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63  n or set the loc
6fd0: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
6fe0: 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e  temp_store flag.
6ff0: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
7000: 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
7010: 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68  does not make ch
7020: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73  anges to the dis
7030: 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  k file and the d
7040: 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75  efault.  ** valu
7050: 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72  e will be restor
7060: 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ed the next time
7070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
7080: 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20   opened..  **.  
7090: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
70a0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
70b0: 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70  the library comp
70c0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
70d0: 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64   to.  ** overrid
70e0: 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a 20  e this setting. 
70f0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
7100: 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b  yp_TEMP_STORE: {
7110: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
7120: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7130: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d  SingleInt(v, db-
7140: 3e 74 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20  >temp_store);.  
7150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
7160: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
7170: 28 70 50 61 72 73 65 2c 20 7a 52 69 67 68 74 29  (pParse, zRight)
7180: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
7190: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
71a0: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
71b0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a  store_directory.
71c0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65    **   PRAGMA te
71d0: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
71e0: 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f  ry = ""|"directo
71f0: 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20  ry_name".  **.  
7200: 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74  ** Return or set
7210: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
7220: 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f   of the temp_sto
7230: 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61  re_directory fla
7240: 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
7250: 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73  * the value sets
7260: 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72 65   a specific dire
7270: 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64  ctory to be used
7280: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
7290: 69 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69  iles..  ** Setti
72a0: 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72  ng to a null str
72b0: 69 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20 74  ing reverts to t
72c0: 68 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70 6f  he default tempo
72d0: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 73  rary directory s
72e0: 65 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74  earch..  ** If t
72f0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
7300: 72 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ry is changed, t
7310: 68 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54 65  hen invalidateTe
7320: 6d 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a  mpStorage..  **.
7330: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7340: 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44  Typ_TEMP_STORE_D
7350: 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20  IRECTORY: {.    
7360: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
7370: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
7380: 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33  eText(v, sqlite3
7390: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
73a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
73b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
73c0: 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a  _WSD.      if( z
73d0: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
73e0: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
73f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7400: 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56  3OsAccess(db->pV
7410: 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49  fs, zRight, SQLI
7420: 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
7430: 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  ITE, &res);.    
7440: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7450: 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20  TE_OK || res==0 
7460: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7470: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7480: 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74  rse, "not a writ
7490: 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29  able directory")
74a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
74b0: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20   pragma_out;.   
74c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
74d0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
74e0: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20  TEMP_STORE==0.  
74f0: 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f       || (SQLITE_
7500: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26  TEMP_STORE==1 &&
7510: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c   db->temp_store<
7520: 3d 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 53  =1).       || (S
7530: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
7540: 3d 3d 32 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f  ==2 && db->temp_
7550: 73 74 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20 20  store==1).      
7560: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  ){.        inval
7570: 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65  idateTempStorage
7580: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7590: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
75a0: 66 72 65 65 28 73 71 6c 69 74 65 33 5f 74 65 6d  free(sqlite3_tem
75b0: 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
75c0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
75d0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
75e0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
75f0: 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ory = sqlite3_mp
7600: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67  rintf("%s", zRig
7610: 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ht);.      }else
7620: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7630: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
7640: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
7650: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7660: 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d  MIT_WSD */.    }
7670: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
7680: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7690: 49 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  IN.  /*.  **   P
76a0: 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65  RAGMA data_store
76b0: 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20  _directory.  ** 
76c0: 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74    PRAGMA data_st
76d0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ore_directory = 
76e0: 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61  ""|"directory_na
76f0: 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  me".  **.  ** Re
7700: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
7710: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  local value of t
7720: 68 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  he data_store_di
7730: 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43  rectory flag.  C
7740: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
7750: 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73 70   value sets a sp
7760: 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72 79  ecific directory
7770: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
7780: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 74  database files t
7790: 68 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73 70  hat.  ** were sp
77a0: 65 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72  ecified with a r
77b0: 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
77c0: 2e 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20  .  Setting to a 
77d0: 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65  null string reve
77e0: 72 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  rts.  ** to the 
77f0: 64 65 66 61 75 6c 74 20 64 61 74 61 62 61 73 65  default database
7800: 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69 63   directory, whic
7810: 68 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  h for database f
7820: 69 6c 65 73 20 73 70 65 63 69 66 69 65 64 20 77  iles specified w
7830: 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74  ith.  ** a relat
7840: 69 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70 72  ive path will pr
7850: 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65 64 20  obably be based 
7860: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  on the current d
7870: 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65  irectory for the
7880: 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20  .  ** process.  
7890: 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 70  Database file sp
78a0: 65 63 69 66 69 65 64 20 77 69 74 68 20 61 6e 20  ecified with an 
78b0: 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61 72  absolute path ar
78c0: 65 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a 20  e not impacted. 
78d0: 20 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74 74   ** by this sett
78e0: 69 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ing, regardless 
78f0: 6f 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20 20  of its value..  
7900: 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  **.  */.  case P
7910: 72 61 67 54 79 70 5f 44 41 54 41 5f 53 54 4f 52  ragTyp_DATA_STOR
7920: 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20  E_DIRECTORY: {. 
7930: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
7940: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
7950: 6e 67 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69  ngleText(v, sqli
7960: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
7970: 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ry);.    }else{.
7980: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7990: 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66  MIT_WSD.      if
79a0: 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20  ( zRight[0] ){. 
79b0: 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a         int res;.
79c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
79d0: 69 74 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d  ite3OsAccess(db-
79e0: 3e 70 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53  >pVfs, zRight, S
79f0: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
7a00: 44 57 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20  DWRITE, &res);. 
7a10: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
7a20: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d  QLITE_OK || res=
7a30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7a40: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7a50: 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77  pParse, "not a w
7a60: 72 69 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72  ritable director
7a70: 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  y");.          g
7a80: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
7a90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7aa0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
7ab0: 66 72 65 65 28 73 71 6c 69 74 65 33 5f 64 61 74  free(sqlite3_dat
7ac0: 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  a_directory);.  
7ad0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
7ae0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
7af0: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
7b00: 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ory = sqlite3_mp
7b10: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67  rintf("%s", zRig
7b20: 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ht);.      }else
7b30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7b40: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7b50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
7b60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7b70: 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d  MIT_WSD */.    }
7b80: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
7b90: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
7ba0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
7bb0: 47 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a  G_STYLE.  /*.  *
7bc0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
7bd0: 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  ma.]lock_proxy_f
7be0: 69 6c 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ile.  **   PRAGM
7bf0: 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f  A [schema.]lock_
7c00: 70 72 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61  proxy_file = ":a
7c10: 75 74 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65  uto:"|"lock_file
7c20: 5f 70 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a  _path".  **.  **
7c30: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
7c40: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
7c50: 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20  lock_proxy_file 
7c60: 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a  flag.  Changing.
7c70: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73    ** the value s
7c80: 65 74 73 20 61 20 73 70 65 63 69 66 69 63 20 66  ets a specific f
7c90: 69 6c 65 20 74 6f 20 62 65 20 75 73 65 64 20 66  ile to be used f
7ca0: 6f 72 20 64 61 74 61 62 61 73 65 20 61 63 63 65  or database acce
7cb0: 73 73 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20  ss locks..  **. 
7cc0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
7cd0: 79 70 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49  yp_LOCK_PROXY_FI
7ce0: 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a  LE: {.    if( !z
7cf0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 50  Right ){.      P
7d00: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
7d10: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
7d20: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
7d30: 20 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66 69    char *proxy_fi
7d40: 6c 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  le_path = NULL;.
7d50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
7d60: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
7d70: 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
7d80: 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
7d90: 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
7da0: 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49  Hint(pFile, SQLI
7db0: 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
7dc0: 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20  FILE, .         
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 20 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61    &proxy_file_pa
7df0: 74 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  th);.      retur
7e00: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 70  nSingleText(v, p
7e10: 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b  roxy_file_path);
7e20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7e30: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
7e40: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
7e50: 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20  ger(pDb->pBt);. 
7e60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
7e70: 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  e *pFile = sqlit
7e80: 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
7e90: 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  er);.      int r
7ea0: 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  es;.      if( zR
7eb0: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
7ec0: 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73     res=sqlite3Os
7ed0: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c  FileControl(pFil
7ee0: 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
7ef0: 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20  CKPROXYFILE, .  
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f20: 20 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20     zRight);.    
7f30: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
7f40: 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73     res=sqlite3Os
7f50: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c  FileControl(pFil
7f60: 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
7f70: 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20  CKPROXYFILE, .  
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20     NULL);.      
7fb0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 21  }.      if( res!
7fc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7fe0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
7ff0: 61 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f 63  ailed to set loc
8000: 6b 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a  k proxy file");.
8010: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61          goto pra
8020: 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  gma_out;.      }
8030: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
8040: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
8050: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
8060: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20  CKING_STYLE */  
8070: 20 20 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20      .    .  /*. 
8080: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
8090: 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75  hema.]synchronou
80a0: 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  s.  **   PRAGMA 
80b0: 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f  [schema.]synchro
80c0: 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d  nous=OFF|ON|NORM
80d0: 41 4c 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20  AL|FULL|EXTRA.  
80e0: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
80f0: 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  r set the local 
8100: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e  value of the syn
8110: 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20  chronous flag.  
8120: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
8130: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f  e local value do
8140: 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e  es not make chan
8150: 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ges to the disk 
8160: 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a  file and the.  *
8170: 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * default value 
8180: 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64  will be restored
8190: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
81a0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 20  he database is. 
81b0: 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f   ** opened..  */
81c0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
81d0: 53 59 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20  SYNCHRONOUS: {. 
81e0: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
81f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
8200: 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e  ngleInt(v, pDb->
8210: 73 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b  safety_level-1);
8220: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8230: 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43    if( !db->autoC
8240: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
8250: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8260: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
8270: 20 20 20 20 20 20 22 53 61 66 65 74 79 20 6c 65        "Safety le
8280: 76 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  vel may not be c
8290: 68 61 6e 67 65 64 20 69 6e 73 69 64 65 20 61 20  hanged inside a 
82a0: 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20  transaction");. 
82b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
82c0: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db!=1 ){.       
82d0: 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28 67   int iLevel = (g
82e0: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52  etSafetyLevel(zR
82f0: 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26 20 50  ight,0,1)+1) & P
8300: 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
8310: 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20 69  _MASK;.        i
8320: 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20 69  f( iLevel==0 ) i
8330: 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20  Level = 1;.     
8340: 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
8350: 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20  evel = iLevel;. 
8360: 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53 79 6e         pDb->bSyn
8370: 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  cSet = 1;.      
8380: 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61    setAllPagerFla
8390: 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  gs(db);.      }.
83a0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
83b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
83c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
83d0: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
83e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
83f0: 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20 20  _FLAG_PRAGMAS.  
8400: 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4c 41  case PragTyp_FLA
8410: 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  G: {.    if( zRi
8420: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
8430: 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74 43  setPragmaResultC
8440: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50  olumnNames(v, pP
8450: 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20 72 65  ragma);.      re
8460: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
8470: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 70 50   (db->flags & pP
8480: 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20  ragma->iArg)!=0 
8490: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
84a0: 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 70      int mask = p
84b0: 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20  Pragma->iArg;   
84c0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73   /* Mask of bits
84d0: 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65 61 72   to set or clear
84e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  . */.      if( d
84f0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
8500: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
8510: 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70 6f  oreign key suppo
8520: 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e  rt may not be en
8530: 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62 6c 65  abled or disable
8540: 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20  d while not.    
8550: 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63      ** in auto-c
8560: 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a  ommit mode.  */.
8570: 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d 20          mask &= 
8580: 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e  ~(SQLITE_Foreign
8590: 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Keys);.      }.#
85a0: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
85b0: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
85c0: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68      if( db->auth
85d0: 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54  .authLevel==UAUT
85e0: 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20  H_User ){.      
85f0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
8600: 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72  w non-admin user
8610: 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  s to modify the 
8620: 73 63 68 65 6d 61 20 61 72 62 69 74 72 61 72 69  schema arbitrari
8630: 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61  ly */.        ma
8640: 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57  sk &= ~(SQLITE_W
8650: 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20 20 20  riteSchema);.   
8660: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
8670: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
8680: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c  tBoolean(zRight,
8690: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64   0) ){.        d
86a0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  b->flags |= mask
86b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
86c0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
86d0: 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
86e0: 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c     if( mask==SQL
86f0: 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 20 64  ITE_DeferFKs ) d
8700: 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
8710: 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ons = 0;.      }
8720: 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20  ..      /* Many 
8730: 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72 61 67  of the flag-prag
8740: 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65 20 63  mas modify the c
8750: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
8760: 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20 20 20   the SQL .      
8770: 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e  ** compiler (eg.
8780: 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e   count_changes).
8790: 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f 64   So add an opcod
87a0: 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a  e to expire all.
87b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
87c0: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  d SQL statements
87d0: 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69 6e 67   after modifying
87e0: 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75 65 2e   a pragma value.
87f0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
8800: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8810: 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b  0(v, OP_Expire);
8820: 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67  .      setAllPag
8830: 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20  erFlags(db);.   
8840: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
8850: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8860: 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41  TE_OMIT_FLAG_PRA
8870: 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GMAS */..#ifndef
8880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
8890: 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a  EMA_PRAGMAS.  /*
88a0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
88b0: 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c 65  able_info(<table
88c0: 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  >).  **.  ** Ret
88d0: 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
88e0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
88f0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   of the named ta
8900: 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 73  ble. The columns
8910: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 74   of.  ** the ret
8920: 75 72 6e 65 64 20 64 61 74 61 20 73 65 74 20 61  urned data set a
8930: 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 69  re:.  **.  ** ci
8940: 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  d:        Column
8950: 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20 66 72   id (numbered fr
8960: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
8970: 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20 30 29  , starting at 0)
8980: 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20  .  ** name:     
8990: 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20    Column name.  
89a0: 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20 20 43  ** type:       C
89b0: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
89c0: 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74  n type..  ** not
89d0: 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20 69 66  null:    True if
89e0: 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20 70   'NOT NULL' is p
89f0: 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64 65  art of column de
8a00: 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 64  claration.  ** d
8a10: 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65 20 64  flt_value: The d
8a20: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
8a30: 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20   the column, if 
8a40: 61 6e 79 2e 0a 20 20 2a 2a 20 70 6b 3a 20 20 20  any..  ** pk:   
8a50: 20 20 20 20 20 20 4e 6f 6e 2d 7a 65 72 6f 20 66        Non-zero f
8a60: 6f 72 20 50 4b 20 66 69 65 6c 64 73 2e 0a 20 20  or PK fields..  
8a70: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
8a80: 70 5f 54 41 42 4c 45 5f 49 4e 46 4f 3a 20 69 66  p_TABLE_INFO: if
8a90: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
8aa0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
8ab0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
8ac0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
8ad0: 65 2c 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 2c  e, LOCATE_NOERR,
8ae0: 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20   zRight, zDb);. 
8af0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
8b00: 20 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b 0a 20       int i, k;. 
8b10: 20 20 20 20 20 69 6e 74 20 6e 48 69 64 64 65 6e       int nHidden
8b20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 43 6f 6c 75   = 0;.      Colu
8b30: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  mn *pCol;.      
8b40: 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
8b50: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
8b60: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
8b70: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
8b80: 37 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  7;.      sqlite3
8b90: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
8ba0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
8bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77       sqlite3View
8bc0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
8bd0: 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
8be0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f      for(i=0, pCo
8bf0: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c  l=pTab->aCol; i<
8c00: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  pTab->nCol; i++,
8c10: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
8c20: 20 20 69 6e 74 20 69 73 48 69 64 64 65 6e 20 3d    int isHidden =
8c30: 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28   IsHiddenColumn(
8c40: 70 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  pCol);.        i
8c50: 66 28 20 69 73 48 69 64 64 65 6e 20 26 26 20 70  f( isHidden && p
8c60: 50 72 61 67 6d 61 2d 3e 69 41 72 67 3d 3d 30 20  Pragma->iArg==0 
8c70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69  ){.          nHi
8c80: 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  dden++;.        
8c90: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8cb0: 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67  ( (pCol->colFlag
8cc0: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
8cd0: 4b 45 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  KEY)==0 ){.     
8ce0: 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20       k = 0;.    
8cf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
8d00: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
8d10: 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20    k = 1;.       
8d20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8d30: 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54    for(k=1; k<=pT
8d40: 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d  ab->nCol && pPk-
8d50: 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d  >aiColumn[k-1]!=
8d60: 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  i; k++){}.      
8d70: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
8d80: 72 74 28 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d  rt( pCol->pDflt=
8d90: 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c  =0 || pCol->pDfl
8da0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29  t->op==TK_SPAN )
8db0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8dc0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
8dd0: 2c 20 31 2c 20 70 50 72 61 67 6d 61 2d 3e 69 41  , 1, pPragma->iA
8de0: 72 67 20 3f 20 22 69 73 73 69 73 69 69 22 20 3a  rg ? "issisii" :
8df0: 20 22 69 73 73 69 73 69 22 2c 0a 20 20 20 20 20   "issisi",.     
8e00: 20 20 20 20 20 20 20 20 20 20 69 2d 6e 48 69 64            i-nHid
8e10: 64 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  den,.           
8e20: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c      pCol->zName,
8e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e40: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
8e50: 65 28 70 43 6f 6c 2c 22 22 29 2c 0a 20 20 20 20  e(pCol,""),.    
8e60: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
8e70: 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20 3a 20 30  >notNull ? 1 : 0
8e80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8e90: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3f 20 70   pCol->pDflt ? p
8ea0: 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54  Col->pDflt->u.zT
8eb0: 6f 6b 65 6e 20 3a 20 30 2c 0a 20 20 20 20 20 20  oken : 0,.      
8ec0: 20 20 20 20 20 20 20 20 20 6b 2c 0a 20 20 20 20           k,.    
8ed0: 20 20 20 20 20 20 20 20 20 20 20 69 73 48 69 64             isHid
8ee0: 64 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  den);.      }.  
8ef0: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
8f00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8f10: 44 45 42 55 47 0a 20 20 63 61 73 65 20 50 72 61  DEBUG.  case Pra
8f20: 67 54 79 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20  gTyp_STATS: {.  
8f30: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
8f40: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a     HashElem *i;.
8f50: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8f60: 20 3d 20 35 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 5;.    sqlite
8f70: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
8f80: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
8f90: 20 20 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65      for(i=sqlite
8fa0: 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
8fb0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
8fc0: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
8fd0: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
8fe0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8ff0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
9000: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9010: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9020: 20 31 2c 20 22 73 73 69 69 69 22 2c 0a 20 20 20   1, "ssiii",.   
9030: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
9040: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
9050: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  0,.           pT
9060: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20  ab->szTabRow,.  
9070: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
9080: 52 6f 77 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20  RowLogEst,.     
9090: 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
90a0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 66 6f 72  lags);.      for
90b0: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
90c0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
90d0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
90e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
90f0: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20  MultiLoad(v, 2, 
9100: 22 73 69 69 69 58 22 2c 0a 20 20 20 20 20 20 20  "siiiX",.       
9110: 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c      pIdx->zName,
9120: 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78  .           pIdx
9130: 2d 3e 73 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20  ->szIdxRow,.    
9140: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 52         pIdx->aiR
9150: 6f 77 4c 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20  owLogEst[0],.   
9160: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 68 61          pIdx->ha
9170: 73 53 74 61 74 31 29 3b 0a 20 20 20 20 20 20 20  sStat1);.       
9180: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9190: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
91a0: 6f 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20  ow, 1, 5);.     
91b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
91c0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  reak;.#endif..  
91d0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44  case PragTyp_IND
91e0: 45 58 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69  EX_INFO: if( zRi
91f0: 67 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ght ){.    Index
9200: 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c   *pIdx;.    Tabl
9210: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 49 64  e *pTab;.    pId
9220: 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
9230: 6e 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c  ndex(db, zRight,
9240: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
9250: 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Idx ){.      int
9260: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78   i;.      int mx
9270: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 61  ;.      if( pPra
9280: 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20  gma->iArg ){.   
9290: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69       /* PRAGMA i
92a0: 6e 64 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77 65  ndex_xinfo (newe
92b0: 72 20 76 65 72 73 69 6f 6e 20 77 69 74 68 20 6d  r version with m
92c0: 6f 72 65 20 72 6f 77 73 20 61 6e 64 20 63 6f 6c  ore rows and col
92d0: 75 6d 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20 20  umns) */.       
92e0: 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c   mx = pIdx->nCol
92f0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 50 61  umn;.        pPa
9300: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20  rse->nMem = 6;. 
9310: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9320: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
9330: 64 65 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63 79  dex_info (legacy
9340: 20 76 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20 20   version) */.   
9350: 20 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e       mx = pIdx->
9360: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nKeyCol;.       
9370: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9380: 33 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  3;.      }.     
9390: 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54   pTab = pIdx->pT
93a0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  able;.      sqli
93b0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
93c0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
93d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
93e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50  pParse->nMem<=pP
93f0: 72 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d  ragma->nPragCNam
9400: 65 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  e );.      for(i
9410: 3d 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a  =0; i<mx; i++){.
9420: 20 20 20 20 20 20 20 20 69 31 36 20 63 6e 75 6d          i16 cnum
9430: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
9440: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  n[i];.        sq
9450: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9460: 61 64 28 76 2c 20 31 2c 20 22 69 69 73 58 22 2c  ad(v, 1, "iisX",
9470: 20 69 2c 20 63 6e 75 6d 2c 0a 20 20 20 20 20 20   i, cnum,.      
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9490: 20 20 20 20 20 20 20 63 6e 75 6d 3c 30 20 3f 20         cnum<0 ? 
94a0: 30 20 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63  0 : pTab->aCol[c
94b0: 6e 75 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  num].zName);.   
94c0: 20 20 20 20 20 69 66 28 20 70 50 72 61 67 6d 61       if( pPragma
94d0: 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ->iArg ){.      
94e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
94f0: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 34 2c 20 22  ultiLoad(v, 4, "
9500: 69 73 69 58 22 2c 0a 20 20 20 20 20 20 20 20 20  isiX",.         
9510: 20 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72     pIdx->aSortOr
9520: 64 65 72 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  der[i],.        
9530: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
9540: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
9550: 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   i<pIdx->nKeyCol
9560: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9570: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9580: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
9590: 75 6c 74 52 6f 77 2c 20 31 2c 20 70 50 61 72 73  ultRow, 1, pPars
95a0: 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  e->nMem);.      
95b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
95c0: 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61  eak;..  case Pra
95d0: 67 54 79 70 5f 49 4e 44 45 58 5f 4c 49 53 54 3a  gTyp_INDEX_LIST:
95e0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
95f0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
9600: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
9610: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
9620: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
9630: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67  ndTable(db, zRig
9640: 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  ht, zDb);.    if
9650: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
9660: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35  pParse->nMem = 5
9670: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
9680: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
9690: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
96a0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
96b0: 62 2d 3e 70 49 6e 64 65 78 2c 20 69 3d 30 3b 20  b->pIndex, i=0; 
96c0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
96d0: 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  >pNext, i++){.  
96e0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
96f0: 20 2a 61 7a 4f 72 69 67 69 6e 5b 5d 20 3d 20 7b   *azOrigin[] = {
9700: 20 22 63 22 2c 20 22 75 22 2c 20 22 70 6b 22 20   "c", "u", "pk" 
9710: 7d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  };.        sqlit
9720: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
9730: 76 2c 20 31 2c 20 22 69 73 69 73 69 22 2c 0a 20  v, 1, "isisi",. 
9740: 20 20 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20            i,.   
9750: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 7a 4e          pIdx->zN
9760: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
9770: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
9780: 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dx),.           
9790: 61 7a 4f 72 69 67 69 6e 5b 70 49 64 78 2d 3e 69  azOrigin[pIdx->i
97a0: 64 78 54 79 70 65 5d 2c 0a 20 20 20 20 20 20 20  dxType],.       
97b0: 20 20 20 20 70 49 64 78 2d 3e 70 50 61 72 74 49      pIdx->pPartI
97c0: 64 78 57 68 65 72 65 21 3d 30 29 3b 0a 20 20 20  dxWhere!=0);.   
97d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
97e0: 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20   break;..  case 
97f0: 50 72 61 67 54 79 70 5f 44 41 54 41 42 41 53 45  PragTyp_DATABASE
9800: 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74  _LIST: {.    int
9810: 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   i;.    pParse->
9820: 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 66 6f  nMem = 3;.    fo
9830: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
9840: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
9850: 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
9860: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
9870: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
9880: 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
9890: 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  e!=0 );.      sq
98a0: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
98b0: 61 64 28 76 2c 20 31 2c 20 22 69 73 73 22 2c 0a  ad(v, 1, "iss",.
98c0: 20 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20           i,.    
98d0: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e       db->aDb[i].
98e0: 7a 44 62 53 4e 61 6d 65 2c 0a 20 20 20 20 20 20  zDbSName,.      
98f0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47     sqlite3BtreeG
9900: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
9910: 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20  Db[i].pBt));.   
9920: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9930: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9940: 43 4f 4c 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20  COLLATION_LIST: 
9950: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  {.    int i = 0;
9960: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
9970: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
9980: 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28  em = 2;.    for(
9990: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
99a0: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
99b0: 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73  ; p; p=sqliteHas
99c0: 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20  hNext(p)){.     
99d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
99e0: 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c  = (CollSeq *)sql
99f0: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
9a00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9a10: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9a20: 20 22 69 73 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c   "is", i++, pCol
9a30: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
9a40: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23  .  }.  break;..#
9a50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54  ifdef SQLITE_INT
9a60: 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d  ROSPECTION_PRAGM
9a70: 41 53 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  AS.  case PragTy
9a80: 70 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 3a  p_FUNCTION_LIST:
9a90: 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
9aa0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a 20    HashElem *j;. 
9ab0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20     FuncDef *p;. 
9ac0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9ad0: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 2;.    for(i=0
9ae0: 3b 20 69 3c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ; i<SQLITE_FUNC_
9af0: 48 41 53 48 5f 53 5a 3b 20 69 2b 2b 29 7b 0a 20  HASH_SZ; i++){. 
9b00: 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74       for(p=sqlit
9b10: 65 33 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f  e3BuiltinFunctio
9b20: 6e 73 2e 61 5b 69 5d 3b 20 70 3b 20 70 3d 70 2d  ns.a[i]; p; p=p-
9b30: 3e 75 2e 70 48 61 73 68 20 29 7b 0a 20 20 20 20  >u.pHash ){.    
9b40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9b50: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
9b60: 73 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 31  si", p->zName, 1
9b70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9b80: 0a 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74  .    for(j=sqlit
9b90: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
9ba0: 61 46 75 6e 63 29 3b 20 6a 3b 20 6a 3d 73 71 6c  aFunc); j; j=sql
9bb0: 69 74 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b  iteHashNext(j)){
9bc0: 0a 20 20 20 20 20 20 70 20 3d 20 28 46 75 6e 63  .      p = (Func
9bd0: 44 65 66 2a 29 73 71 6c 69 74 65 48 61 73 68 44  Def*)sqliteHashD
9be0: 61 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71  ata(j);.      sq
9bf0: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9c00: 61 64 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70  ad(v, 1, "si", p
9c10: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
9c20: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9c30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9c40: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9c50: 45 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  E.  case PragTyp
9c60: 5f 4d 4f 44 55 4c 45 5f 4c 49 53 54 3a 20 7b 0a  _MODULE_LIST: {.
9c70: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a 3b      HashElem *j;
9c80: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
9c90: 6d 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a  m = 1;.    for(j
9ca0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
9cb0: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20  (&db->aModule); 
9cc0: 6a 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e  j; j=sqliteHashN
9cd0: 65 78 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 4d  ext(j)){.      M
9ce0: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
9cf0: 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  odule*)sqliteHas
9d00: 68 44 61 74 61 28 6a 29 3b 0a 20 20 20 20 20 20  hData(j);.      
9d10: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9d20: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 22 2c 20  Load(v, 1, "s", 
9d30: 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pMod->zName);.  
9d40: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9d50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9d60: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
9d70: 42 4c 45 20 2a 2f 0a 0a 20 20 63 61 73 65 20 50  BLE */..  case P
9d80: 72 61 67 54 79 70 5f 50 52 41 47 4d 41 5f 4c 49  ragTyp_PRAGMA_LI
9d90: 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ST: {.    int i;
9da0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9db0: 41 72 72 61 79 53 69 7a 65 28 61 50 72 61 67 6d  ArraySize(aPragm
9dc0: 61 4e 61 6d 65 29 3b 20 69 2b 2b 29 7b 0a 20 20  aName); i++){.  
9dd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9de0: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
9df0: 73 22 2c 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b  s", aPragmaName[
9e00: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  i].zName);.    }
9e10: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
9e20: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
9e30: 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41  NTROSPECTION_PRA
9e40: 47 4d 41 53 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  GMAS */..#endif 
9e50: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
9e60: 43 48 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f  CHEMA_PRAGMAS */
9e70: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9e80: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
9e90: 59 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  Y.  case PragTyp
9ea0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49 53  _FOREIGN_KEY_LIS
9eb0: 54 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b  T: if( zRight ){
9ec0: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a  .    FKey *pFK;.
9ed0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
9ee0: 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
9ef0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
9f00: 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20   zRight, zDb);. 
9f10: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
9f20: 20 20 20 20 20 70 46 4b 20 3d 20 70 54 61 62 2d       pFK = pTab-
9f30: 3e 70 46 4b 65 79 3b 0a 20 20 20 20 20 20 69 66  >pFKey;.      if
9f40: 28 20 70 46 4b 20 29 7b 0a 20 20 20 20 20 20 20  ( pFK ){.       
9f50: 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20   int i = 0; .   
9f60: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
9f70: 6d 20 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 73  m = 8;.        s
9f80: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
9f90: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
9fa0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  Db);.        whi
9fb0: 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20 20 20 20  le(pFK){.       
9fc0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
9fd0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
9fe0: 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  FK->nCol; j++){.
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a000: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
a010: 28 76 2c 20 31 2c 20 22 69 69 73 73 73 73 73 73  (v, 1, "iissssss
a020: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
a030: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
a040: 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 0a 20              j,. 
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a060: 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20    pFK->zTo,.    
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
a080: 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61  Tab->aCol[pFK->a
a090: 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e  Col[j].iFrom].zN
a0a0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
a0b0: 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 61 43 6f          pFK->aCo
a0c0: 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20  l[j].zCol,.     
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
a0e0: 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41  tionName(pFK->aA
a0f0: 63 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f  ction[1]),  /* O
a100: 4e 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20 20  N UPDATE */.    
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
a120: 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61  ctionName(pFK->a
a130: 41 63 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20  Action[0]),  /* 
a140: 4f 4e 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20  ON DELETE */.   
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a160: 22 4e 4f 4e 45 22 29 3b 0a 20 20 20 20 20 20 20  "NONE");.       
a170: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2b     }.          +
a180: 2b 69 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46  +i;.          pF
a190: 4b 20 3d 20 70 46 4b 2d 3e 70 4e 65 78 74 46 72  K = pFK->pNextFr
a1a0: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  om;.        }.  
a1b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a1c0: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
a1d0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
a1e0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
a1f0: 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  KEY) */..#ifndef
a200: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
a210: 45 49 47 4e 5f 4b 45 59 0a 23 69 66 6e 64 65 66  EIGN_KEY.#ifndef
a220: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
a230: 47 47 45 52 0a 20 20 63 61 73 65 20 50 72 61 67  GGER.  case Prag
a240: 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f  Typ_FOREIGN_KEY_
a250: 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20 46 4b 65  CHECK: {.    FKe
a260: 79 20 2a 70 46 4b 3b 20 20 20 20 20 20 20 20 20  y *pFK;         
a270: 20 20 20 20 2f 2a 20 41 20 66 6f 72 65 69 67 6e      /* A foreign
a280: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
a290: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
a2a0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab;           /*
a2b0: 20 43 68 69 6c 64 20 74 61 62 6c 65 20 63 6f 6e   Child table con
a2c0: 74 61 69 6e 20 22 52 45 46 45 52 45 4e 43 45 53  tain "REFERENCES
a2d0: 22 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 20  " keyword */.   
a2e0: 20 54 61 62 6c 65 20 2a 70 50 61 72 65 6e 74 3b   Table *pParent;
a2f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e          /* Paren
a300: 74 20 74 61 62 6c 65 20 74 68 61 74 20 63 68 69  t table that chi
a310: 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a  ld points to */.
a320: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
a330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a340: 64 65 78 20 69 6e 20 74 68 65 20 70 61 72 65 6e  dex in the paren
a350: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  t table */.    i
a360: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
a370: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a380: 75 6e 74 65 72 3a 20 20 46 6f 72 65 69 67 6e 20  unter:  Foreign 
a390: 6b 65 79 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  key number for p
a3a0: 54 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  Tab */.    int j
a3b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a3c0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a3d0: 72 3a 20 20 46 69 65 6c 64 20 6f 66 20 74 68 65  r:  Field of the
a3e0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 2a 2f 0a   foreign key */.
a3f0: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b      HashElem *k;
a400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a410: 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 4e 65 78  op counter:  Nex
a420: 74 20 74 61 62 6c 65 20 69 6e 20 73 63 68 65 6d  t table in schem
a430: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 78 3b 20  a */.    int x; 
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 2f 2a 20 72 65 73 75 6c 74 20 76 61 72 69 61 62  /* result variab
a460: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  le */.    int re
a470: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
a480: 20 2f 2a 20 33 20 72 65 67 69 73 74 65 72 73 20   /* 3 registers 
a490: 74 6f 20 68 6f 6c 64 20 61 20 72 65 73 75 6c 74  to hold a result
a4a0: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
a4b0: 72 65 67 4b 65 79 3b 20 20 20 20 20 20 20 20 20  regKey;         
a4c0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
a4d0: 6f 20 68 6f 6c 64 20 6b 65 79 20 66 6f 72 20 63  o hold key for c
a4e0: 68 65 63 6b 69 6e 67 20 74 68 65 20 46 4b 20 2a  hecking the FK *
a4f0: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
a500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a510: 52 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  Registers to hol
a520: 64 20 61 20 72 6f 77 20 66 72 6f 6d 20 70 54 61  d a row from pTa
a530: 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  b */.    int add
a540: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
a550: 2f 2a 20 54 6f 70 20 6f 66 20 61 20 6c 6f 6f 70  /* Top of a loop
a560: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 65 69 67   checking foreig
a570: 6e 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20 69 6e  n keys */.    in
a580: 74 20 61 64 64 72 4f 6b 3b 20 20 20 20 20 20 20  t addrOk;       
a590: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
a5a0: 65 20 69 66 20 74 68 65 20 6b 65 79 20 69 73 20  e if the key is 
a5b0: 4f 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61  OK */.    int *a
a5c0: 69 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  iCols;          
a5d0: 20 2f 2a 20 63 68 69 6c 64 20 74 6f 20 70 61 72   /* child to par
a5e0: 65 6e 74 20 63 6f 6c 75 6d 6e 20 6d 61 70 70 69  ent column mappi
a5f0: 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52 65  ng */..    regRe
a600: 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
a610: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
a620: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20  e->nMem += 4;.  
a630: 20 20 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50 61    regKey = ++pPa
a640: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
a650: 65 67 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  egRow = ++pParse
a660: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
a670: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
a680: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
a690: 3b 0a 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65  ;.    k = sqlite
a6a0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
a6b0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
a6c0: 3e 74 62 6c 48 61 73 68 29 3b 0a 20 20 20 20 77  >tblHash);.    w
a6d0: 68 69 6c 65 28 20 6b 20 29 7b 0a 20 20 20 20 20  hile( k ){.     
a6e0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
a6f0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71         pTab = sq
a700: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
a710: 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 52 69 67  (pParse, 0, zRig
a720: 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  ht, zDb);.      
a730: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    k = 0;.      }
a740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
a750: 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
a760: 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
a770: 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69          k = sqli
a780: 74 65 48 61 73 68 4e 65 78 74 28 6b 29 3b 0a 20  teHashNext(k);. 
a790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a7a0: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 54 61 62   pTab==0 || pTab
a7b0: 2d 3e 70 46 4b 65 79 3d 3d 30 20 29 20 63 6f 6e  ->pFKey==0 ) con
a7c0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c  tinue;.      sql
a7d0: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
a7e0: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
a7f0: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
a800: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
a810: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 72 65 67  ( pTab->nCol+reg
a820: 52 6f 77 3e 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  Row>pParse->nMem
a830: 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   ) pParse->nMem 
a840: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b 20 72  = pTab->nCol + r
a850: 65 67 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  egRow;.      sql
a860: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
a870: 61 72 73 65 2c 20 30 2c 20 69 44 62 2c 20 70 54  arse, 0, iDb, pT
a880: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
a890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a8a0: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
a8b0: 20 72 65 67 52 65 73 75 6c 74 2c 20 70 54 61 62   regResult, pTab
a8c0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
a8d0: 66 6f 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61  for(i=1, pFK=pTa
a8e0: 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69  b->pFKey; pFK; i
a8f0: 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65  ++, pFK=pFK->pNe
a900: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20  xtFrom){.       
a910: 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74   pParent = sqlit
a920: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
a930: 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a  pFK->zTo, zDb);.
a940: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
a950: 65 6e 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ent==0 ) continu
a960: 65 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  e;.        pIdx 
a970: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
a980: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
a990: 61 72 73 65 2c 20 69 44 62 2c 20 70 50 61 72 65  arse, iDb, pPare
a9a0: 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 50 61  nt->tnum, 0, pPa
a9b0: 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  rent->zName);.  
a9c0: 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
a9d0: 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70  3FkLocateIndex(p
a9e0: 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
a9f0: 70 46 4b 2c 20 26 70 49 64 78 2c 20 30 29 3b 0a  pFK, &pIdx, 0);.
aa00: 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30          if( x==0
aa10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
aa20: 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
aa30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
aa40: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
aa50: 2c 20 69 2c 20 69 44 62 2c 20 70 50 61 72 65 6e  , i, iDb, pParen
aa60: 74 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  t, OP_OpenRead);
aa70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
aa80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
aa90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
aaa0: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
aab0: 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  i, pIdx->tnum, i
aac0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Db);.           
aad0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
aae0: 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
aaf0: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
ab00: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
ab10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d  e{.          k =
ab20: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   0;.          br
ab30: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
ab40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
ab50: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
ab60: 72 3e 30 20 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b  r>0 || pFK==0 );
ab70: 0a 20 20 20 20 20 20 69 66 28 20 70 46 4b 20 29  .      if( pFK )
ab80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
ab90: 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3c 69  ( pParse->nTab<i
aba0: 20 29 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20   ) pParse->nTab 
abb0: 3d 20 69 3b 0a 20 20 20 20 20 20 61 64 64 72 54  = i;.      addrT
abc0: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
abd0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
abe0: 69 6e 64 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ind, 0); VdbeCov
abf0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
ac00: 66 6f 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61  for(i=1, pFK=pTa
ac10: 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69  b->pFKey; pFK; i
ac20: 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65  ++, pFK=pFK->pNe
ac30: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20  xtFrom){.       
ac40: 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74   pParent = sqlit
ac50: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
ac60: 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a  pFK->zTo, zDb);.
ac70: 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30          pIdx = 0
ac80: 3b 0a 20 20 20 20 20 20 20 20 61 69 43 6f 6c 73  ;.        aiCols
ac90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
aca0: 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
acb0: 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74         x = sqlit
acc0: 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28  e3FkLocateIndex(
acd0: 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c  pParse, pParent,
ace0: 20 70 46 4b 2c 20 26 70 49 64 78 2c 20 26 61 69   pFK, &pIdx, &ai
acf0: 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 20 20 20  Cols);.         
ad00: 20 61 73 73 65 72 74 28 20 78 3d 3d 30 20 29 3b   assert( x==0 );
ad10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ad20: 20 20 20 61 64 64 72 4f 6b 20 3d 20 73 71 6c 69     addrOk = sqli
ad30: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
ad40: 28 76 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  (v);..        /*
ad50: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
ad60: 6f 20 72 65 61 64 20 74 68 65 20 63 68 69 6c 64  o read the child
ad70: 20 6b 65 79 20 76 61 6c 75 65 73 20 69 6e 74 6f   key values into
ad80: 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 20   registers.     
ad90: 20 20 20 2a 2a 20 72 65 67 52 6f 77 2e 2e 72 65     ** regRow..re
ada0: 67 52 6f 77 2b 6e 2e 20 49 66 20 61 6e 79 20 6f  gRow+n. If any o
adb0: 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20  f the child key 
adc0: 76 61 6c 75 65 73 20 61 72 65 20 4e 55 4c 4c 2c  values are NULL,
add0: 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a   this .        *
ade0: 2a 20 72 6f 77 20 63 61 6e 6e 6f 74 20 63 61 75  * row cannot cau
adf0: 73 65 20 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69  se an FK violati
ae00: 6f 6e 2e 20 4a 75 6d 70 20 64 69 72 65 63 74 6c  on. Jump directl
ae10: 79 20 74 6f 20 61 64 64 72 4f 6b 20 69 6e 20 0a  y to addrOk in .
ae20: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
ae30: 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  case. */.       
ae40: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d   for(j=0; j<pFK-
ae50: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
ae60: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
ae70: 3d 20 61 69 43 6f 6c 73 20 3f 20 61 69 43 6f 6c  = aiCols ? aiCol
ae80: 73 5b 6a 5d 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c  s[j] : pFK->aCol
ae90: 5b 6a 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20  [j].iFrom;.     
aea0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
aeb0: 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
aec0: 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 30 2c  able(v, pTab, 0,
aed0: 20 69 43 6f 6c 2c 20 72 65 67 52 6f 77 2b 6a 29   iCol, regRow+j)
aee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
aef0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
af00: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52   OP_IsNull, regR
af10: 6f 77 2b 6a 2c 20 61 64 64 72 4f 6b 29 3b 20 56  ow+j, addrOk); V
af20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
af30: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
af40: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
af50: 6f 64 65 20 74 6f 20 71 75 65 72 79 20 74 68 65  ode to query the
af60: 20 70 61 72 65 6e 74 20 69 6e 64 65 78 20 66 6f   parent index fo
af70: 72 20 61 20 6d 61 74 63 68 69 6e 67 20 70 61 72  r a matching par
af80: 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b  ent.        ** k
af90: 65 79 2e 20 49 66 20 61 20 6d 61 74 63 68 20 69  ey. If a match i
afa0: 73 20 66 6f 75 6e 64 2c 20 6a 75 6d 70 20 74 6f  s found, jump to
afb0: 20 61 64 64 72 4f 6b 2e 20 2a 2f 0a 20 20 20 20   addrOk. */.    
afc0: 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
afd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
afe0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
aff0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
b000: 67 52 6f 77 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 2c  gRow, pFK->nCol,
b010: 20 72 65 67 4b 65 79 2c 0a 20 20 20 20 20 20 20   regKey,.       
b020: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e         sqlite3In
b030: 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 64  dexAffinityStr(d
b040: 62 2c 70 49 64 78 29 2c 20 70 46 4b 2d 3e 6e 43  b,pIdx), pFK->nC
b050: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ol);.          s
b060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b070: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
b080: 20 69 2c 20 61 64 64 72 4f 6b 2c 20 72 65 67 4b   i, addrOk, regK
b090: 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ey, 0);.        
b0a0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b0b0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b0c0: 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a   if( pParent ){.
b0d0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d            int jm
b0e0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
b0f0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 3b  urrentAddr(v)+2;
b100: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b110: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b120: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 2c  OP_SeekRowid, i,
b130: 20 6a 6d 70 2c 20 72 65 67 52 6f 77 29 3b 20 56   jmp, regRow); V
b140: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b150: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b160: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
b170: 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rOk);.          
b180: 61 73 73 65 72 74 28 20 70 46 4b 2d 3e 6e 43 6f  assert( pFK->nCo
b190: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  l==1 );.        
b1a0: 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  }..        /* Ge
b1b0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
b1c0: 65 70 6f 72 74 20 61 6e 20 46 4b 20 76 69 6f 6c  eport an FK viol
b1d0: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c  ation to the cal
b1e0: 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ler. */.        
b1f0: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
b200: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
b210: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b220: 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30  2(v, OP_Rowid, 0
b230: 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a  , regResult+1);.
b240: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b250: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b260: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b270: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 65 73  _Null, 0, regRes
b280: 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ult+1);.        
b290: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
b2a0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
b2b0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 32 2c 20 22  , regResult+2, "
b2c0: 73 69 58 22 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20  siX", pFK->zTo, 
b2d0: 69 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  i-1);.        sq
b2e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b2f0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
b300: 20 72 65 67 52 65 73 75 6c 74 2c 20 34 29 3b 0a   regResult, 4);.
b310: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b320: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b330: 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20  v, addrOk);.    
b340: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b350: 65 28 64 62 2c 20 61 69 43 6f 6c 73 29 3b 0a 20  e(db, aiCols);. 
b360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
b370: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b380: 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 61 64  , OP_Next, 0, ad
b390: 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f  drTop+1); VdbeCo
b3a0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b3b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b3c0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29  Here(v, addrTop)
b3d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
b3e0: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  eak;.#endif /* !
b3f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b400: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a  MIT_TRIGGER) */.
b410: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
b420: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
b430: 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a  OREIGN_KEY) */..
b440: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
b450: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 41   case PragTyp_PA
b460: 52 53 45 52 5f 54 52 41 43 45 3a 20 7b 0a 20 20  RSER_TRACE: {.  
b470: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
b480: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
b490: 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67  3GetBoolean(zRig
b4a0: 68 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  ht, 0) ){.      
b4b0: 20 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 54    sqlite3ParserT
b4c0: 72 61 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61  race(stdout, "pa
b4d0: 72 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 20 20  rser: ");.      
b4e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b4f0: 71 6c 69 74 65 33 50 61 72 73 65 72 54 72 61 63  qlite3ParserTrac
b500: 65 28 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  e(0, 0);.      }
b510: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
b520: 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ak;.#endif..  /*
b530: 20 52 65 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c   Reinstall the L
b540: 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e  IKE and GLOB fun
b550: 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 76 61 72  ctions.  The var
b560: 69 61 6e 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a  iant of LIKE.  *
b570: 2a 20 75 73 65 64 20 77 69 6c 6c 20 62 65 20 63  * used will be c
b580: 61 73 65 20 73 65 6e 73 69 74 69 76 65 20 6f 72  ase sensitive or
b590: 20 6e 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f   not depending o
b5a0: 6e 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a  n the RHS..  */.
b5b0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
b5c0: 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49  ASE_SENSITIVE_LI
b5d0: 4b 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  KE: {.    if( zR
b5e0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
b5f0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b  lite3RegisterLik
b600: 65 46 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73  eFunctions(db, s
b610: 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e  qlite3GetBoolean
b620: 28 7a 52 69 67 68 74 2c 20 30 29 29 3b 0a 20 20  (zRight, 0));.  
b630: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
b640: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b650: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
b660: 5f 45 52 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66  _ERROR_MAX.# def
b670: 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ine SQLITE_INTEG
b680: 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52  RITY_CHECK_ERROR
b690: 5f 4d 41 58 20 31 30 30 0a 23 65 6e 64 69 66 0a  _MAX 100.#endif.
b6a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b6b0: 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
b6c0: 48 45 43 4b 0a 20 20 2f 2a 20 20 20 20 50 52 41  HECK.  /*    PRA
b6d0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
b6e0: 65 63 6b 0a 20 20 2a 2a 20 20 20 20 50 52 41 47  eck.  **    PRAG
b6f0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
b700: 63 6b 28 4e 29 0a 20 20 2a 2a 20 20 20 20 50 52  ck(N).  **    PR
b710: 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b  AGMA quick_check
b720: 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20  .  **    PRAGMA 
b730: 71 75 69 63 6b 5f 63 68 65 63 6b 28 4e 29 0a 20  quick_check(N). 
b740: 20 2a 2a 0a 20 20 2a 2a 20 56 65 72 69 66 79 20   **.  ** Verify 
b750: 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
b760: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
b770: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 71 75   **.  ** The "qu
b780: 69 63 6b 5f 63 68 65 63 6b 22 20 69 73 20 72 65  ick_check" is re
b790: 64 75 63 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  duced version of
b7a0: 20 0a 20 20 2a 2a 20 69 6e 74 65 67 72 69 74 79   .  ** integrity
b7b0: 5f 63 68 65 63 6b 20 64 65 73 69 67 6e 65 64 20  _check designed 
b7c0: 74 6f 20 64 65 74 65 63 74 20 6d 6f 73 74 20 64  to detect most d
b7d0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
b7e0: 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  on.  ** without 
b7f0: 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
b800: 63 72 6f 73 73 2d 63 68 65 63 6b 69 6e 67 20 69  cross-checking i
b810: 6e 64 65 78 65 73 2e 20 20 51 75 69 63 6b 5f 63  ndexes.  Quick_c
b820: 68 65 63 6b 0a 20 20 2a 2a 20 69 73 20 6c 69 6e  heck.  ** is lin
b830: 65 61 72 20 74 69 6d 65 20 77 68 65 72 65 61 73  ear time whereas
b840: 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  e integrity_chec
b850: 6b 20 69 73 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20  k is O(NlogN).. 
b860: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
b870: 79 70 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  yp_INTEGRITY_CHE
b880: 43 4b 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c  CK: {.    int i,
b890: 20 6a 2c 20 61 64 64 72 2c 20 6d 78 45 72 72 3b   j, addr, mxErr;
b8a0: 0a 0a 20 20 20 20 69 6e 74 20 69 73 51 75 69 63  ..    int isQuic
b8b0: 6b 20 3d 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f  k = (sqlite3Tolo
b8c0: 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27  wer(zLeft[0])=='
b8d0: 71 27 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  q');..    /* If 
b8e0: 74 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61  the PRAGMA comma
b8f0: 6e 64 20 77 61 73 20 6f 66 20 74 68 65 20 66 6f  nd was of the fo
b900: 72 6d 20 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e  rm "PRAGMA <db>.
b910: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22  integrity_check"
b920: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 69 44  ,.    ** then iD
b930: 62 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  b is set to the 
b940: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
b950: 61 62 61 73 65 20 69 64 65 6e 74 69 66 69 65 64  abase identified
b960: 20 62 79 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a   by <db>..    **
b970: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
b980: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
b990: 64 61 74 61 62 61 73 65 20 69 44 62 20 6f 6e 6c  database iDb onl
b9a0: 79 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79  y is verified by
b9b0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 56 44 42 45  .    ** the VDBE
b9c0: 20 63 72 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a   created below..
b9d0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74      **.    ** Ot
b9e0: 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
b9f0: 63 6f 6d 6d 61 6e 64 20 77 61 73 20 73 69 6d 70  command was simp
ba00: 6c 79 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67  ly "PRAGMA integ
ba10: 72 69 74 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a  rity_check" (or.
ba20: 20 20 20 20 2a 2a 20 22 50 52 41 47 4d 41 20 71      ** "PRAGMA q
ba30: 75 69 63 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68  uick_check"), th
ba40: 65 6e 20 69 44 62 20 69 73 20 73 65 74 20 74 6f  en iDb is set to
ba50: 20 30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65   0. In this case
ba60: 2c 20 73 65 74 20 69 44 62 0a 20 20 20 20 2a 2a  , set iDb.    **
ba70: 20 74 6f 20 2d 31 20 68 65 72 65 2c 20 74 6f 20   to -1 here, to 
ba80: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
ba90: 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 76 65  e VDBE should ve
baa0: 72 69 66 79 20 74 68 65 20 69 6e 74 65 67 72 69  rify the integri
bab0: 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c  ty.    ** of all
bac0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
bad0: 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ses.  */.    ass
bae0: 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20  ert( iDb>=0 );. 
baf0: 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d     assert( iDb==
bb00: 30 20 7c 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a  0 || pId2->z );.
bb10: 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d      if( pId2->z=
bb20: 3d 30 20 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a  =0 ) iDb = -1;..
bb30: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
bb40: 65 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  e the VDBE progr
bb50: 61 6d 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65  am */.    pParse
bb60: 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20  ->nMem = 6;..   
bb70: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69   /* Set the maxi
bb80: 6d 75 6d 20 65 72 72 6f 72 20 63 6f 75 6e 74 20  mum error count 
bb90: 2a 2f 0a 20 20 20 20 6d 78 45 72 72 20 3d 20 53  */.    mxErr = S
bba0: 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f  QLITE_INTEGRITY_
bbb0: 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b  CHECK_ERROR_MAX;
bbc0: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
bbd0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
bbe0: 47 65 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c  GetInt32(zRight,
bbf0: 20 26 6d 78 45 72 72 29 3b 0a 20 20 20 20 20 20   &mxErr);.      
bc00: 69 66 28 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a  if( mxErr<=0 ){.
bc10: 20 20 20 20 20 20 20 20 6d 78 45 72 72 20 3d 20          mxErr = 
bc20: 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59  SQLITE_INTEGRITY
bc30: 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58  _CHECK_ERROR_MAX
bc40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bc50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bc60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
bc70: 67 65 72 2c 20 6d 78 45 72 72 2d 31 2c 20 31 29  ger, mxErr-1, 1)
bc80: 3b 20 2f 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64  ; /* reg[1] hold
bc90: 73 20 65 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f  s errors left */
bca0: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69  ..    /* Do an i
bcb0: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f  ntegrity check o
bcc0: 6e 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  n each database 
bcd0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  file */.    for(
bce0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
bcf0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 48 61 73 68  i++){.      Hash
bd00: 45 6c 65 6d 20 2a 78 3b 20 20 20 20 20 2f 2a 20  Elem *x;     /* 
bd10: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
bd20: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73   tables in the s
bd30: 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 20 20 48  chema */.      H
bd40: 61 73 68 20 2a 70 54 62 6c 73 3b 20 20 20 20 20  ash *pTbls;     
bd50: 2f 2a 20 53 65 74 20 6f 66 20 61 6c 6c 20 74 61  /* Set of all ta
bd60: 62 6c 65 73 20 69 6e 20 74 68 65 20 73 63 68 65  bles in the sche
bd70: 6d 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ma */.      int 
bd80: 2a 61 52 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20  *aRoot;      /* 
bd90: 41 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61  Array of root pa
bda0: 67 65 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c  ge numbers of al
bdb0: 6c 20 62 74 72 65 65 73 20 2a 2f 0a 20 20 20 20  l btrees */.    
bdc0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20    int cnt = 0;  
bdd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bde0: 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74  entries in aRoot
bdf0: 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  [] */.      int 
be00: 6d 78 49 64 78 20 3d 20 30 3b 20 20 20 2f 2a 20  mxIdx = 0;   /* 
be10: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
be20: 66 20 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e  f indexes for an
be30: 79 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  y table */..    
be40: 20 20 69 66 28 20 4f 4d 49 54 5f 54 45 4d 50 44    if( OMIT_TEMPD
be50: 42 20 26 26 20 69 3d 3d 31 20 29 20 63 6f 6e 74  B && i==1 ) cont
be60: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
be70: 69 44 62 3e 3d 30 20 26 26 20 69 21 3d 69 44 62  iDb>=0 && i!=iDb
be80: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
be90: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
bea0: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
beb0: 73 65 2c 20 69 29 3b 0a 0a 20 20 20 20 20 20 2f  se, i);..      /
bec0: 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69 74  * Do an integrit
bed0: 79 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 42  y check of the B
bee0: 2d 54 72 65 65 0a 20 20 20 20 20 20 2a 2a 0a 20  -Tree.      **. 
bef0: 20 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 62 79       ** Begin by
bf00: 20 66 69 6e 64 69 6e 67 20 74 68 65 20 72 6f 6f   finding the roo
bf10: 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 0a  t pages numbers.
bf20: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c        ** for all
bf30: 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69   tables and indi
bf40: 63 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ces in the datab
bf50: 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
bf60: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
bf70: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
bf80: 6c 64 28 64 62 2c 20 69 2c 20 30 29 20 29 3b 0a  ld(db, i, 0) );.
bf90: 20 20 20 20 20 20 70 54 62 6c 73 20 3d 20 26 64        pTbls = &d
bfa0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
bfb0: 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20  a->tblHash;.    
bfc0: 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73    for(cnt=0, x=s
bfd0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
bfe0: 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69  Tbls); x; x=sqli
bff0: 74 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a  teHashNext(x)){.
c000: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
c010: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
c020: 44 61 74 61 28 78 29 3b 20 20 2f 2a 20 43 75 72  Data(x);  /* Cur
c030: 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
c040: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
c050: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
c060: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
c070: 64 65 78 20 6f 6e 20 70 54 61 62 20 2a 2f 0a 20  dex on pTab */. 
c080: 20 20 20 20 20 20 20 69 6e 74 20 6e 49 64 78 3b         int nIdx;
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c0b0: 65 72 20 6f 66 20 69 6e 64 65 78 65 73 20 6f 6e  er of indexes on
c0c0: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 20   pTab */.       
c0d0: 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
c0e0: 61 62 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20  ab) ) cnt++;.   
c0f0: 20 20 20 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c       for(nIdx=0,
c100: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
c110: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
c120: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78  Idx->pNext, nIdx
c130: 2b 2b 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20  ++){ cnt++; }.  
c140: 20 20 20 20 20 20 69 66 28 20 6e 49 64 78 3e 6d        if( nIdx>m
c150: 78 49 64 78 20 29 20 6d 78 49 64 78 20 3d 20 6e  xIdx ) mxIdx = n
c160: 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
c170: 20 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74     aRoot = sqlit
c180: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
c190: 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
c1a0: 28 63 6e 74 2b 31 29 29 3b 0a 20 20 20 20 20 20  (cnt+1));.      
c1b0: 69 66 28 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62  if( aRoot==0 ) b
c1c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
c1d0: 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48  cnt=0, x=sqliteH
c1e0: 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b  ashFirst(pTbls);
c1f0: 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68   x; x=sqliteHash
c200: 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20  Next(x)){.      
c210: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c220: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78  sqliteHashData(x
c230: 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  );.        Index
c240: 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20   *pIdx;.        
c250: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
c260: 62 29 20 29 20 61 52 6f 6f 74 5b 2b 2b 63 6e 74  b) ) aRoot[++cnt
c270: 5d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  ] = pTab->tnum;.
c280: 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
c290: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
c2a0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
c2b0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
c2c0: 20 20 61 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20 3d    aRoot[++cnt] =
c2d0: 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pIdx->tnum;.   
c2e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c2f0: 20 20 20 20 20 61 52 6f 6f 74 5b 30 5d 20 3d 20       aRoot[0] = 
c300: 63 6e 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  cnt;..      /* M
c310: 61 6b 65 20 73 75 72 65 20 73 75 66 66 69 63 69  ake sure suffici
c320: 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ent number of re
c330: 67 69 73 74 65 72 73 20 68 61 76 65 20 62 65 65  gisters have bee
c340: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
c350: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
c360: 6d 20 3d 20 4d 41 58 28 20 70 50 61 72 73 65 2d  m = MAX( pParse-
c370: 3e 6e 4d 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29  >nMem, 8+mxIdx )
c380: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
c390: 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
c3a0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
c3b0: 20 2f 2a 20 44 6f 20 74 68 65 20 62 2d 74 72 65   /* Do the b-tre
c3c0: 65 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  e integrity chec
c3d0: 6b 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ks */.      sqli
c3e0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
c3f0: 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c   OP_IntegrityCk,
c400: 20 32 2c 20 63 6e 74 2c 20 31 2c 20 28 63 68 61   2, cnt, 1, (cha
c410: 72 2a 29 61 52 6f 6f 74 2c 50 34 5f 49 4e 54 41  r*)aRoot,P4_INTA
c420: 52 52 41 59 29 3b 0a 20 20 20 20 20 20 73 71 6c  RRAY);.      sql
c430: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
c440: 28 76 2c 20 28 75 38 29 69 29 3b 0a 20 20 20 20  (v, (u8)i);.    
c450: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
c460: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
c470: 5f 49 73 4e 75 6c 6c 2c 20 32 29 3b 20 56 64 62  _IsNull, 2); Vdb
c480: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c490: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c4a0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
c4b0: 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 0a 20 20  ng8, 0, 3, 0,.  
c4c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
c4d0: 72 69 6e 74 66 28 64 62 2c 20 22 2a 2a 2a 20 69  rintf(db, "*** i
c4e0: 6e 20 64 61 74 61 62 61 73 65 20 25 73 20 2a 2a  n database %s **
c4f0: 2a 5c 6e 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d  *\n", db->aDb[i]
c500: 2e 7a 44 62 53 4e 61 6d 65 29 2c 0a 20 20 20 20  .zDbSName),.    
c510: 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29       P4_DYNAMIC)
c520: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c530: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c540: 43 6f 6e 63 61 74 2c 20 32 2c 20 33 2c 20 33 29  Concat, 2, 3, 3)
c550: 3b 0a 20 20 20 20 20 20 69 6e 74 65 67 72 69 74  ;.      integrit
c560: 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28  yCheckResultRow(
c570: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
c580: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
c590: 20 61 64 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f   addr);..      /
c5a0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
c5b0: 74 68 65 20 69 6e 64 69 63 65 73 20 61 72 65 20  the indices are 
c5c0: 63 6f 6e 73 74 72 75 63 74 65 64 20 63 6f 72 72  constructed corr
c5d0: 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  ectly..      */.
c5e0: 20 20 20 20 20 20 66 6f 72 28 78 3d 73 71 6c 69        for(x=sqli
c5f0: 74 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c  teHashFirst(pTbl
c600: 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48  s); x; x=sqliteH
c610: 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20  ashNext(x)){.   
c620: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
c630: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
c640: 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e  a(x);.        In
c650: 64 65 78 20 2a 70 49 64 78 2c 20 2a 70 50 6b 3b  dex *pIdx, *pPk;
c660: 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
c670: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
c680: 20 20 20 20 69 6e 74 20 6c 6f 6f 70 54 6f 70 3b      int loopTop;
c690: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 61  .        int iDa
c6a0: 74 61 43 75 72 2c 20 69 49 64 78 43 75 72 3b 0a  taCur, iIdxCur;.
c6b0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
c6c0: 20 2d 31 3b 0a 0a 20 20 20 20 20 20 20 20 69 66   -1;..        if
c6d0: 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3c 31 20 29  ( pTab->tnum<1 )
c6e0: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 53   continue;  /* S
c6f0: 6b 69 70 20 56 49 45 57 73 20 6f 72 20 56 49 52  kip VIEWs or VIR
c700: 54 55 41 4c 20 54 41 42 4c 45 73 20 2a 2f 0a 20  TUAL TABLEs */. 
c710: 20 20 20 20 20 20 20 70 50 6b 20 3d 20 48 61 73         pPk = Has
c720: 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20 30 20  Rowid(pTab) ? 0 
c730: 3a 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  : sqlite3Primary
c740: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
c750: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
c760: 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63  penTableAndIndic
c770: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  es(pParse, pTab,
c780: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 30 2c   OP_OpenRead, 0,
c790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 20 20 20 20 31 2c 20 30 2c 20 26 69 44 61 74 61      1, 0, &iData
c7c0: 43 75 72 2c 20 26 69 49 64 78 43 75 72 29 3b 0a  Cur, &iIdxCur);.
c7d0: 20 20 20 20 20 20 20 20 2f 2a 20 72 65 67 5b 37          /* reg[7
c7e0: 5d 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d  ] counts the num
c7f0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
c800: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  n the table..   
c810: 20 20 20 20 20 2a 2a 20 72 65 67 5b 38 2b 69 5d       ** reg[8+i]
c820: 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62   counts the numb
c830: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
c840: 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   the i-th index 
c850: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
c860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c870: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
c880: 67 65 72 2c 20 30 2c 20 37 29 3b 0a 20 20 20 20  ger, 0, 7);.    
c890: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64      for(j=0, pId
c8a0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
c8b0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
c8c0: 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20  >pNext, j++){.  
c8d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c8e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c8f0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 38 2b 6a 29  Integer, 0, 8+j)
c900: 3b 20 2f 2a 20 69 6e 64 65 78 20 65 6e 74 72 69  ; /* index entri
c910: 65 73 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  es counter */.  
c920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c930: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
c940: 6e 4d 65 6d 3e 3d 38 2b 6a 20 29 3b 0a 20 20 20  nMem>=8+j );.   
c950: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
c960: 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e  ite3NoTempsInRan
c970: 67 65 28 70 50 61 72 73 65 2c 31 2c 37 2b 6a 29  ge(pParse,1,7+j)
c980: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
c990: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c9a0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44 61 74   OP_Rewind, iDat
c9b0: 61 43 75 72 2c 20 30 29 3b 20 56 64 62 65 43 6f  aCur, 0); VdbeCo
c9c0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
c9d0: 20 20 20 6c 6f 6f 70 54 6f 70 20 3d 20 73 71 6c     loopTop = sql
c9e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c9f0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 37 2c 20  , OP_AddImm, 7, 
ca00: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
ca10: 21 69 73 51 75 69 63 6b 20 29 7b 0a 20 20 20 20  !isQuick ){.    
ca20: 20 20 20 20 20 20 2f 2a 20 53 61 6e 69 74 79 20        /* Sanity 
ca30: 63 68 65 63 6b 20 6f 6e 20 72 65 63 6f 72 64 20  check on record 
ca40: 68 65 61 64 65 72 20 64 65 63 6f 64 69 6e 67 20  header decoding 
ca50: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
ca60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ca70: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 44 61  , OP_Column, iDa
ca80: 74 61 43 75 72 2c 20 70 54 61 62 2d 3e 6e 43 6f  taCur, pTab->nCo
ca90: 6c 2d 31 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  l-1, 3);.       
caa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
cab0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
cac0: 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20  _TYPEOFARG);.   
cad0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
cae0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c  * Verify that al
caf0: 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  l NOT NULL colum
cb00: 6e 73 20 72 65 61 6c 6c 79 20 61 72 65 20 4e 4f  ns really are NO
cb10: 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  T NULL */.      
cb20: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
cb30: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
cb40: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
cb50: 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Err;.          i
cb60: 6e 74 20 6a 6d 70 32 3b 0a 20 20 20 20 20 20 20  nt jmp2;.       
cb70: 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e     if( j==pTab->
cb80: 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65  iPKey ) continue
cb90: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
cba0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f  pTab->aCol[j].no
cbb0: 74 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e 74 69  tNull==0 ) conti
cbc0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nue;.          s
cbd0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
cbe0: 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
cbf0: 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43 75 72  , pTab, iDataCur
cc00: 2c 20 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , j, 3);.       
cc10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
cc20: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
cc30: 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20  _TYPEOFARG);.   
cc40: 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71         jmp2 = sq
cc50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
cc60: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 33  v, OP_NotNull, 3
cc70: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
cc80: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 45  v);.          zE
cc90: 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  rr = sqlite3MPri
cca0: 6e 74 66 28 64 62 2c 20 22 4e 55 4c 4c 20 76 61  ntf(db, "NULL va
ccb0: 6c 75 65 20 69 6e 20 25 73 2e 25 73 22 2c 20 70  lue in %s.%s", p
ccc0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
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 70 54 61 62 2d 3e            pTab->
ccf0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[j].zName);.
cd00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cd10: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
cd20: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c  P_String8, 0, 3,
cd30: 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e   0, zErr, P4_DYN
cd40: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  AMIC);.         
cd50: 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52   integrityCheckR
cd60: 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20  esultRow(v);.   
cd70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cd80: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
cd90: 70 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  p2);.        }. 
cda0: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
cdb0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
cdc0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ts */.        if
cdd0: 28 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 26  ( pTab->pCheck &
cde0: 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
cdf0: 51 4c 49 54 45 5f 49 67 6e 6f 72 65 43 68 65 63  QLITE_IgnoreChec
ce00: 6b 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ks)==0 ){.      
ce10: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43      ExprList *pC
ce20: 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
ce30: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 54  prListDup(db, pT
ce40: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 30 29 3b 0a  ab->pCheck, 0);.
ce50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
ce60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
ce70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
ce80: 20 69 6e 74 20 61 64 64 72 43 6b 46 61 75 6c 74   int addrCkFault
ce90: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
cea0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
ceb0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
cec0: 43 6b 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  CkOk = sqlite3Vd
ced0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
cef0: 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20   *zErr;.        
cf00: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
cf10: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69         pParse->i
cf20: 53 65 6c 66 54 61 62 20 3d 20 69 44 61 74 61 43  SelfTab = iDataC
cf30: 75 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  ur + 1;.        
cf40: 20 20 20 20 66 6f 72 28 6b 3d 70 43 68 65 63 6b      for(k=pCheck
cf50: 2d 3e 6e 45 78 70 72 2d 31 3b 20 6b 3e 30 3b 20  ->nExpr-1; k>0; 
cf60: 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k--){.          
cf70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
cf80: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
cf90: 43 68 65 63 6b 2d 3e 61 5b 6b 5d 2e 70 45 78 70  Check->a[k].pExp
cfa0: 72 2c 20 61 64 64 72 43 6b 46 61 75 6c 74 2c 20  r, addrCkFault, 
cfb0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
cfc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
cfd0: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
cfe0: 70 50 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e  pParse, pCheck->
cff0: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 64 64 72  a[0].pExpr, addr
d000: 43 6b 4f 6b 2c 20 0a 20 20 20 20 20 20 20 20 20  CkOk, .         
d010: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55         SQLITE_JU
d020: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
d030: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d040: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d050: 2c 20 61 64 64 72 43 6b 46 61 75 6c 74 29 3b 0a  , addrCkFault);.
d060: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
d070: 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30  se->iSelfTab = 0
d080: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 45  ;.            zE
d090: 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  rr = sqlite3MPri
d0a0: 6e 74 66 28 64 62 2c 20 22 43 48 45 43 4b 20 63  ntf(db, "CHECK c
d0b0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
d0c0: 20 69 6e 20 25 73 22 2c 0a 20 20 20 20 20 20 20   in %s",.       
d0d0: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
d0e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
d0f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d100: 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
d110: 67 38 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72  g8, 0, 3, 0, zEr
d120: 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  r, P4_DYNAMIC);.
d130: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65              inte
d140: 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74  grityCheckResult
d150: 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20 20 20  Row(v);.        
d160: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
d170: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
d180: 64 64 72 43 6b 4f 6b 29 3b 0a 20 20 20 20 20 20  ddrCkOk);.      
d190: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d1a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
d1b0: 65 6c 65 74 65 28 64 62 2c 20 70 43 68 65 63 6b  elete(db, pCheck
d1c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d1d0: 20 20 20 20 20 69 66 28 20 21 69 73 51 75 69 63       if( !isQuic
d1e0: 6b 20 29 7b 20 2f 2a 20 4f 6d 69 74 20 74 68 65  k ){ /* Omit the
d1f0: 20 72 65 6d 61 69 6e 69 6e 67 20 74 65 73 74 73   remaining tests
d200: 20 66 6f 72 20 71 75 69 63 6b 5f 63 68 65 63 6b   for quick_check
d210: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   */.          /*
d220: 20 56 61 6c 69 64 61 74 65 20 69 6e 64 65 78 20   Validate index 
d230: 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
d240: 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20  current row */. 
d250: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
d260: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
d270: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
d280: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b  pIdx->pNext, j++
d290: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
d2a0: 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20 6a  nt jmp2, jmp3, j
d2b0: 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20 20 20 20 20  mp4, jmp5;.     
d2c0: 20 20 20 20 20 20 20 69 6e 74 20 63 6b 55 6e 69         int ckUni
d2d0: 71 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  q = sqlite3VdbeM
d2e0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
d2f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6b           if( pPk
d300: 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75  ==pIdx ) continu
d310: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e;.            r
d320: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72  1 = sqlite3Gener
d330: 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
d340: 73 65 2c 20 70 49 64 78 2c 20 69 44 61 74 61 43  se, pIdx, iDataC
d350: 75 72 2c 20 30 2c 20 30 2c 20 26 6a 6d 70 33 2c  ur, 0, 0, &jmp3,
d360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72            pPrior
d390: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
d3a0: 20 20 20 70 50 72 69 6f 72 20 3d 20 70 49 64 78     pPrior = pIdx
d3b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d3c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d3d0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 38 2b  v, OP_AddImm, 8+
d3e0: 6a 2c 20 31 29 3b 2f 2a 20 69 6e 63 72 65 6d 65  j, 1);/* increme
d3f0: 6e 74 20 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a  nt entry count *
d400: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  /.            /*
d410: 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6e 20   Verify that an 
d420: 69 6e 64 65 78 20 65 6e 74 72 79 20 65 78 69 73  index entry exis
d430: 74 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ts for the curre
d440: 6e 74 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a  nt table row */.
d450: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 32              jmp2
d460: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d470: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
d480: 75 6e 64 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20  und, iIdxCur+j, 
d490: 63 6b 55 6e 69 71 2c 20 72 31 2c 0a 20 20 20 20  ckUniq, r1,.    
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d      pIdx->nColum
d4d0: 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  n); VdbeCoverage
d4e0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
d500: 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 72 6f  String(v, 3, "ro
d510: 77 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  w ");.          
d520: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d530: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
d540: 2c 20 37 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20  , 7, 3, 3);.    
d550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d560: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
d570: 20 34 2c 20 22 20 6d 69 73 73 69 6e 67 20 66 72   4, " missing fr
d580: 6f 6d 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20  om index ");.   
d590: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d5a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d5b0: 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33  _Concat, 4, 3, 3
d5c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
d5d0: 6d 70 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mp5 = sqlite3Vdb
d5e0: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34  eLoadString(v, 4
d5f0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pIdx->zName);.
d600: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d610: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d620: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33   OP_Concat, 4, 3
d630: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
d640: 20 20 6a 6d 70 34 20 3d 20 69 6e 74 65 67 72 69    jmp4 = integri
d650: 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77  tyCheckResultRow
d660: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d670: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d680: 48 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20  Here(v, jmp2);. 
d690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
d6a0: 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 65 73  r UNIQUE indexes
d6b0: 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 6f 6e  , verify that on
d6c0: 6c 79 20 6f 6e 65 20 65 6e 74 72 79 20 65 78 69  ly one entry exi
d6d0: 73 74 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  sts with the.   
d6e0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72           ** curr
d6f0: 65 6e 74 20 6b 65 79 2e 20 20 54 68 65 20 65 6e  ent key.  The en
d700: 74 72 79 20 69 73 20 75 6e 69 71 75 65 20 69 66  try is unique if
d710: 20 28 31 29 20 61 6e 79 20 63 6f 6c 75 6d 6e 20   (1) any column 
d720: 69 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20  is NULL.        
d730: 20 20 20 20 2a 2a 20 6f 72 20 28 32 29 20 74 68      ** or (2) th
d740: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 68 61 73  e next entry has
d750: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 65 79   a different key
d760: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
d770: 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  if( IsUniqueInde
d780: 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  x(pIdx) ){.     
d790: 20 20 20 20 20 20 20 20 20 69 6e 74 20 75 6e 69           int uni
d7a0: 71 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  qOk = sqlite3Vdb
d7b0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
d7d0: 20 6a 6d 70 36 3b 0a 20 20 20 20 20 20 20 20 20   jmp6;.         
d7e0: 20 20 20 20 20 69 6e 74 20 6b 6b 3b 0a 20 20 20       int kk;.   
d7f0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
d800: 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78 2d 3e 6e 4b  k=0; kk<pIdx->nK
d810: 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20 20  eyCol; kk++){.  
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d830: 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61  t iCol = pIdx->a
d840: 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20 20  iColumn[kk];.   
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
d860: 65 72 74 28 20 69 43 6f 6c 21 3d 58 4e 5f 52 4f  ert( iCol!=XN_RO
d870: 57 49 44 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  WID && iCol<pTab
d880: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
d890: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
d8a0: 6f 6c 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e 61  ol>=0 && pTab->a
d8b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c  Col[iCol].notNul
d8c0: 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
d8e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d8f0: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31  v, OP_IsNull, r1
d900: 2b 6b 6b 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20  +kk, uniqOk);.  
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
d920: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70               jmp
d950: 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  6 = sqlite3VdbeA
d960: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp1(v, OP_Next
d970: 2c 20 69 49 64 78 43 75 72 2b 6a 29 3b 20 56 64  , iIdxCur+j); Vd
d980: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
d9a0: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
d9b0: 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20  uniqOk);.       
d9c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d9d0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
d9e0: 70 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p6);.           
d9f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
da00: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
da10: 78 47 54 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20  xGT, iIdxCur+j, 
da20: 75 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20 20 20 20  uniqOk, r1,.    
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
da50: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56  Idx->nKeyCol); V
da60: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
da80: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
da90: 69 6e 67 28 76 2c 20 33 2c 20 22 6e 6f 6e 2d 75  ing(v, 3, "non-u
daa0: 6e 69 71 75 65 20 65 6e 74 72 79 20 69 6e 20 69  nique entry in i
dab0: 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20  ndex ");.       
dac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dad0: 62 65 47 6f 74 6f 28 76 2c 20 6a 6d 70 35 29 3b  beGoto(v, jmp5);
dae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
daf0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
db00: 65 4c 61 62 65 6c 28 76 2c 20 75 6e 69 71 4f 6b  eLabel(v, uniqOk
db10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
db20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
db30: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
db40: 28 76 2c 20 6a 6d 70 34 29 3b 0a 20 20 20 20 20  (v, jmp4);.     
db50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
db60: 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65  solvePartIdxLabe
db70: 6c 28 70 50 61 72 73 65 2c 20 6a 6d 70 33 29 3b  l(pParse, jmp3);
db80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
db90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
dba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dbb0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 44 61  (v, OP_Next, iDa
dbc0: 74 61 43 75 72 2c 20 6c 6f 6f 70 54 6f 70 29 3b  taCur, loopTop);
dbd0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
dbe0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
dbf0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
dc00: 20 6c 6f 6f 70 54 6f 70 2d 31 29 3b 0a 23 69 66   loopTop-1);.#if
dc10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
dc20: 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20  _BTREECOUNT.    
dc30: 20 20 20 20 69 66 28 20 21 69 73 51 75 69 63 6b      if( !isQuick
dc40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
dc50: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
dc60: 69 6e 67 28 76 2c 20 32 2c 20 22 77 72 6f 6e 67  ing(v, 2, "wrong
dc70: 20 23 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e   # of entries in
dc80: 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20   index ");.     
dc90: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
dca0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
dcb0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
dcc0: 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20  ->pNext, j++){. 
dcd0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
dce0: 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74 69  Pk==pIdx ) conti
dcf0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
dd00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dd10: 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
dd20: 69 49 64 78 43 75 72 2b 6a 2c 20 33 29 3b 0a 20  iIdxCur+j, 3);. 
dd30: 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20             addr 
dd40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
dd50: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 38 2b  Op3(v, OP_Eq, 8+
dd60: 6a 2c 20 30 2c 20 33 29 3b 20 56 64 62 65 43 6f  j, 0, 3); VdbeCo
dd70: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
dd80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dd90: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
dda0: 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  LITE_NOTNULL);. 
ddb0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ddc0: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
ddd0: 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e 61  (v, 4, pIdx->zNa
dde0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
ddf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
de00: 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c  p3(v, OP_Concat,
de10: 20 34 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 20   4, 2, 3);.     
de20: 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74 79         integrity
de30: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76  CheckResultRow(v
de40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
de50: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
de60: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
de70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
de80: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
de90: 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
dea0: 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7d 20 0a  UNT */.      } .
deb0: 20 20 20 20 7d 0a 20 20 20 20 7b 0a 20 20 20 20      }.    {.    
dec0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
ded0: 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46  nt iLn = VDBE_OF
dee0: 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a  FSET_LINENO(2);.
def0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
df00: 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 65 6e  st VdbeOpList en
df10: 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  dCode[] = {.    
df20: 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c      { OP_AddImm,
df30: 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20        1, 0,     
df40: 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a     0},    /* 0 *
df50: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 49  /.        { OP_I
df60: 66 4e 6f 74 5a 65 72 6f 2c 20 20 20 31 2c 20 34  fNotZero,   1, 4
df70: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
df80: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 1 */.        
df90: 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20  { OP_String8,   
dfa0: 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30    0, 3,        0
dfb0: 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20  },    /* 2 */.  
dfc0: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c        { OP_Resul
dfd0: 74 52 6f 77 2c 20 20 20 33 2c 20 31 2c 20 20 20  tRow,   3, 1,   
dfe0: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33       0},    /* 3
dff0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
e000: 5f 48 61 6c 74 2c 20 20 20 20 20 20 20 20 30 2c  _Halt,        0,
e010: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
e020: 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20    /* 4 */.      
e030: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20    { OP_String8, 
e040: 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20      0, 3,       
e050: 20 30 7d 2c 20 20 20 20 2f 2a 20 35 20 2a 2f 0a   0},    /* 5 */.
e060: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74          { OP_Got
e070: 6f 2c 20 20 20 20 20 20 20 20 30 2c 20 33 2c 20  o,        0, 3, 
e080: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
e090: 20 36 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20   6 */.      };. 
e0a0: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70       VdbeOp *aOp
e0b0: 3b 0a 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73  ;..      aOp = s
e0c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
e0d0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
e0e0: 28 65 6e 64 43 6f 64 65 29 2c 20 65 6e 64 43 6f  (endCode), endCo
e0f0: 64 65 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20  de, iLn);.      
e100: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 20  if( aOp ){.     
e110: 20 20 20 61 4f 70 5b 30 5d 2e 70 32 20 3d 20 31     aOp[0].p2 = 1
e120: 2d 6d 78 45 72 72 3b 0a 20 20 20 20 20 20 20 20  -mxErr;.        
e130: 61 4f 70 5b 32 5d 2e 70 34 74 79 70 65 20 3d 20  aOp[2].p4type = 
e140: 50 34 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 20  P4_STATIC;.     
e150: 20 20 20 61 4f 70 5b 32 5d 2e 70 34 2e 7a 20 3d     aOp[2].p4.z =
e160: 20 22 6f 6b 22 3b 0a 20 20 20 20 20 20 20 20 61   "ok";.        a
e170: 4f 70 5b 35 5d 2e 70 34 74 79 70 65 20 3d 20 50  Op[5].p4type = P
e180: 34 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 20 20  4_STATIC;.      
e190: 20 20 61 4f 70 5b 35 5d 2e 70 34 2e 7a 20 3d 20    aOp[5].p4.z = 
e1a0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 45 72  (char*)sqlite3Er
e1b0: 72 53 74 72 28 53 51 4c 49 54 45 5f 43 4f 52 52  rStr(SQLITE_CORR
e1c0: 55 50 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UPT);.      }.  
e1d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e1e0: 68 61 6e 67 65 50 33 28 76 2c 20 30 2c 20 73 71  hangeP3(v, 0, sq
e1f0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
e200: 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20  Addr(v)-2);.    
e210: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
e220: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e230: 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
e240: 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
e250: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
e260: 31 36 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  16.  /*.  **   P
e270: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 0a 20  RAGMA encoding. 
e280: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63   **   PRAGMA enc
e290: 6f 64 69 6e 67 20 3d 20 22 75 74 66 2d 38 22 7c  oding = "utf-8"|
e2a0: 22 75 74 66 2d 31 36 22 7c 22 75 74 66 2d 31 36  "utf-16"|"utf-16
e2b0: 6c 65 22 7c 22 75 74 66 2d 31 36 62 65 22 0a 20  le"|"utf-16be". 
e2c0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 69 74 73 20   **.  ** In its 
e2d0: 66 69 72 73 74 20 66 6f 72 6d 2c 20 74 68 69 73  first form, this
e2e0: 20 70 72 61 67 6d 61 20 72 65 74 75 72 6e 73 20   pragma returns 
e2f0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  the encoding of 
e300: 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 64 61  the main.  ** da
e310: 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 64  tabase. If the d
e320: 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 69  atabase is not i
e330: 6e 69 74 69 61 6c 69 7a 65 64 2c 20 69 74 20 69  nitialized, it i
e340: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6e 6f  s initialized no
e350: 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  w..  **.  ** The
e360: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 6f 66 20   second form of 
e370: 74 68 69 73 20 70 72 61 67 6d 61 20 69 73 20 61  this pragma is a
e380: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6d 61   no-op if the ma
e390: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
e3a0: 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c  .  ** has not al
e3b0: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 69 74 69  ready been initi
e3c0: 61 6c 69 7a 65 64 2e 20 49 6e 20 74 68 69 73 20  alized. In this 
e3d0: 63 61 73 65 20 69 74 20 73 65 74 73 20 74 68 65  case it sets the
e3e0: 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 65 6e   default.  ** en
e3f0: 63 6f 64 69 6e 67 20 74 68 61 74 20 77 69 6c 6c  coding that will
e400: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
e410: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
e420: 69 6c 65 20 69 66 20 61 20 6e 65 77 20 66 69 6c  ile if a new fil
e430: 65 0a 20 20 2a 2a 20 69 73 20 63 72 65 61 74 65  e.  ** is create
e440: 64 2e 20 49 66 20 61 6e 20 65 78 69 73 74 69 6e  d. If an existin
e450: 67 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  g main database 
e460: 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  file is opened, 
e470: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 64 65  then the.  ** de
e480: 66 61 75 6c 74 20 74 65 78 74 20 65 6e 63 6f 64  fault text encod
e490: 69 6e 67 20 66 6f 72 20 74 68 65 20 65 78 69 73  ing for the exis
e4a0: 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 69 73  ting database is
e4b0: 20 75 73 65 64 2e 0a 20 20 2a 2a 20 0a 20 20 2a   used..  ** .  *
e4c0: 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 20 6e  * In all cases n
e4d0: 65 77 20 64 61 74 61 62 61 73 65 73 20 63 72 65  ew databases cre
e4e0: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 41  ated using the A
e4f0: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 20 61 72  TTACH command ar
e500: 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 74  e.  ** created t
e510: 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 64  o use the same d
e520: 65 66 61 75 6c 74 20 74 65 78 74 20 65 6e 63 6f  efault text enco
e530: 64 69 6e 67 20 61 73 20 74 68 65 20 6d 61 69 6e  ding as the main
e540: 20 64 61 74 61 62 61 73 65 2e 20 49 66 0a 20 20   database. If.  
e550: 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ** the main data
e560: 62 61 73 65 20 68 61 73 20 6e 6f 74 20 62 65 65  base has not bee
e570: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  n initialized an
e580: 64 2f 6f 72 20 63 72 65 61 74 65 64 20 77 68 65  d/or created whe
e590: 6e 20 41 54 54 41 43 48 0a 20 20 2a 2a 20 69 73  n ATTACH.  ** is
e5a0: 20 65 78 65 63 75 74 65 64 2c 20 74 68 69 73 20   executed, this 
e5b0: 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74  is done before t
e5c0: 68 65 20 41 54 54 41 43 48 20 6f 70 65 72 61 74  he ATTACH operat
e5d0: 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ion..  **.  ** I
e5e0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  n the second for
e5f0: 6d 20 74 68 69 73 20 70 72 61 67 6d 61 20 73 65  m this pragma se
e600: 74 73 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f  ts the text enco
e610: 64 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20  ding to be used 
e620: 69 6e 0a 20 20 2a 2a 20 6e 65 77 20 64 61 74 61  in.  ** new data
e630: 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61 74  base files creat
e640: 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
e650: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 49  tabase handle. I
e660: 74 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 75  t is only.  ** u
e670: 73 65 66 75 6c 20 69 66 20 69 6e 76 6f 6b 65 64  seful if invoked
e680: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
e690: 65 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  er the main data
e6a0: 62 61 73 65 20 69 0a 20 20 2a 2f 0a 20 20 63 61  base i.  */.  ca
e6b0: 73 65 20 50 72 61 67 54 79 70 5f 45 4e 43 4f 44  se PragTyp_ENCOD
e6c0: 49 4e 47 3a 20 7b 0a 20 20 20 20 73 74 61 74 69  ING: {.    stati
e6d0: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45  c const struct E
e6e0: 6e 63 4e 61 6d 65 20 7b 0a 20 20 20 20 20 20 63  ncName {.      c
e6f0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
e700: 20 20 75 38 20 65 6e 63 3b 0a 20 20 20 20 7d 20    u8 enc;.    } 
e710: 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b 0a 20  encnames[] = {. 
e720: 20 20 20 20 20 7b 20 22 55 54 46 38 22 2c 20 20       { "UTF8",  
e730: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20     SQLITE_UTF8  
e740: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
e750: 20 22 55 54 46 2d 38 22 2c 20 20 20 20 53 51 4c   "UTF-8",    SQL
e760: 49 54 45 5f 55 54 46 38 20 20 20 20 20 20 20 20  ITE_UTF8        
e770: 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65  },  /* Must be e
e780: 6c 65 6d 65 6e 74 20 5b 31 5d 20 2a 2f 0a 20 20  lement [1] */.  
e790: 20 20 20 20 7b 20 22 55 54 46 2d 31 36 6c 65 22      { "UTF-16le"
e7a0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
e7b0: 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74       },  /* Must
e7c0: 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 32 5d 20   be element [2] 
e7d0: 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d  */.      { "UTF-
e7e0: 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  16be", SQLITE_UT
e7f0: 46 31 36 42 45 20 20 20 20 20 7d 2c 20 20 2f 2a  F16BE     },  /*
e800: 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74   Must be element
e810: 20 5b 33 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20   [3] */.      { 
e820: 22 55 54 46 31 36 6c 65 22 2c 20 20 53 51 4c 49  "UTF16le",  SQLI
e830: 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20 7d  TE_UTF16LE     }
e840: 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31 36  ,.      { "UTF16
e850: 62 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54 46  be",  SQLITE_UTF
e860: 31 36 42 45 20 20 20 20 20 7d 2c 0a 20 20 20 20  16BE     },.    
e870: 20 20 7b 20 22 55 54 46 2d 31 36 22 2c 20 20 20    { "UTF-16",   
e880: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
e890: 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f     }, /* SQLITE_
e8a0: 55 54 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20  UTF16NATIVE */. 
e8b0: 20 20 20 20 20 7b 20 22 55 54 46 31 36 22 2c 20       { "UTF16", 
e8c0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
e8d0: 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49        }, /* SQLI
e8e0: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 2a  TE_UTF16NATIVE *
e8f0: 2f 0a 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d  /.      { 0, 0 }
e900: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 6f 6e 73  .    };.    cons
e910: 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65  t struct EncName
e920: 20 2a 70 45 6e 63 3b 0a 20 20 20 20 69 66 28 20   *pEnc;.    if( 
e930: 21 7a 52 69 67 68 74 20 29 7b 20 20 20 20 2f 2a  !zRight ){    /*
e940: 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e   "PRAGMA encodin
e950: 67 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  g" */.      if( 
e960: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
e970: 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
e980: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20   pragma_out;.   
e990: 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61     assert( encna
e9a0: 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 38 5d  mes[SQLITE_UTF8]
e9b0: 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  .enc==SQLITE_UTF
e9c0: 38 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  8 );.      asser
e9d0: 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49  t( encnames[SQLI
e9e0: 54 45 5f 55 54 46 31 36 4c 45 5d 2e 65 6e 63 3d  TE_UTF16LE].enc=
e9f0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20  =SQLITE_UTF16LE 
ea00: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ea10: 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45   encnames[SQLITE
ea20: 5f 55 54 46 31 36 42 45 5d 2e 65 6e 63 3d 3d 53  _UTF16BE].enc==S
ea30: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b  QLITE_UTF16BE );
ea40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
ea50: 67 6c 65 54 65 78 74 28 76 2c 20 65 6e 63 6e 61  gleText(v, encna
ea60: 6d 65 73 5b 45 4e 43 28 70 50 61 72 73 65 2d 3e  mes[ENC(pParse->
ea70: 64 62 29 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  db)].zName);.   
ea80: 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eaa0: 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69  * "PRAGMA encodi
eab0: 6e 67 20 3d 20 58 58 58 22 20 2a 2f 0a 20 20 20  ng = XXX" */.   
eac0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 63 68 61 6e 67     /* Only chang
ead0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 73  e the value of s
eae0: 71 6c 69 74 65 2e 65 6e 63 20 69 66 20 74 68 65  qlite.enc if the
eaf0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
eb00: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   is not.      **
eb10: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 66   initialized. If
eb20: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
eb30: 73 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 6e  se exists, the n
eb40: 65 77 20 73 71 6c 69 74 65 2e 65 6e 63 20 76 61  ew sqlite.enc va
eb50: 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  lue.      ** wil
eb60: 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
eb70: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
eb80: 20 69 73 20 6e 65 78 74 20 6c 6f 61 64 65 64 2e   is next loaded.
eb90: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a   If it does not.
eba0: 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
ebb0: 20 65 78 69 73 74 73 2c 20 69 74 20 77 69 6c 6c   exists, it will
ebc0: 20 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 75   be created to u
ebd0: 73 65 20 74 68 65 20 6e 65 77 20 65 6e 63 6f 64  se the new encod
ebe0: 69 6e 67 20 76 61 6c 75 65 2e 0a 20 20 20 20 20  ing value..     
ebf0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 0a 20   */.      if( . 
ec00: 20 20 20 20 20 20 20 21 28 44 62 48 61 73 50 72         !(DbHasPr
ec10: 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20 44 42  operty(db, 0, DB
ec20: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 29 20  _SchemaLoaded)) 
ec30: 7c 7c 20 0a 20 20 20 20 20 20 20 20 44 62 48 61  || .        DbHa
ec40: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 30 2c  sProperty(db, 0,
ec50: 20 44 42 5f 45 6d 70 74 79 29 20 0a 20 20 20 20   DB_Empty) .    
ec60: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72    ){.        for
ec70: 28 70 45 6e 63 3d 26 65 6e 63 6e 61 6d 65 73 5b  (pEnc=&encnames[
ec80: 30 5d 3b 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 3b  0]; pEnc->zName;
ec90: 20 70 45 6e 63 2b 2b 29 7b 0a 20 20 20 20 20 20   pEnc++){.      
eca0: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
ecb0: 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74  e3StrICmp(zRight
ecc0: 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 29 20 29  , pEnc->zName) )
ecd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 43  {.            SC
ece0: 48 45 4d 41 5f 45 4e 43 28 64 62 29 20 3d 20 45  HEMA_ENC(db) = E
ecf0: 4e 43 28 64 62 29 20 3d 0a 20 20 20 20 20 20 20  NC(db) =.       
ed00: 20 20 20 20 20 20 20 20 20 70 45 6e 63 2d 3e 65           pEnc->e
ed10: 6e 63 20 3f 20 70 45 6e 63 2d 3e 65 6e 63 20 3a  nc ? pEnc->enc :
ed20: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
ed30: 49 56 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IVE;.           
ed40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ed50: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
ed60: 20 20 20 20 20 20 69 66 28 20 21 70 45 6e 63 2d        if( !pEnc-
ed70: 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
ed80: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ed90: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 73  Msg(pParse, "uns
eda0: 75 70 70 6f 72 74 65 64 20 65 6e 63 6f 64 69 6e  upported encodin
edb0: 67 3a 20 25 73 22 2c 20 7a 52 69 67 68 74 29 3b  g: %s", zRight);
edc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
edd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
ede0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  reak;.#endif /* 
edf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
ee00: 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  6 */..#ifndef SQ
ee10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41  LITE_OMIT_SCHEMA
ee20: 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53  _VERSION_PRAGMAS
ee30: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
ee40: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68  GMA [schema.]sch
ee50: 65 6d 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a  ema_version.  **
ee60: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
ee70: 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  a.]schema_versio
ee80: 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20  n = <integer>.  
ee90: 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  **.  **   PRAGMA
eea0: 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76   [schema.]user_v
eeb0: 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52  ersion.  **   PR
eec0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73  AGMA [schema.]us
eed0: 65 72 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e  er_version = <in
eee0: 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a  teger>.  **.  **
eef0: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
ef00: 61 2e 5d 66 72 65 65 6c 69 73 74 5f 63 6f 75 6e  a.]freelist_coun
ef10: 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52  t.  **.  **   PR
ef20: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 61  AGMA [schema.]da
ef30: 74 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a  ta_version.  **.
ef40: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
ef50: 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69  chema.]applicati
ef60: 6f 6e 5f 69 64 0a 20 20 2a 2a 20 20 20 50 52 41  on_id.  **   PRA
ef70: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70  GMA [schema.]app
ef80: 6c 69 63 61 74 69 6f 6e 5f 69 64 20 3d 20 3c 69  lication_id = <i
ef90: 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a  nteger>.  **.  *
efa0: 2a 20 54 68 65 20 70 72 61 67 6d 61 27 73 20 73  * The pragma's s
efb0: 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 61 6e  chema_version an
efc0: 64 20 75 73 65 72 5f 76 65 72 73 69 6f 6e 20 61  d user_version a
efd0: 72 65 20 75 73 65 64 20 74 6f 20 73 65 74 20 6f  re used to set o
efe0: 72 20 67 65 74 0a 20 20 2a 2a 20 74 68 65 20 76  r get.  ** the v
eff0: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 63 68 65  alue of the sche
f000: 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20 75  ma-version and u
f010: 73 65 72 2d 76 65 72 73 69 6f 6e 2c 20 72 65 73  ser-version, res
f020: 70 65 63 74 69 76 65 6c 79 2e 20 42 6f 74 68 0a  pectively. Both.
f030: 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d    ** the schema-
f040: 76 65 72 73 69 6f 6e 20 61 6e 64 20 74 68 65 20  version and the 
f050: 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 61 72 65  user-version are
f060: 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69   32-bit signed i
f070: 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 73 74 6f  ntegers.  ** sto
f080: 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
f090: 61 73 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  ase header..  **
f0a0: 0a 20 20 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  .  ** The schema
f0b0: 2d 63 6f 6f 6b 69 65 20 69 73 20 75 73 75 61 6c  -cookie is usual
f0c0: 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61  ly only manipula
f0d0: 74 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  ted internally b
f0e0: 79 20 53 51 4c 69 74 65 2e 20 49 74 0a 20 20 2a  y SQLite. It.  *
f0f0: 2a 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  * is incremented
f100: 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 65   by SQLite whene
f110: 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ver the database
f120: 20 73 63 68 65 6d 61 20 69 73 20 6d 6f 64 69 66   schema is modif
f130: 69 65 64 20 28 62 79 0a 20 20 2a 2a 20 63 72 65  ied (by.  ** cre
f140: 61 74 69 6e 67 20 6f 72 20 64 72 6f 70 70 69 6e  ating or droppin
f150: 67 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  g a table or ind
f160: 65 78 29 2e 20 54 68 65 20 73 63 68 65 6d 61 20  ex). The schema 
f170: 76 65 72 73 69 6f 6e 20 69 73 20 75 73 65 64 20  version is used 
f180: 62 79 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 65  by.  ** SQLite e
f190: 61 63 68 20 74 69 6d 65 20 61 20 71 75 65 72 79  ach time a query
f1a0: 20 69 73 20 65 78 65 63 75 74 65 64 20 74 6f 20   is executed to 
f1b0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
f1c0: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 0a 20  internal cache. 
f1d0: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 68 65 6d   ** of the schem
f1e0: 61 20 75 73 65 64 20 77 68 65 6e 20 63 6f 6d 70  a used when comp
f1f0: 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 71 75  iling the SQL qu
f200: 65 72 79 20 6d 61 74 63 68 65 73 20 74 68 65 20  ery matches the 
f210: 73 63 68 65 6d 61 20 6f 66 0a 20 20 2a 2a 20 74  schema of.  ** t
f220: 68 65 20 64 61 74 61 62 61 73 65 20 61 67 61 69  he database agai
f230: 6e 73 74 20 77 68 69 63 68 20 74 68 65 20 63 6f  nst which the co
f240: 6d 70 69 6c 65 64 20 71 75 65 72 79 20 69 73 20  mpiled query is 
f250: 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
f260: 64 2e 0a 20 20 2a 2a 20 53 75 62 76 65 72 74 69  d..  ** Subverti
f270: 6e 67 20 74 68 69 73 20 6d 65 63 68 61 6e 69 73  ng this mechanis
f280: 6d 20 62 79 20 75 73 69 6e 67 20 22 50 52 41 47  m by using "PRAG
f290: 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  MA schema_versio
f2a0: 6e 22 20 74 6f 20 6d 6f 64 69 66 79 0a 20 20 2a  n" to modify.  *
f2b0: 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72  * the schema-ver
f2c0: 73 69 6f 6e 20 69 73 20 70 6f 74 65 6e 74 69 61  sion is potentia
f2d0: 6c 6c 79 20 64 61 6e 67 65 72 6f 75 73 20 61 6e  lly dangerous an
f2e0: 64 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 70 72  d may lead to pr
f2f0: 6f 67 72 61 6d 0a 20 20 2a 2a 20 63 72 61 73 68  ogram.  ** crash
f300: 65 73 20 6f 72 20 64 61 74 61 62 61 73 65 20 63  es or database c
f310: 6f 72 72 75 70 74 69 6f 6e 2e 20 55 73 65 20 77  orruption. Use w
f320: 69 74 68 20 63 61 75 74 69 6f 6e 21 0a 20 20 2a  ith caution!.  *
f330: 2a 0a 20 20 2a 2a 20 54 68 65 20 75 73 65 72 2d  *.  ** The user-
f340: 76 65 72 73 69 6f 6e 20 69 73 20 6e 6f 74 20 75  version is not u
f350: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
f360: 79 20 53 51 4c 69 74 65 2e 20 49 74 20 6d 61 79  y SQLite. It may
f370: 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a   be used by.  **
f380: 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 66 6f   applications fo
f390: 72 20 61 6e 79 20 70 75 72 70 6f 73 65 2e 0a 20  r any purpose.. 
f3a0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
f3b0: 79 70 5f 48 45 41 44 45 52 5f 56 41 4c 55 45 3a  yp_HEADER_VALUE:
f3c0: 20 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b   {.    int iCook
f3d0: 69 65 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41  ie = pPragma->iA
f3e0: 72 67 3b 20 20 2f 2a 20 57 68 69 63 68 20 63 6f  rg;  /* Which co
f3f0: 6f 6b 69 65 20 74 6f 20 72 65 61 64 20 6f 72 20  okie to read or 
f400: 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 73 71 6c  write */.    sql
f410: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
f420: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  e(v, iDb);.    i
f430: 66 28 20 7a 52 69 67 68 74 20 26 26 20 28 70 50  f( zRight && (pP
f440: 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
f450: 26 20 50 72 61 67 46 6c 67 5f 52 65 61 64 4f 6e  & PragFlg_ReadOn
f460: 6c 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ly)==0 ){.      
f470: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 70 65  /* Write the spe
f480: 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61  cified cookie va
f490: 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61  lue */.      sta
f4a0: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70  tic const VdbeOp
f4b0: 4c 69 73 74 20 73 65 74 43 6f 6f 6b 69 65 5b 5d  List setCookie[]
f4c0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f   = {.        { O
f4d0: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20  P_Transaction,  
f4e0: 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20    0,  1,  0},   
f4f0: 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20   /* 0 */.       
f500: 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c   { OP_SetCookie,
f510: 20 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 7d        0,  0,  0}
f520: 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20  ,    /* 1 */.   
f530: 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65     };.      Vdbe
f540: 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73  Op *aOp;.      s
f550: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
f560: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64  NoMallocRequired
f570: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65  (v, ArraySize(se
f580: 74 43 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20  tCookie));.     
f590: 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   aOp = sqlite3Vd
f5a0: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
f5b0: 72 72 61 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b  rraySize(setCook
f5c0: 69 65 29 2c 20 73 65 74 43 6f 6f 6b 69 65 2c 20  ie), setCookie, 
f5d0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e  0);.      if( ON
f5e0: 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54  LY_IF_REALLOC_ST
f5f0: 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62  RESS(aOp==0) ) b
f600: 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b  reak;.      aOp[
f610: 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20  0].p1 = iDb;.   
f620: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
f630: 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  Db;.      aOp[1]
f640: 2e 70 32 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20  .p2 = iCookie;. 
f650: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d       aOp[1].p3 =
f660: 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69   sqlite3Atoi(zRi
f670: 67 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ght);.    }else{
f680: 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74  .      /* Read t
f690: 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f  he specified coo
f6a0: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  kie value */.   
f6b0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f6c0: 56 64 62 65 4f 70 4c 69 73 74 20 72 65 61 64 43  VdbeOpList readC
f6d0: 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  ookie[] = {.    
f6e0: 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63      { OP_Transac
f6f0: 74 69 6f 6e 2c 20 20 20 20 20 30 2c 20 20 30 2c  tion,     0,  0,
f700: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f    0},    /* 0 */
f710: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  .        { OP_Re
f720: 61 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30  adCookie,      0
f730: 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a  ,  1,  0},    /*
f740: 20 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   1 */.        { 
f750: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20  OP_ResultRow,   
f760: 20 20 20 20 31 2c 20 20 31 2c 20 20 30 7d 0a 20      1,  1,  0}. 
f770: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64       };.      Vd
f780: 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20  beOp *aOp;.     
f790: 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
f7a0: 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72  fyNoMallocRequir
f7b0: 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  ed(v, ArraySize(
f7c0: 72 65 61 64 43 6f 6f 6b 69 65 29 29 3b 0a 20 20  readCookie));.  
f7d0: 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65      aOp = sqlite
f7e0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
f7f0: 2c 20 41 72 72 61 79 53 69 7a 65 28 72 65 61 64  , ArraySize(read
f800: 43 6f 6f 6b 69 65 29 2c 72 65 61 64 43 6f 6f 6b  Cookie),readCook
f810: 69 65 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ie,0);.      if(
f820: 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43   ONLY_IF_REALLOC
f830: 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20  _STRESS(aOp==0) 
f840: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61  ) break;.      a
f850: 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[0].p1 = iDb;.
f860: 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20        aOp[1].p1 
f870: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70  = iDb;.      aOp
f880: 5b 31 5d 2e 70 33 20 3d 20 69 43 6f 6f 6b 69 65  [1].p3 = iCookie
f890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f8a0: 64 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b 0a  dbeReusable(v);.
f8b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
f8c0: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
f8d0: 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f  ITE_OMIT_SCHEMA_
f8e0: 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53 20  VERSION_PRAGMAS 
f8f0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
f900: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
f910: 50 54 49 4f 4e 5f 44 49 41 47 53 0a 20 20 2f 2a  PTION_DIAGS.  /*
f920: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 63  .  **   PRAGMA c
f930: 6f 6d 70 69 6c 65 5f 6f 70 74 69 6f 6e 73 0a 20  ompile_options. 
f940: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
f950: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
f960: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
f970: 74 69 6f 6e 73 20 75 73 65 64 20 69 6e 20 74 68  tions used in th
f980: 69 73 20 62 75 69 6c 64 2c 0a 20 20 2a 2a 20 6f  is build,.  ** o
f990: 6e 65 20 6f 70 74 69 6f 6e 20 70 65 72 20 72 6f  ne option per ro
f9a0: 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  w..  */.  case P
f9b0: 72 61 67 54 79 70 5f 43 4f 4d 50 49 4c 45 5f 4f  ragTyp_COMPILE_O
f9c0: 50 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 69 6e  PTIONS: {.    in
f9d0: 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  t i = 0;.    con
f9e0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20  st char *zOpt;. 
f9f0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
fa00: 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 1;.    while( 
fa10: 28 7a 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 5f  (zOpt = sqlite3_
fa20: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65  compileoption_ge
fa30: 74 28 69 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20  t(i++))!=0 ){.  
fa40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
fa50: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20  oadString(v, 1, 
fa60: 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  zOpt);.      sql
fa70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fa80: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
fa90: 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
faa0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75 73   sqlite3VdbeReus
fab0: 61 62 6c 65 28 76 29 3b 0a 20 20 7d 0a 20 20 62  able(v);.  }.  b
fac0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  reak;.#endif /* 
fad0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
fae0: 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20  ILEOPTION_DIAGS 
faf0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
fb00: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a  TE_OMIT_WAL.  /*
fb10: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
fb20: 73 63 68 65 6d 61 2e 5d 77 61 6c 5f 63 68 65 63  schema.]wal_chec
fb30: 6b 70 6f 69 6e 74 20 3d 20 70 61 73 73 69 76 65  kpoint = passive
fb40: 7c 66 75 6c 6c 7c 72 65 73 74 61 72 74 7c 74 72  |full|restart|tr
fb50: 75 6e 63 61 74 65 0a 20 20 2a 2a 0a 20 20 2a 2a  uncate.  **.  **
fb60: 20 43 68 65 63 6b 70 6f 69 6e 74 20 74 68 65 20   Checkpoint the 
fb70: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
fb80: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 57 41   case PragTyp_WA
fb90: 4c 5f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a  L_CHECKPOINT: {.
fba0: 20 20 20 20 69 6e 74 20 69 42 74 20 3d 20 28 70      int iBt = (p
fbb0: 49 64 32 2d 3e 7a 3f 69 44 62 3a 53 51 4c 49 54  Id2->z?iDb:SQLIT
fbc0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 29 3b  E_MAX_ATTACHED);
fbd0: 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65 20 3d  .    int eMode =
fbe0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
fbf0: 4e 54 5f 50 41 53 53 49 56 45 3b 0a 20 20 20 20  NT_PASSIVE;.    
fc00: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
fc10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
fc20: 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22  trICmp(zRight, "
fc30: 66 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  full")==0 ){.   
fc40: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c       eMode = SQL
fc50: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
fc60: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULL;.      }else
fc70: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
fc80: 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 72 65 73  Cmp(zRight, "res
fc90: 74 61 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tart")==0 ){.   
fca0: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c       eMode = SQL
fcb0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
fcc0: 45 53 54 41 52 54 3b 0a 20 20 20 20 20 20 7d 65  ESTART;.      }e
fcd0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
fce0: 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22  trICmp(zRight, "
fcf0: 74 72 75 6e 63 61 74 65 22 29 3d 3d 30 20 29 7b  truncate")==0 ){
fd00: 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
fd10: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
fd20: 4e 54 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 20  NT_TRUNCATE;.   
fd30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
fd40: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b  Parse->nMem = 3;
fd50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fd60: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 68 65  AddOp3(v, OP_Che
fd70: 63 6b 70 6f 69 6e 74 2c 20 69 42 74 2c 20 65 4d  ckpoint, iBt, eM
fd80: 6f 64 65 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ode, 1);.    sql
fd90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fda0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
fdb0: 31 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 62 72 65  1, 3);.  }.  bre
fdc0: 61 6b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  ak;..  /*.  **  
fdd0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f   PRAGMA wal_auto
fde0: 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 2a 2a 20  checkpoint.  ** 
fdf0: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74    PRAGMA wal_aut
fe00: 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 4e 0a  ocheckpoint = N.
fe10: 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67    **.  ** Config
fe20: 75 72 65 20 61 20 64 61 74 61 62 61 73 65 20 63  ure a database c
fe30: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 75 74  onnection to aut
fe40: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b  omatically check
fe50: 70 6f 69 6e 74 20 61 20 64 61 74 61 62 61 73 65  point a database
fe60: 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 63 63 75  .  ** after accu
fe70: 6d 75 6c 61 74 69 6e 67 20 4e 20 66 72 61 6d 65  mulating N frame
fe80: 73 20 69 6e 20 74 68 65 20 6c 6f 67 2e 20 4f 72  s in the log. Or
fe90: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
fea0: 75 72 72 65 6e 74 20 76 61 6c 75 65 0a 20 20 2a  urrent value.  *
feb0: 2a 20 6f 66 20 4e 2e 0a 20 20 2a 2f 0a 20 20 63  * of N..  */.  c
fec0: 61 73 65 20 50 72 61 67 54 79 70 5f 57 41 4c 5f  ase PragTyp_WAL_
fed0: 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 3a 20  AUTOCHECKPOINT: 
fee0: 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
fef0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ff00: 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
ff10: 6f 69 6e 74 28 64 62 2c 20 73 71 6c 69 74 65 33  oint(db, sqlite3
ff20: 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20  Atoi(zRight));. 
ff30: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
ff40: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 0a 20 20 20  ingleInt(v, .   
ff50: 20 20 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c      db->xWalCall
ff60: 62 61 63 6b 3d 3d 73 71 6c 69 74 65 33 57 61 6c  back==sqlite3Wal
ff70: 44 65 66 61 75 6c 74 48 6f 6f 6b 20 3f 20 0a 20  DefaultHook ? . 
ff80: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
ff90: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 64 62 2d 3e  _PTR_TO_INT(db->
ffa0: 70 57 61 6c 41 72 67 29 20 3a 20 30 29 3b 0a 20  pWalArg) : 0);. 
ffb0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
ffc0: 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  if..  /*.  **  P
ffd0: 52 41 47 4d 41 20 73 68 72 69 6e 6b 5f 6d 65 6d  RAGMA shrink_mem
ffe0: 6f 72 79 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d  ory.  **.  ** IM
fff0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
10000 20 52 2d 32 33 34 34 35 2d 34 36 31 30 39 20 54   R-23445-46109 T
10010 68 69 73 20 70 72 61 67 6d 61 20 63 61 75 73 65  his pragma cause
10020 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
10030 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f   ** connection o
10040 6e 20 77 68 69 63 68 20 69 74 20 69 73 20 69 6e  n which it is in
10050 76 6f 6b 65 64 20 74 6f 20 66 72 65 65 20 75 70  voked to free up
10060 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
10070 61 73 20 69 74 0a 20 20 2a 2a 20 63 61 6e 2c 20  as it.  ** can, 
10080 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
10090 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
100a0 6d 6f 72 79 28 29 2e 0a 20 20 2a 2f 0a 20 20 63  mory()..  */.  c
100b0 61 73 65 20 50 72 61 67 54 79 70 5f 53 48 52 49  ase PragTyp_SHRI
100c0 4e 4b 5f 4d 45 4d 4f 52 59 3a 20 7b 0a 20 20 20  NK_MEMORY: {.   
100d0 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65   sqlite3_db_rele
100e0 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a  ase_memory(db);.
100f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
10100 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
10110 41 20 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20  A optimize.  ** 
10120 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a 65   PRAGMA optimize
10130 28 4d 41 53 4b 29 0a 20 20 2a 2a 20 20 50 52 41  (MASK).  **  PRA
10140 47 4d 41 20 73 63 68 65 6d 61 2e 6f 70 74 69 6d  GMA schema.optim
10150 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ize.  **  PRAGMA
10160 20 73 63 68 65 6d 61 2e 6f 70 74 69 6d 69 7a 65   schema.optimize
10170 28 4d 41 53 4b 29 0a 20 20 2a 2a 0a 20 20 2a 2a  (MASK).  **.  **
10180 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69   Attempt to opti
10190 6d 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  mize the databas
101a0 65 2e 20 20 41 6c 6c 20 73 63 68 65 6d 61 73 20  e.  All schemas 
101b0 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e  are optimized in
101c0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
101d0 74 77 6f 20 66 6f 72 6d 73 2c 20 61 6e 64 20 6f  two forms, and o
101e0 6e 6c 79 20 74 68 65 20 73 70 65 63 69 66 69 65  nly the specifie
101f0 64 20 73 63 68 65 6d 61 20 69 73 20 6f 70 74 69  d schema is opti
10200 6d 69 7a 65 64 20 69 6e 20 74 68 65 20 6c 61 74  mized in the lat
10210 74 65 72 20 74 77 6f 2e 0a 20 20 2a 2a 0a 20 20  ter two..  **.  
10220 2a 2a 20 54 68 65 20 64 65 74 61 69 6c 73 20 6f  ** The details o
10230 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  f optimizations 
10240 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
10250 73 20 70 72 61 67 6d 61 20 61 72 65 20 65 78 70  s pragma are exp
10260 65 63 74 65 64 0a 20 20 2a 2a 20 74 6f 20 63 68  ected.  ** to ch
10270 61 6e 67 65 20 61 6e 64 20 69 6d 70 72 6f 76 65  ange and improve
10280 20 6f 76 65 72 20 74 69 6d 65 2e 20 20 41 70 70   over time.  App
10290 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64  lications should
102a0 20 61 6e 74 69 63 69 70 61 74 65 20 74 68 61 74   anticipate that
102b0 0a 20 20 2a 2a 20 74 68 69 73 20 70 72 61 67 6d  .  ** this pragm
102c0 61 20 77 69 6c 6c 20 70 65 72 66 6f 72 6d 20 6e  a will perform n
102d0 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ew optimizations
102e0 20 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61   in future relea
102f0 73 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ses..  **.  ** T
10300 68 65 20 6f 70 74 69 6f 6e 61 6c 20 61 72 67 75  he optional argu
10310 6d 65 6e 74 20 69 73 20 61 20 62 69 74 6d 61 73  ment is a bitmas
10320 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f  k of optimizatio
10330 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d 3a 0a 20  ns to perform:. 
10340 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30   **.  **    0x00
10350 30 31 20 20 20 20 44 65 62 75 67 67 69 6e 67 20  01    Debugging 
10360 6d 6f 64 65 2e 20 20 44 6f 20 6e 6f 74 20 61 63  mode.  Do not ac
10370 74 75 61 6c 6c 79 20 70 65 72 66 6f 72 6d 20 61  tually perform a
10380 6e 79 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ny optimizations
10390 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
103a0 20 20 20 62 75 74 20 69 6e 73 74 65 61 64 20 72     but instead r
103b0 65 74 75 72 6e 20 6f 6e 65 20 6c 69 6e 65 20 6f  eturn one line o
103c0 66 20 74 65 78 74 20 66 6f 72 20 65 61 63 68 20  f text for each 
103d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 2a  optimization.  *
103e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
103f0 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65 20 62  hat would have b
10400 65 65 6e 20 64 6f 6e 65 2e 20 20 4f 66 66 20 62  een done.  Off b
10410 79 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2a 0a  y default..  **.
10420 20 20 2a 2a 20 20 20 20 30 78 30 30 30 32 20 20    **    0x0002  
10430 20 20 52 75 6e 20 41 4e 41 4c 59 5a 45 20 6f 6e    Run ANALYZE on
10440 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   tables that mig
10450 68 74 20 62 65 6e 65 66 69 74 2e 20 20 4f 6e 20  ht benefit.  On 
10460 62 79 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2a  by default..  **
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65                Se
10480 65 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69  e below for addi
10490 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
104a0 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  on..  **.  **   
104b0 20 30 78 30 30 30 34 20 20 20 20 28 4e 6f 74 20   0x0004    (Not 
104c0 79 65 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29  yet implemented)
104d0 20 52 65 63 6f 72 64 20 75 73 61 67 65 20 61 6e   Record usage an
104e0 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 0a 20  d performance . 
104f0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
10500 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
10510 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  m the current se
10520 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 2a  ssion in the.  *
10530 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
10540 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 6f 20  atabase file so 
10550 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
10560 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 22 6f 70  available to "op
10570 74 69 6d 69 7a 65 22 0a 20 20 2a 2a 20 20 20 20  timize".  **    
10580 20 20 20 20 20 20 20 20 20 20 70 72 61 67 6d 61            pragma
10590 73 20 72 75 6e 20 62 79 20 66 75 74 75 72 65 20  s run by future 
105a0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
105b0 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ions..  **.  ** 
105c0 20 20 20 30 78 30 30 30 38 20 20 20 20 28 4e 6f     0x0008    (No
105d0 74 20 79 65 74 20 69 6d 70 6c 65 6d 65 6e 74 65  t yet implemente
105e0 64 29 20 43 72 65 61 74 65 20 69 6e 64 65 78 65  d) Create indexe
105f0 73 20 74 68 61 74 20 6d 69 67 68 74 20 68 61 76  s that might hav
10600 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  e.  **          
10610 20 20 20 20 62 65 65 6e 20 68 65 6c 70 66 75 6c      been helpful
10620 20 74 6f 20 72 65 63 65 6e 74 20 71 75 65 72 69   to recent queri
10630 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  es.  **.  ** The
10640 20 64 65 66 61 75 6c 74 20 4d 41 53 4b 20 69 73   default MASK is
10650 20 61 6e 64 20 61 6c 77 61 79 73 20 73 68 61 6c   and always shal
10660 6c 20 62 65 20 30 78 66 66 66 65 2e 20 20 30 78  l be 0xfffe.  0x
10670 66 66 66 65 20 6d 65 61 6e 73 20 70 65 72 66 6f  fffe means perfo
10680 72 6d 20 61 6c 6c 0a 20 20 2a 2a 20 6f 66 20 74  rm all.  ** of t
10690 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  he optimizations
106a0 20 6c 69 73 74 65 64 20 61 62 6f 76 65 20 65 78   listed above ex
106b0 63 65 70 74 20 44 65 62 75 67 20 4d 6f 64 65 2c  cept Debug Mode,
106c0 20 69 6e 63 6c 75 64 69 6e 67 20 6e 65 77 0a 20   including new. 
106d0 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   ** optimization
106e0 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 74 20  s that have not 
106f0 79 65 74 20 62 65 65 6e 20 69 6e 76 65 6e 74 65  yet been invente
10700 64 2e 20 20 49 66 20 6e 65 77 20 6f 70 74 69 6d  d.  If new optim
10710 69 7a 61 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a  izations are.  *
10720 2a 20 65 76 65 72 20 61 64 64 65 64 20 74 68 61  * ever added tha
10730 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 66 66 20  t should be off 
10740 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68 6f 73  by default, thos
10750 65 20 6f 66 66 2d 62 79 2d 64 65 66 61 75 6c 74  e off-by-default
10760 20 0a 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74   .  ** optimizat
10770 69 6f 6e 73 20 77 69 6c 6c 20 68 61 76 65 20 62  ions will have b
10780 69 74 6d 61 73 6b 73 20 6f 66 20 30 78 31 30 30  itmasks of 0x100
10790 30 30 20 6f 72 20 6c 61 72 67 65 72 2e 0a 20 20  00 or larger..  
107a0 2a 2a 0a 20 20 2a 2a 20 44 45 54 45 52 4d 49 4e  **.  ** DETERMIN
107b0 41 54 49 4f 4e 20 4f 46 20 57 48 45 4e 20 54 4f  ATION OF WHEN TO
107c0 20 52 55 4e 20 41 4e 41 4c 59 5a 45 0a 20 20 2a   RUN ANALYZE.  *
107d0 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 63 75  *.  ** In the cu
107e0 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
107f0 74 69 6f 6e 2c 20 61 20 74 61 62 6c 65 20 69 73  tion, a table is
10800 20 61 6e 61 6c 79 7a 65 64 20 69 66 20 6f 6e 6c   analyzed if onl
10810 79 20 69 66 20 61 6c 6c 20 6f 66 0a 20 20 2a 2a  y if all of.  **
10820 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
10830 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  re true:.  **.  
10840 2a 2a 20 28 31 29 20 4d 41 53 4b 20 62 69 74 20  ** (1) MASK bit 
10850 30 78 30 32 20 69 73 20 73 65 74 2e 0a 20 20 2a  0x02 is set..  *
10860 2a 0a 20 20 2a 2a 20 28 32 29 20 54 68 65 20 71  *.  ** (2) The q
10870 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 75 73 65  uery planner use
10880 64 20 73 71 6c 69 74 65 5f 73 74 61 74 31 2d 73  d sqlite_stat1-s
10890 74 79 6c 65 20 73 74 61 74 69 73 74 69 63 73 20  tyle statistics 
108a0 66 6f 72 20 6f 6e 65 20 6f 72 0a 20 20 2a 2a 20  for one or.  ** 
108b0 20 20 20 20 6d 6f 72 65 20 69 6e 64 65 78 65 73      more indexes
108c0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 74   of the table at
108d0 20 73 6f 6d 65 20 70 6f 69 6e 74 20 64 75 72 69   some point duri
108e0 6e 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  ng the lifetime 
108f0 6f 66 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20  of.  **     the 
10900 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69  current connecti
10910 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 33  on..  **.  ** (3
10920 29 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e  ) One or more in
10930 64 65 78 65 73 20 6f 66 20 74 68 65 20 74 61 62  dexes of the tab
10940 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
10950 20 75 6e 61 6e 61 6c 79 7a 65 64 20 4f 52 0a 20   unanalyzed OR. 
10960 20 2a 2a 20 20 20 20 20 74 68 65 20 6e 75 6d 62   **     the numb
10970 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
10980 65 20 74 61 62 6c 65 20 68 61 73 20 69 6e 63 72  e table has incr
10990 65 61 73 65 64 20 62 79 20 32 35 20 74 69 6d 65  eased by 25 time
109a0 73 20 6f 72 20 6d 6f 72 65 0a 20 20 2a 2a 20 20  s or more.  **  
109b0 20 20 20 73 69 6e 63 65 20 74 68 65 20 6c 61 73     since the las
109c0 74 20 74 69 6d 65 20 41 4e 41 4c 59 5a 45 20 77  t time ANALYZE w
109d0 61 73 20 72 75 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  as run..  **.  *
109e0 2a 20 54 68 65 20 72 75 6c 65 73 20 66 6f 72 20  * The rules for 
109f0 77 68 65 6e 20 74 61 62 6c 65 73 20 61 72 65 20  when tables are 
10a00 61 6e 61 6c 79 7a 65 64 20 61 72 65 20 6c 69 6b  analyzed are lik
10a10 65 6c 79 20 74 6f 20 63 68 61 6e 67 65 20 69 6e  ely to change in
10a20 0a 20 20 2a 2a 20 66 75 74 75 72 65 20 72 65 6c  .  ** future rel
10a30 65 61 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  eases..  */.  ca
10a40 73 65 20 50 72 61 67 54 79 70 5f 4f 50 54 49 4d  se PragTyp_OPTIM
10a50 49 5a 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  IZE: {.    int i
10a60 44 62 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  DbLast;         
10a70 20 20 2f 2a 20 4c 6f 6f 70 20 74 65 72 6d 69 6e    /* Loop termin
10a80 61 74 69 6f 6e 20 70 6f 69 6e 74 20 66 6f 72 20  ation point for 
10a90 74 68 65 20 73 63 68 65 6d 61 20 6c 6f 6f 70 20  the schema loop 
10aa0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 61 62 43  */.    int iTabC
10ab0 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ur;           /*
10ac0 20 43 75 72 73 6f 72 20 66 6f 72 20 61 20 74 61   Cursor for a ta
10ad0 62 6c 65 20 77 68 6f 73 65 20 73 69 7a 65 20 6e  ble whose size n
10ae0 65 65 64 73 20 63 68 65 63 6b 69 6e 67 20 2a 2f  eeds checking */
10af0 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  .    HashElem *k
10b00 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
10b10 6f 6f 70 20 6f 76 65 72 20 74 61 62 6c 65 73 20  oop over tables 
10b20 6f 66 20 61 20 73 63 68 65 6d 61 20 2a 2f 0a 20  of a schema */. 
10b30 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
10b40 6d 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ma;       /* The
10b50 20 63 75 72 72 65 6e 74 20 73 63 68 65 6d 61 20   current schema 
10b60 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
10b70 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab;           /*
10b80 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
10b90 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 49 6e  schema */.    In
10ba0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
10bb0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
10bc0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
10bd0 0a 20 20 20 20 4c 6f 67 45 73 74 20 73 7a 54 68  .    LogEst szTh
10be0 72 65 73 68 6f 6c 64 3b 20 20 20 20 2f 2a 20 53  reshold;    /* S
10bf0 69 7a 65 20 74 68 72 65 73 68 6f 6c 64 20 61 62  ize threshold ab
10c00 6f 76 65 20 77 68 69 63 68 20 72 65 61 6e 61 6c  ove which reanal
10c10 79 73 69 73 20 69 73 20 6e 65 65 64 64 20 2a 2f  ysis is needd */
10c20 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 75 62 53  .    char *zSubS
10c30 71 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ql;         /* S
10c40 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  QL statement for
10c50 20 74 68 65 20 4f 50 5f 53 71 6c 45 78 65 63 20   the OP_SqlExec 
10c60 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 75 33  opcode */.    u3
10c70 32 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20  2 opMask;       
10c80 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
10c90 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 70 65  operations to pe
10ca0 72 66 6f 72 6d 20 2a 2f 0a 0a 20 20 20 20 69 66  rform */..    if
10cb0 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
10cc0 20 20 6f 70 4d 61 73 6b 20 3d 20 28 75 33 32 29    opMask = (u32)
10cd0 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
10ce0 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ht);.      if( (
10cf0 6f 70 4d 61 73 6b 20 26 20 30 78 30 32 29 3d 3d  opMask & 0x02)==
10d00 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
10d10 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 70 4d 61  else{.      opMa
10d20 73 6b 20 3d 20 30 78 66 66 66 65 3b 0a 20 20 20  sk = 0xfffe;.   
10d30 20 7d 0a 20 20 20 20 69 54 61 62 43 75 72 20 3d   }.    iTabCur =
10d40 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
10d50 0a 20 20 20 20 66 6f 72 28 69 44 62 4c 61 73 74  .    for(iDbLast
10d60 20 3d 20 7a 44 62 3f 69 44 62 3a 64 62 2d 3e 6e   = zDb?iDb:db->n
10d70 44 62 2d 31 3b 20 69 44 62 3c 3d 69 44 62 4c 61  Db-1; iDb<=iDbLa
10d80 73 74 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  st; iDb++){.    
10d90 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 20 63    if( iDb==1 ) c
10da0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73  ontinue;.      s
10db0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
10dc0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
10dd0 44 62 29 3b 0a 20 20 20 20 20 20 70 53 63 68 65  Db);.      pSche
10de0 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
10df0 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ].pSchema;.     
10e00 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
10e10 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
10e20 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b 20 6b 3d  >tblHash); k; k=
10e30 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
10e40 29 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  )){.        pTab
10e50 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
10e60 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 0a 20  eHashData(k);.. 
10e70 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 61 62         /* If tab
10e80 6c 65 20 70 54 61 62 20 68 61 73 20 6e 6f 74 20  le pTab has not 
10e90 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20 77  been used in a w
10ea0 61 79 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65  ay that would be
10eb0 6e 65 66 69 74 20 66 72 6f 6d 0a 20 20 20 20 20  nefit from.     
10ec0 20 20 20 2a 2a 20 68 61 76 69 6e 67 20 61 6e 61     ** having ana
10ed0 6c 79 73 69 73 20 73 74 61 74 69 73 74 69 63 73  lysis statistics
10ee0 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
10ef0 65 6e 74 20 73 65 73 73 69 6f 6e 2c 20 74 68 65  ent session, the
10f00 6e 20 73 6b 69 70 20 69 74 2e 0a 20 20 20 20 20  n skip it..     
10f10 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 73 6f 20     ** This also 
10f20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
10f30 66 20 73 6b 69 70 70 69 6e 67 20 76 69 72 74 75  f skipping virtu
10f40 61 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 76 69  al tables and vi
10f50 65 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ews */.        i
10f60 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
10f70 67 73 20 26 20 54 46 5f 53 74 61 74 73 55 73 65  gs & TF_StatsUse
10f80 64 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  d)==0 ) continue
10f90 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;..        /* Re
10fa0 61 6e 61 6c 79 7a 65 20 69 66 20 74 68 65 20 74  analyze if the t
10fb0 61 62 6c 65 20 69 73 20 32 35 20 74 69 6d 65 73  able is 25 times
10fc0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
10fd0 20 6c 61 73 74 20 61 6e 61 6c 79 73 69 73 20 2a   last analysis *
10fe0 2f 0a 20 20 20 20 20 20 20 20 73 7a 54 68 72 65  /.        szThre
10ff0 73 68 6f 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 52  shold = pTab->nR
11000 6f 77 4c 6f 67 45 73 74 20 2b 20 34 36 3b 20 61  owLogEst + 46; a
11010 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4c 6f  ssert( sqlite3Lo
11020 67 45 73 74 28 32 35 29 3d 3d 34 36 20 29 3b 0a  gEst(25)==46 );.
11030 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
11040 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
11050 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
11060 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
11070 20 20 69 66 28 20 21 70 49 64 78 2d 3e 68 61 73    if( !pIdx->has
11080 53 74 61 74 31 20 29 7b 0a 20 20 20 20 20 20 20  Stat1 ){.       
11090 20 20 20 20 20 73 7a 54 68 72 65 73 68 6f 6c 64       szThreshold
110a0 20 3d 20 30 3b 20 2f 2a 20 41 6c 77 61 79 73 20   = 0; /* Always 
110b0 61 6e 61 6c 79 7a 65 20 69 66 20 61 6e 79 20 69  analyze if any i
110c0 6e 64 65 78 20 6c 61 63 6b 73 20 73 74 61 74 69  ndex lacks stati
110d0 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 20 20 20  stics */.       
110e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
110f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11100 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  }.        if( sz
11110 54 68 72 65 73 68 6f 6c 64 20 29 7b 0a 20 20 20  Threshold ){.   
11120 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
11130 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
11140 69 54 61 62 43 75 72 2c 20 69 44 62 2c 20 70 54  iTabCur, iDb, pT
11150 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
11160 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11170 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11180 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 2c 20 69   OP_IfSmaller, i
11190 54 61 62 43 75 72 2c 20 0a 20 20 20 20 20 20 20  TabCur, .       
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
111c0 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2b 28 6f  rentAddr(v)+2+(o
111d0 70 4d 61 73 6b 26 31 29 2c 20 73 7a 54 68 72 65  pMask&1), szThre
111e0 73 68 6f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  shold);.        
111f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
11200 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11210 20 20 20 20 20 7a 53 75 62 53 71 6c 20 3d 20 73       zSubSql = s
11220 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
11230 2c 20 22 41 4e 41 4c 59 5a 45 20 5c 22 25 77 5c  , "ANALYZE \"%w\
11240 22 2e 5c 22 25 77 5c 22 22 2c 0a 20 20 20 20 20  ".\"%w\"",.     
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
11270 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
11280 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  e, pTab->zName);
11290 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 70 4d  .        if( opM
112a0 61 73 6b 20 26 20 30 78 30 31 20 29 7b 0a 20 20  ask & 0x01 ){.  
112b0 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
112c0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
112d0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
112e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
112f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
11300 72 69 6e 67 38 2c 20 30 2c 20 72 31 2c 20 30 2c  ring8, 0, r1, 0,
11310 20 7a 53 75 62 53 71 6c 2c 20 50 34 5f 44 59 4e   zSubSql, P4_DYN
11320 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  AMIC);.         
11330 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11340 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
11350 6f 77 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  ow, r1, 1);.    
11360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11370 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11380 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 71 6c  AddOp4(v, OP_Sql
11390 45 78 65 63 2c 20 30 2c 20 30 2c 20 30 2c 20 7a  Exec, 0, 0, 0, z
113a0 53 75 62 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d  SubSql, P4_DYNAM
113b0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IC);.        }. 
113c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
113d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
113e0 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29  p0(v, OP_Expire)
113f0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
11400 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  ..  /*.  **   PR
11410 41 47 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f 75  AGMA busy_timeou
11420 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  t.  **   PRAGMA 
11430 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 3d 20 4e  busy_timeout = N
11440 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 61 6c 6c 20  .  **.  ** Call 
11450 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
11460 65 6f 75 74 28 64 62 2c 20 4e 29 2e 20 20 52 65  eout(db, N).  Re
11470 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
11480 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 0a 20   timeout value. 
11490 20 2a 2a 20 69 66 20 6f 6e 65 20 69 73 20 73 65   ** if one is se
114a0 74 2e 20 20 49 66 20 6e 6f 20 62 75 73 79 20 68  t.  If no busy h
114b0 61 6e 64 6c 65 72 20 6f 72 20 61 20 64 69 66 66  andler or a diff
114c0 65 72 65 6e 74 20 62 75 73 79 20 68 61 6e 64 6c  erent busy handl
114d0 65 72 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 74  er is set.  ** t
114e0 68 65 6e 20 30 20 69 73 20 72 65 74 75 72 6e 65  hen 0 is returne
114f0 64 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65 20  d.  Setting the 
11500 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 74 6f 20  busy_timeout to 
11510 30 20 6f 72 20 6e 65 67 61 74 69 76 65 0a 20 20  0 or negative.  
11520 2a 2a 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  ** disables the 
11530 74 69 6d 65 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20  timeout..  */.  
11540 2f 2a 63 61 73 65 20 50 72 61 67 54 79 70 5f 42  /*case PragTyp_B
11550 55 53 59 5f 54 49 4d 45 4f 55 54 2a 2f 20 64 65  USY_TIMEOUT*/ de
11560 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 61 73 73  fault: {.    ass
11570 65 72 74 28 20 70 50 72 61 67 6d 61 2d 3e 65 50  ert( pPragma->eP
11580 72 61 67 54 79 70 3d 3d 50 72 61 67 54 79 70 5f  ragTyp==PragTyp_
11590 42 55 53 59 5f 54 49 4d 45 4f 55 54 20 29 3b 0a  BUSY_TIMEOUT );.
115a0 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
115b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
115c0 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c  busy_timeout(db,
115d0 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69   sqlite3Atoi(zRi
115e0 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ght));.    }.   
115f0 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
11600 28 76 2c 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  (v, db->busyTime
11610 6f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  out);.    break;
11620 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
11630 20 20 50 52 41 47 4d 41 20 73 6f 66 74 5f 68 65    PRAGMA soft_he
11640 61 70 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 20  ap_limit.  **   
11650 50 52 41 47 4d 41 20 73 6f 66 74 5f 68 65 61 70  PRAGMA soft_heap
11660 5f 6c 69 6d 69 74 20 3d 20 4e 0a 20 20 2a 2a 0a  _limit = N.  **.
11670 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
11680 49 4f 4e 2d 4f 46 3a 20 52 2d 32 36 33 34 33 2d  ION-OF: R-26343-
11690 34 35 39 33 30 20 54 68 69 73 20 70 72 61 67 6d  45930 This pragm
116a0 61 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 20 20  a invokes the.  
116b0 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  ** sqlite3_soft_
116c0 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 29 20 69  heap_limit64() i
116d0 6e 74 65 72 66 61 63 65 20 77 69 74 68 20 74 68  nterface with th
116e0 65 20 61 72 67 75 6d 65 6e 74 20 4e 2c 20 69 66  e argument N, if
116f0 20 4e 20 69 73 0a 20 20 2a 2a 20 73 70 65 63 69   N is.  ** speci
11700 66 69 65 64 20 61 6e 64 20 69 73 20 61 20 6e 6f  fied and is a no
11710 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
11720 65 72 2e 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45  er..  ** IMPLEME
11730 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36 34  NTATION-OF: R-64
11740 34 35 31 2d 30 37 31 36 33 20 54 68 65 20 73 6f  451-07163 The so
11750 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 70 72  ft_heap_limit pr
11760 61 67 6d 61 20 61 6c 77 61 79 73 0a 20 20 2a 2a  agma always.  **
11770 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d   returns the sam
11780 65 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 77  e integer that w
11790 6f 75 6c 64 20 62 65 20 72 65 74 75 72 6e 65 64  ould be returned
117a0 20 62 79 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c   by the.  ** sql
117b0 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
117c0 69 6d 69 74 36 34 28 2d 31 29 20 43 2d 6c 61 6e  imit64(-1) C-lan
117d0 67 75 61 67 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  guage function..
117e0 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
117f0 54 79 70 5f 53 4f 46 54 5f 48 45 41 50 5f 4c 49  Typ_SOFT_HEAP_LI
11800 4d 49 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  MIT: {.    sqlit
11810 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20  e3_int64 N;.    
11820 69 66 28 20 7a 52 69 67 68 74 20 26 26 20 73 71  if( zRight && sq
11830 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
11840 36 34 28 7a 52 69 67 68 74 2c 20 26 4e 29 3d 3d  64(zRight, &N)==
11850 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11860 20 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f     sqlite3_soft_
11870 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b  heap_limit64(N);
11880 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
11890 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71  nSingleInt(v, sq
118a0 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
118b0 6c 69 6d 69 74 36 34 28 2d 31 29 29 3b 0a 20 20  limit64(-1));.  
118c0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
118d0 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
118e0 20 74 68 72 65 61 64 73 0a 20 20 2a 2a 20 20 20   threads.  **   
118f0 50 52 41 47 4d 41 20 74 68 72 65 61 64 73 20 3d  PRAGMA threads =
11900 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e   N.  **.  ** Con
11910 66 69 67 75 72 65 20 74 68 65 20 6d 61 78 69 6d  figure the maxim
11920 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f 72  um number of wor
11930 6b 65 72 20 74 68 72 65 61 64 73 2e 20 20 52 65  ker threads.  Re
11940 74 75 72 6e 20 74 68 65 20 6e 65 77 0a 20 20 2a  turn the new.  *
11950 2a 20 6d 61 78 69 6d 75 6d 2c 20 77 68 69 63 68  * maximum, which
11960 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74   might be less t
11970 68 61 6e 20 72 65 71 75 65 73 74 65 64 2e 0a 20  han requested.. 
11980 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
11990 79 70 5f 54 48 52 45 41 44 53 3a 20 7b 0a 20 20  yp_THREADS: {.  
119a0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
119b0 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  N;.    if( zRigh
119c0 74 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  t.     && sqlite
119d0 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
119e0 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49  Right, &N)==SQLI
119f0 54 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20 4e 3e  TE_OK.     && N>
11a00 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
11a10 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62  sqlite3_limit(db
11a20 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  , SQLITE_LIMIT_W
11a30 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 20 28  ORKER_THREADS, (
11a40 69 6e 74 29 28 4e 26 30 78 37 66 66 66 66 66 66  int)(N&0x7ffffff
11a50 66 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  f));.    }.    r
11a60 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
11a70 2c 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  , sqlite3_limit(
11a80 64 62 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  db, SQLITE_LIMIT
11a90 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c  _WORKER_THREADS,
11aa0 20 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b   -1));.    break
11ab0 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e  ;.  }..#if defin
11ac0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
11ad0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
11ae0 54 45 5f 54 45 53 54 29 0a 20 20 2f 2a 0a 20 20  TE_TEST).  /*.  
11af0 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
11b00 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 66  rrent state of f
11b10 69 6c 65 20 6c 6f 67 73 20 66 6f 72 20 61 6c 6c  ile logs for all
11b20 20 64 61 74 61 62 61 73 65 73 0a 20 20 2a 2f 0a   databases.  */.
11b30 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4c    case PragTyp_L
11b40 4f 43 4b 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20  OCK_STATUS: {.  
11b50 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
11b60 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 4c 6f 63  har *const azLoc
11b70 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  kName[] = {.    
11b80 20 20 22 75 6e 6c 6f 63 6b 65 64 22 2c 20 22 73    "unlocked", "s
11b90 68 61 72 65 64 22 2c 20 22 72 65 73 65 72 76 65  hared", "reserve
11ba0 64 22 2c 20 22 70 65 6e 64 69 6e 67 22 2c 20 22  d", "pending", "
11bb0 65 78 63 6c 75 73 69 76 65 22 0a 20 20 20 20 7d  exclusive".    }
11bc0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
11bd0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
11be0 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  2;.    for(i=0; 
11bf0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
11c00 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
11c10 74 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  t;.      const c
11c20 68 61 72 20 2a 7a 53 74 61 74 65 20 3d 20 22 75  har *zState = "u
11c30 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 20 20 69  nknown";.      i
11c40 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  nt j;.      if( 
11c50 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
11c60 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ame==0 ) continu
11c70 65 3b 0a 20 20 20 20 20 20 70 42 74 20 3d 20 64  e;.      pBt = d
11c80 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
11c90 20 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20       if( pBt==0 
11ca0 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  || sqlite3BtreeP
11cb0 61 67 65 72 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ager(pBt)==0 ){.
11cc0 20 20 20 20 20 20 20 20 7a 53 74 61 74 65 20 3d          zState =
11cd0 20 22 63 6c 6f 73 65 64 22 3b 0a 20 20 20 20 20   "closed";.     
11ce0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
11cf0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
11d00 64 62 2c 20 69 20 3f 20 64 62 2d 3e 61 44 62 5b  db, i ? db->aDb[
11d10 69 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 30 2c  i].zDbSName : 0,
11d20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d40 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 43         SQLITE_FC
11d50 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26  NTL_LOCKSTATE, &
11d60 6a 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  j)==SQLITE_OK ){
11d70 0a 20 20 20 20 20 20 20 20 20 7a 53 74 61 74 65  .         zState
11d80 20 3d 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d   = azLockName[j]
11d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11da0 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
11db0 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 73 22 2c  Load(v, 1, "ss",
11dc0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53   db->aDb[i].zDbS
11dd0 4e 61 6d 65 2c 20 7a 53 74 61 74 65 29 3b 0a 20  Name, zState);. 
11de0 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
11df0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
11e00 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
11e10 44 45 43 0a 20 20 2f 2a 20 50 72 61 67 6d 61 20  DEC.  /* Pragma 
11e20 20 20 20 20 20 20 20 69 41 72 67 0a 20 20 2a 2a         iArg.  **
11e30 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 2d 2d   ----------   --
11e40 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 6b 65 79 20 20  ----.  **  key  
11e50 20 20 20 20 20 20 20 20 20 30 0a 20 20 2a 2a 20           0.  ** 
11e60 20 72 65 6b 65 79 20 20 20 20 20 20 20 20 20 31   rekey         1
11e70 0a 20 20 2a 2a 20 20 68 65 78 6b 65 79 20 20 20  .  **  hexkey   
11e80 20 20 20 20 20 32 0a 20 20 2a 2a 20 20 68 65 78       2.  **  hex
11e90 72 65 6b 65 79 20 20 20 20 20 20 33 0a 20 20 2a  rekey      3.  *
11ea0 2a 20 20 74 65 78 74 6b 65 79 20 20 20 20 20 20  *  textkey      
11eb0 20 34 0a 20 20 2a 2a 20 20 74 65 78 74 72 65 6b   4.  **  textrek
11ec0 65 79 20 20 20 20 20 35 0a 20 20 2a 2f 0a 20 20  ey     5.  */.  
11ed0 63 61 73 65 20 50 72 61 67 54 79 70 5f 4b 45 59  case PragTyp_KEY
11ee0 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
11ef0 68 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ht ){.      int 
11f00 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41 72  n = pPragma->iAr
11f10 67 3c 34 20 3f 20 73 71 6c 69 74 65 33 53 74 72  g<4 ? sqlite3Str
11f20 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 20 3a 20  len30(zRight) : 
11f30 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  -1;.      if( (p
11f40 50 72 61 67 6d 61 2d 3e 69 41 72 67 20 26 20 31  Pragma->iArg & 1
11f50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11f60 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64  sqlite3_key_v2(d
11f70 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c 20  b, zDb, zRight, 
11f80 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
11f90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11fa0 5f 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  _rekey_v2(db, zD
11fb0 62 2c 20 7a 52 69 67 68 74 2c 20 6e 29 3b 0a 20  b, zRight, n);. 
11fc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11fd0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61   break;.  }.  ca
11fe0 73 65 20 50 72 61 67 54 79 70 5f 48 45 58 4b 45  se PragTyp_HEXKE
11ff0 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  Y: {.    if( zRi
12000 67 68 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ght ){.      u8 
12010 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74  iByte;.      int
12020 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   i;.      char z
12030 4b 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66  Key[40];.      f
12040 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b  or(i=0, iByte=0;
12050 20 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29 2a   i<sizeof(zKey)*
12060 32 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64  2 && sqlite3Isxd
12070 69 67 69 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b  igit(zRight[i]);
12080 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
12090 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34  Byte = (iByte<<4
120a0 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f  ) + sqlite3HexTo
120b0 49 6e 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 0a  Int(zRight[i]);.
120c0 20 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31          if( (i&1
120d0 29 21 3d 30 20 29 20 7a 4b 65 79 5b 69 2f 32 5d  )!=0 ) zKey[i/2]
120e0 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20   = iByte;.      
120f0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 72  }.      if( (pPr
12100 61 67 6d 61 2d 3e 69 41 72 67 20 26 20 31 29 3d  agma->iArg & 1)=
12110 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
12120 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c  lite3_key_v2(db,
12130 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29   zDb, zKey, i/2)
12140 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
12160 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  ekey_v2(db, zDb,
12170 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20   zKey, i/2);.   
12180 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
12190 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
121a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
121b0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c  ITE_HAS_CODEC) |
121c0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
121d0 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 29 0a 20  _ENABLE_CEROD). 
121e0 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41 43   case PragTyp_AC
121f0 54 49 56 41 54 45 5f 45 58 54 45 4e 53 49 4f 4e  TIVATE_EXTENSION
12200 53 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b  S: if( zRight ){
12210 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
12220 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28  AS_CODEC.    if(
12230 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
12240 28 7a 52 69 67 68 74 2c 20 22 73 65 65 2d 22 2c  (zRight, "see-",
12250 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)==0 ){.      
12260 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65  sqlite3_activate
12270 5f 73 65 65 28 26 7a 52 69 67 68 74 5b 34 5d 29  _see(&zRight[4])
12280 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
12290 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
122a0 42 4c 45 5f 43 45 52 4f 44 0a 20 20 20 20 69 66  BLE_CEROD.    if
122b0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
122c0 70 28 7a 52 69 67 68 74 2c 20 22 63 65 72 6f 64  p(zRight, "cerod
122d0 2d 22 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20  -", 6)==0 ){.   
122e0 20 20 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76     sqlite3_activ
122f0 61 74 65 5f 63 65 72 6f 64 28 26 7a 52 69 67 68  ate_cerod(&zRigh
12300 74 5b 36 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  t[6]);.    }.#en
12310 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  dif.  }.  break;
12320 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a 20  .#endif..  } /* 
12330 45 6e 64 20 6f 66 20 74 68 65 20 50 52 41 47 4d  End of the PRAGM
12340 41 20 73 77 69 74 63 68 20 2a 2f 0a 0a 20 20 2f  A switch */..  /
12350 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
12360 62 6c 6f 63 6b 20 69 73 20 61 20 6e 6f 2d 6f 70  block is a no-op
12370 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44   unless SQLITE_D
12380 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
12390 20 49 74 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70   Its only.  ** p
123a0 75 72 70 6f 73 65 20 69 73 20 74 6f 20 65 78 65  urpose is to exe
123b0 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
123c0 61 74 65 6d 65 6e 74 73 20 74 6f 20 76 65 72 69  atements to veri
123d0 66 79 20 74 68 61 74 20 69 66 20 74 68 65 0a 20  fy that if the. 
123e0 20 2a 2a 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f   ** PragFlg_NoCo
123f0 6c 75 6d 6e 73 31 20 66 6c 61 67 20 69 73 20 73  lumns1 flag is s
12400 65 74 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65  et and the calle
12410 72 20 73 70 65 63 69 66 69 65 64 20 61 6e 20 61  r specified an a
12420 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20  rgument.  ** to 
12430 74 68 65 20 50 52 41 47 4d 41 2c 20 74 68 65 20  the PRAGMA, the 
12440 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 68  implementation h
12450 61 73 20 6e 6f 74 20 61 64 64 65 64 20 61 6e 79  as not added any
12460 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 0a 20   OP_ResultRow . 
12470 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
12480 20 74 6f 20 74 68 65 20 56 4d 2e 20 20 2a 2f 0a   to the VM.  */.
12490 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e    if( (pPragma->
124a0 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
124b0 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 20 26  lg_NoColumns1) &
124c0 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  & zRight ){.    
124d0 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
124e0 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28 76 29 3b  yNoResultRow(v);
124f0 0a 20 20 7d 0a 0a 70 72 61 67 6d 61 5f 6f 75 74  .  }..pragma_out
12500 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
12510 65 28 64 62 2c 20 7a 4c 65 66 74 29 3b 0a 20 20  e(db, zLeft);.  
12520 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12530 2c 20 7a 52 69 67 68 74 29 3b 0a 7d 0a 23 69 66  , zRight);.}.#if
12540 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12550 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
12560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
125b0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
125c0 66 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76  f an eponymous v
125d0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61  irtual table tha
125e0 74 20 72 75 6e 73 20 61 20 70 72 61 67 6d 61 2e  t runs a pragma.
125f0 0a 2a 2a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  .**.*/.typedef s
12600 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62  truct PragmaVtab
12610 20 50 72 61 67 6d 61 56 74 61 62 3b 0a 74 79 70   PragmaVtab;.typ
12620 65 64 65 66 20 73 74 72 75 63 74 20 50 72 61 67  edef struct Prag
12630 6d 61 56 74 61 62 43 75 72 73 6f 72 20 50 72 61  maVtabCursor Pra
12640 67 6d 61 56 74 61 62 43 75 72 73 6f 72 3b 0a 73  gmaVtabCursor;.s
12650 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62  truct PragmaVtab
12660 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
12670 62 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 2f  b base;        /
12680 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20 20 4d  * Base class.  M
12690 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a  ust be first */.
126a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
126b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
126c0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
126d0 65 63 74 69 6f 6e 20 74 6f 20 77 68 69 63 68 20  ection to which 
126e0 69 74 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  it belongs */.  
126f0 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65  const PragmaName
12700 20 2a 70 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d   *pName;  /* Nam
12710 65 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20  e of the pragma 
12720 2a 2f 0a 20 20 75 38 20 6e 48 69 64 64 65 6e 3b  */.  u8 nHidden;
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12740 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68 69 64 64  * Number of hidd
12750 65 6e 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  en columns */.  
12760 75 38 20 69 48 69 64 64 65 6e 3b 20 20 20 20 20  u8 iHidden;     
12770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
12780 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ex of the first 
12790 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a 2f  hidden column */
127a0 0a 7d 3b 0a 73 74 72 75 63 74 20 50 72 61 67 6d  .};.struct Pragm
127b0 61 56 74 61 62 43 75 72 73 6f 72 20 7b 0a 20 20  aVtabCursor {.  
127c0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
127d0 73 6f 72 20 62 61 73 65 3b 20 2f 2a 20 42 61 73  sor base; /* Bas
127e0 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62  e class.  Must b
127f0 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c  e first */.  sql
12800 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 72 61 67  ite3_stmt *pPrag
12810 6d 61 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 72  ma;    /* The pr
12820 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 20 74  agma statement t
12830 6f 20 72 75 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  o run */.  sqlit
12840 65 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 3b 20  e_int64 iRowid; 
12850 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
12860 72 6f 77 69 64 20 2a 2f 0a 20 20 63 68 61 72 20  rowid */.  char 
12870 2a 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20 20 20  *azArg[2];      
12880 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
12890 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 61 6e   the argument an
128a0 64 20 73 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a  d schema */.};..
128b0 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69  /* .** Pragma vi
128c0 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
128d0 6c 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68  le xConnect meth
128e0 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
128f0 74 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e  t pragmaVtabConn
12900 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
12910 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78  db,.  void *pAux
12920 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f  ,.  int argc, co
12930 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a  nst char *const*
12940 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argv,.  sqlite3_
12950 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20  vtab **ppVtab,. 
12960 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
12970 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e  .  const PragmaN
12980 61 6d 65 20 2a 70 50 72 61 67 6d 61 20 3d 20 28  ame *pPragma = (
12990 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65  const PragmaName
129a0 2a 29 70 41 75 78 3b 0a 20 20 50 72 61 67 6d 61  *)pAux;.  Pragma
129b0 56 74 61 62 20 2a 70 54 61 62 20 3d 20 30 3b 0a  Vtab *pTab = 0;.
129c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
129d0 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 53 65  i, j;.  char cSe
129e0 70 20 3d 20 27 28 27 3b 0a 20 20 53 74 72 41 63  p = '(';.  StrAc
129f0 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72 20  cum acc;.  char 
12a00 7a 42 75 66 5b 32 30 30 5d 3b 0a 0a 20 20 55 4e  zBuf[200];..  UN
12a10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
12a20 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rgc);.  UNUSED_P
12a30 41 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b 0a  ARAMETER(argv);.
12a40 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
12a50 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c 20 7a  mInit(&acc, 0, z
12a60 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66  Buf, sizeof(zBuf
12a70 29 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ), 0);.  sqlite3
12a80 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26  _str_appendall(&
12a90 61 63 63 2c 20 22 43 52 45 41 54 45 20 54 41 42  acc, "CREATE TAB
12aa0 4c 45 20 78 22 29 3b 0a 20 20 66 6f 72 28 69 3d  LE x");.  for(i=
12ab0 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d 3e 69 50  0, j=pPragma->iP
12ac0 72 61 67 43 4e 61 6d 65 3b 20 69 3c 70 50 72 61  ragCName; i<pPra
12ad0 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 3b  gma->nPragCName;
12ae0 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
12af0 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
12b00 6e 64 66 28 26 61 63 63 2c 20 22 25 63 5c 22 25  ndf(&acc, "%c\"%
12b10 73 5c 22 22 2c 20 63 53 65 70 2c 20 70 72 61 67  s\"", cSep, prag
12b20 43 4e 61 6d 65 5b 6a 5d 29 3b 0a 20 20 20 20 63  CName[j]);.    c
12b30 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 7d 0a 20  Sep = ',';.  }. 
12b40 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
12b50 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
12b60 65 6e 64 66 28 26 61 63 63 2c 20 22 28 5c 22 25  endf(&acc, "(\"%
12b70 73 5c 22 22 2c 20 70 50 72 61 67 6d 61 2d 3e 7a  s\"", pPragma->z
12b80 4e 61 6d 65 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a  Name);.    i++;.
12b90 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 69    }.  j = 0;.  i
12ba0 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61  f( pPragma->mPra
12bb0 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52  gFlg & PragFlg_R
12bc0 65 73 75 6c 74 31 20 29 7b 0a 20 20 20 20 73 71  esult1 ){.    sq
12bd0 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
12be0 61 6c 6c 28 26 61 63 63 2c 20 22 2c 61 72 67 20  all(&acc, ",arg 
12bf0 48 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b  HIDDEN");.    j+
12c00 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  +;.  }.  if( pPr
12c10 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26  agma->mPragFlg &
12c20 20 28 50 72 61 67 46 6c 67 5f 53 63 68 65 6d 61   (PragFlg_Schema
12c30 4f 70 74 7c 50 72 61 67 46 6c 67 5f 53 63 68 65  Opt|PragFlg_Sche
12c40 6d 61 52 65 71 29 20 29 7b 0a 20 20 20 20 73 71  maReq) ){.    sq
12c50 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
12c60 61 6c 6c 28 26 61 63 63 2c 20 22 2c 73 63 68 65  all(&acc, ",sche
12c70 6d 61 20 48 49 44 44 45 4e 22 29 3b 0a 20 20 20  ma HIDDEN");.   
12c80 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   j++;.  }.  sqli
12c90 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26  te3_str_append(&
12ca0 61 63 63 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  acc, ")", 1);.  
12cb0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
12cc0 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20 61  inish(&acc);.  a
12cd0 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a 42  ssert( strlen(zB
12ce0 75 66 29 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75  uf) < sizeof(zBu
12cf0 66 29 2d 31 20 29 3b 0a 20 20 72 63 20 3d 20 73  f)-1 );.  rc = s
12d00 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
12d10 74 61 62 28 64 62 2c 20 7a 42 75 66 29 3b 0a 20  tab(db, zBuf);. 
12d20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12d30 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  OK ){.    pTab =
12d40 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 73 71   (PragmaVtab*)sq
12d50 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
12d60 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29 29  eof(PragmaVtab))
12d70 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
12d80 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
12d90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
12db0 65 6d 73 65 74 28 70 54 61 62 2c 20 30 2c 20 73  emset(pTab, 0, s
12dc0 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62  izeof(PragmaVtab
12dd0 29 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ));.      pTab->
12de0 70 4e 61 6d 65 20 3d 20 70 50 72 61 67 6d 61 3b  pName = pPragma;
12df0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62 20  .      pTab->db 
12e00 3d 20 64 62 3b 0a 20 20 20 20 20 20 70 54 61 62  = db;.      pTab
12e10 2d 3e 69 48 69 64 64 65 6e 20 3d 20 69 3b 0a 20  ->iHidden = i;. 
12e20 20 20 20 20 20 70 54 61 62 2d 3e 6e 48 69 64 64       pTab->nHidd
12e30 65 6e 20 3d 20 6a 3b 0a 20 20 20 20 7d 0a 20 20  en = j;.    }.  
12e40 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45 72  }else{.    *pzEr
12e50 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
12e60 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
12e70 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
12e80 20 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d 20   }..  *ppVtab = 
12e90 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70  (sqlite3_vtab*)p
12ea0 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Tab;.  return rc
12eb0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67  ;.}../* .** Prag
12ec0 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
12ed0 20 6d 6f 64 75 6c 65 20 78 44 69 73 63 6f 6e 6e   module xDisconn
12ee0 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  ect method..*/.s
12ef0 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
12f00 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 73  VtabDisconnect(s
12f10 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
12f20 61 62 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  ab){.  PragmaVta
12f30 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
12f40 61 56 74 61 62 2a 29 70 56 74 61 62 3b 0a 20 20  aVtab*)pVtab;.  
12f50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
12f60 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
12f70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 46 69  ITE_OK;.}../* Fi
12f80 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 65 73  gure out the bes
12f90 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 74  t index to use t
12fa0 6f 20 73 65 61 72 63 68 20 61 20 70 72 61 67 6d  o search a pragm
12fb0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
12fc0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
12fd0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 61 6e 79 20   not really any 
12fe0 69 6e 64 65 78 20 63 68 6f 69 63 65 73 2e 20 20  index choices.  
12ff0 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 65  But we want to e
13000 6e 63 6f 75 72 61 67 65 20 74 68 65 0a 2a 2a 20  ncourage the.** 
13010 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 74 6f  query planner to
13020 20 67 69 76 65 20 3d 3d 20 63 6f 6e 73 74 72 61   give == constra
13030 69 6e 74 73 20 6f 6e 20 61 73 20 6d 61 6e 79 20  ints on as many 
13040 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72  hidden parameter
13050 73 20 61 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  s as.** possible
13060 2c 20 61 6e 64 20 65 73 70 65 63 69 61 6c 6c 79  , and especially
13070 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 68 69   on the first hi
13080 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 2e 20  dden parameter. 
13090 20 53 6f 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20   So return a.** 
130a0 68 69 67 68 20 63 6f 73 74 20 69 66 20 68 69 64  high cost if hid
130b0 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61  den parameters a
130c0 72 65 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  re unconstrained
130d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
130e0 70 72 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e  pragmaVtabBestIn
130f0 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62  dex(sqlite3_vtab
13100 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69   *tab, sqlite3_i
13110 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
13120 6e 66 6f 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  nfo){.  PragmaVt
13130 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67  ab *pTab = (Prag
13140 6d 61 56 74 61 62 2a 29 74 61 62 3b 0a 20 20 63  maVtab*)tab;.  c
13150 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69  onst struct sqli
13160 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
13170 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e  aint *pConstrain
13180 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  t;.  int i, j;. 
13190 20 69 6e 74 20 73 65 65 6e 5b 32 5d 3b 0a 0a 20   int seen[2];.. 
131a0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
131b0 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62  atedCost = (doub
131c0 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 54 61 62  le)1;.  if( pTab
131d0 2d 3e 6e 48 69 64 64 65 6e 3d 3d 30 20 29 7b 20  ->nHidden==0 ){ 
131e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
131f0 3b 20 7d 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e  ; }.  pConstrain
13200 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  t = pIdxInfo->aC
13210 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 73 65 65  onstraint;.  see
13220 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 73 65 65 6e  n[0] = 0;.  seen
13230 5b 31 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  [1] = 0;.  for(i
13240 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
13250 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
13260 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29  , pConstraint++)
13270 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74  {.    if( pConst
13280 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30  raint->usable==0
13290 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
132a0 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
132b0 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op!=SQLITE_IND
132c0 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
132d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
132e0 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
132f0 2d 3e 69 43 6f 6c 75 6d 6e 20 3c 20 70 54 61 62  ->iColumn < pTab
13300 2d 3e 69 48 69 64 64 65 6e 20 29 20 63 6f 6e 74  ->iHidden ) cont
13310 69 6e 75 65 3b 0a 20 20 20 20 6a 20 3d 20 70 43  inue;.    j = pC
13320 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
13330 6d 6e 20 2d 20 70 54 61 62 2d 3e 69 48 69 64 64  mn - pTab->iHidd
13340 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
13350 6a 20 3c 20 32 20 29 3b 0a 20 20 20 20 73 65 65  j < 2 );.    see
13360 6e 5b 6a 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a  n[j] = i+1;.  }.
13370 20 20 69 66 28 20 73 65 65 6e 5b 30 5d 3d 3d 30    if( seen[0]==0
13380 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   ){.    pIdxInfo
13390 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
133a0 3d 20 28 64 6f 75 62 6c 65 29 32 31 34 37 34 38  = (double)214748
133b0 33 36 34 37 3b 0a 20 20 20 20 70 49 64 78 49 6e  3647;.    pIdxIn
133c0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
133d0 73 20 3d 20 32 31 34 37 34 38 33 36 34 37 3b 0a  s = 2147483647;.
133e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
133f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20  E_OK;.  }.  j = 
13400 73 65 65 6e 5b 30 5d 2d 31 3b 0a 20 20 70 49 64  seen[0]-1;.  pId
13410 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
13420 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49  ntUsage[j].argvI
13430 6e 64 65 78 20 3d 20 31 3b 0a 20 20 70 49 64 78  ndex = 1;.  pIdx
13440 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
13450 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d  tUsage[j].omit =
13460 20 31 3b 0a 20 20 69 66 28 20 73 65 65 6e 5b 31   1;.  if( seen[1
13470 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  ]==0 ) return SQ
13480 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 49 64 78 49  LITE_OK;.  pIdxI
13490 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
134a0 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 30 3b  st = (double)20;
134b0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
134c0 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 30 3b  imatedRows = 20;
134d0 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 31 5d 2d 31  .  j = seen[1]-1
134e0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
134f0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
13500 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 32 3b  ].argvIndex = 2;
13510 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  .  pIdxInfo->aCo
13520 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d  nstraintUsage[j]
13530 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 72 65 74  .omit = 1;.  ret
13540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13550 0a 0a 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65  ../* Create a ne
13560 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
13570 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   pragma virtual 
13580 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20  table */.static 
13590 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4f 70  int pragmaVtabOp
135a0 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  en(sqlite3_vtab 
135b0 2a 70 56 74 61 62 2c 20 73 71 6c 69 74 65 33 5f  *pVtab, sqlite3_
135c0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70  vtab_cursor **pp
135d0 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d  Cursor){.  Pragm
135e0 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
135f0 72 3b 0a 20 20 70 43 73 72 20 3d 20 28 50 72 61  r;.  pCsr = (Pra
13600 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 73  gmaVtabCursor*)s
13610 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
13620 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20 20  zeof(*pCsr));.  
13630 69 66 28 20 70 43 73 72 3d 3d 30 20 29 20 72 65  if( pCsr==0 ) re
13640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13650 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72  M;.  memset(pCsr
13660 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61 67  , 0, sizeof(Prag
13670 6d 61 56 74 61 62 43 75 72 73 6f 72 29 29 3b 0a  maVtabCursor));.
13680 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74    pCsr->base.pVt
13690 61 62 20 3d 20 70 56 74 61 62 3b 0a 20 20 2a 70  ab = pVtab;.  *p
136a0 70 43 75 72 73 6f 72 20 3d 20 26 70 43 73 72 2d  pCursor = &pCsr-
136b0 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20  >base;.  return 
136c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
136d0 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6e 74 65   Clear all conte
136e0 6e 74 20 66 72 6f 6d 20 70 72 61 67 6d 61 20 76  nt from pragma v
136f0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72  irtual table cur
13700 73 6f 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76  sor. */.static v
13710 6f 69 64 20 70 72 61 67 6d 61 56 74 61 62 43 75  oid pragmaVtabCu
13720 72 73 6f 72 43 6c 65 61 72 28 50 72 61 67 6d 61  rsorClear(Pragma
13730 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
13740 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
13750 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
13760 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20  Csr->pPragma);. 
13770 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20 3d   pCsr->pPragma =
13780 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
13790 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72 2d  <ArraySize(pCsr-
137a0 3e 61 7a 41 72 67 29 3b 20 69 2b 2b 29 7b 0a 20  >azArg); i++){. 
137b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
137c0 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 29 3b  pCsr->azArg[i]);
137d0 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67  .    pCsr->azArg
137e0 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  [i] = 0;.  }.}..
137f0 2f 2a 20 43 6c 6f 73 65 20 61 20 70 72 61 67 6d  /* Close a pragm
13800 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
13810 63 75 72 73 6f 72 20 2a 2f 0a 73 74 61 74 69 63  cursor */.static
13820 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43   int pragmaVtabC
13830 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61  lose(sqlite3_vta
13840 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a  b_cursor *cur){.
13850 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
13860 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67  or *pCsr = (Prag
13870 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 63 75  maVtabCursor*)cu
13880 72 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43  r;.  pragmaVtabC
13890 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29  ursorClear(pCsr)
138a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
138b0 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCsr);.  return
138c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
138d0 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 70 72  * Advance the pr
138e0 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
138f0 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  le cursor to the
13900 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 73 74 61   next row */.sta
13910 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
13920 61 62 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76  abNext(sqlite3_v
13930 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
13940 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67  bCursor){.  Prag
13950 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
13960 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
13970 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
13980 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  sor;.  int rc = 
13990 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
139a0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 78   Increment the x
139b0 52 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20  Rowid value */. 
139c0 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 2b 2b 3b   pCsr->iRowid++;
139d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
139e0 3e 70 50 72 61 67 6d 61 20 29 3b 0a 20 20 69 66  >pPragma );.  if
139f0 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71  ( SQLITE_ROW!=sq
13a00 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d  lite3_step(pCsr-
13a10 3e 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20 20  >pPragma) ){.   
13a20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
13a30 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72  nalize(pCsr->pPr
13a40 61 67 6d 61 29 3b 0a 20 20 20 20 70 43 73 72 2d  agma);.    pCsr-
13a50 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20  >pPragma = 0;.  
13a60 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73    pragmaVtabCurs
13a70 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20  orClear(pCsr);. 
13a80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
13a90 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61  }../* .** Pragma
13aa0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
13ab0 6f 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d 65  odule xFilter me
13ac0 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
13ad0 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 46 69  int pragmaVtabFi
13ae0 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  lter(.  sqlite3_
13af0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
13b00 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74  abCursor, .  int
13b10 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63   idxNum, const c
13b20 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69  har *idxStr,.  i
13b30 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
13b40 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
13b50 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13b60 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13b70 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
13b80 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72  VtabCursor;.  Pr
13b90 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d  agmaVtab *pTab =
13ba0 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70   (PragmaVtab*)(p
13bb0 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
13bc0 62 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  b);.  int rc;.  
13bd0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 53 74 72 41  int i, j;.  StrA
13be0 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72  ccum acc;.  char
13bf0 20 2a 7a 53 71 6c 3b 0a 0a 20 20 55 4e 55 53 45   *zSql;..  UNUSE
13c00 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 78 4e  D_PARAMETER(idxN
13c10 75 6d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  um);.  UNUSED_PA
13c20 52 41 4d 45 54 45 52 28 69 64 78 53 74 72 29 3b  RAMETER(idxStr);
13c30 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72  .  pragmaVtabCur
13c40 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a  sorClear(pCsr);.
13c50 20 20 6a 20 3d 20 28 70 54 61 62 2d 3e 70 4e 61    j = (pTab->pNa
13c60 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  me->mPragFlg & P
13c70 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 29 21  ragFlg_Result1)!
13c80 3d 30 20 3f 20 30 20 3a 20 31 3b 0a 20 20 66 6f  =0 ? 0 : 1;.  fo
13c90 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
13ca0 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 63 6f  ++, j++){.    co
13cb0 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20  nst char *zText 
13cc0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
13cd0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
13ce0 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  t(argv[i]);.    
13cf0 61 73 73 65 72 74 28 20 6a 3c 41 72 72 61 79 53  assert( j<ArrayS
13d00 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29  ize(pCsr->azArg)
13d10 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13d20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d  pCsr->azArg[j]==
13d30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  0 );.    if( zTe
13d40 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 73 72  xt ){.      pCsr
13d50 2d 3e 61 7a 41 72 67 5b 6a 5d 20 3d 20 73 71 6c  ->azArg[j] = sql
13d60 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
13d70 22 2c 20 7a 54 65 78 74 29 3b 0a 20 20 20 20 20  ", zText);.     
13d80 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67   if( pCsr->azArg
13d90 5b 6a 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [j]==0 ){.      
13da0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13db0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
13dc0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
13dd0 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
13de0 61 63 63 2c 20 30 2c 20 30 2c 20 30 2c 20 70 54  acc, 0, 0, 0, pT
13df0 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ab->db->aLimit[S
13e00 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
13e10 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 73 71 6c 69  LENGTH]);.  sqli
13e20 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c  te3_str_appendal
13e30 6c 28 26 61 63 63 2c 20 22 50 52 41 47 4d 41 20  l(&acc, "PRAGMA 
13e40 22 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  ");.  if( pCsr->
13e50 61 7a 41 72 67 5b 31 5d 20 29 7b 0a 20 20 20 20  azArg[1] ){.    
13e60 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
13e70 6e 64 66 28 26 61 63 63 2c 20 22 25 51 2e 22 2c  ndf(&acc, "%Q.",
13e80 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 29   pCsr->azArg[1])
13e90 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
13ea0 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61  str_appendall(&a
13eb0 63 63 2c 20 70 54 61 62 2d 3e 70 4e 61 6d 65 2d  cc, pTab->pName-
13ec0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  >zName);.  if( p
13ed0 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 20 29 7b  Csr->azArg[0] ){
13ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
13ef0 5f 61 70 70 65 6e 64 66 28 26 61 63 63 2c 20 22  _appendf(&acc, "
13f00 3d 25 51 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72  =%Q", pCsr->azAr
13f10 67 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53 71  g[0]);.  }.  zSq
13f20 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63  l = sqlite3StrAc
13f30 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b  cumFinish(&acc);
13f40 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
13f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13f60 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OMEM;.  rc = sql
13f70 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
13f80 70 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  pTab->db, zSql, 
13f90 2d 31 2c 20 26 70 43 73 72 2d 3e 70 50 72 61 67  -1, &pCsr->pPrag
13fa0 6d 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ma, 0);.  sqlite
13fb0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
13fc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13fd0 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 62  K ){.    pTab->b
13fe0 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71  ase.zErrMsg = sq
13ff0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
14000 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
14010 73 67 28 70 54 61 62 2d 3e 64 62 29 29 3b 0a 20  sg(pTab->db));. 
14020 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14030 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 61 67 6d  }.  return pragm
14040 61 56 74 61 62 4e 65 78 74 28 70 56 74 61 62 43  aVtabNext(pVtabC
14050 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ursor);.}../*.**
14060 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   Pragma virtual 
14070 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 45 6f  table module xEo
14080 66 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  f method..*/.sta
14090 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
140a0 61 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74  abEof(sqlite3_vt
140b0 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
140c0 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d  Cursor){.  Pragm
140d0 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
140e0 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
140f0 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
14100 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 43  or;.  return (pC
14110 73 72 2d 3e 70 50 72 61 67 6d 61 3d 3d 30 29 3b  sr->pPragma==0);
14120 0a 7d 0a 0a 2f 2a 20 54 68 65 20 78 43 6f 6c 75  .}../* The xColu
14130 6d 6e 20 6d 65 74 68 6f 64 20 73 69 6d 70 6c 79  mn method simply
14140 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 72   returns the cor
14150 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
14160 6e 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 50 52  n from.** the PR
14170 41 47 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  AGMA.  .*/.stati
14180 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
14190 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65  Column(.  sqlite
141a0 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
141b0 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 73  VtabCursor, .  s
141c0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
141d0 63 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b  ctx, .  int i.){
141e0 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
141f0 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
14200 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
14210 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72  VtabCursor;.  Pr
14220 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d  agmaVtab *pTab =
14230 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70   (PragmaVtab*)(p
14240 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
14250 62 29 3b 0a 20 20 69 66 28 20 69 3c 70 54 61 62  b);.  if( i<pTab
14260 2d 3e 69 48 69 64 64 65 6e 20 29 7b 0a 20 20 20  ->iHidden ){.   
14270 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
14280 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74  value(ctx, sqlit
14290 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
142a0 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 69  pCsr->pPragma, i
142b0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
142c0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
142d0 74 65 78 74 28 63 74 78 2c 20 70 43 73 72 2d 3e  text(ctx, pCsr->
142e0 61 7a 41 72 67 5b 69 2d 70 54 61 62 2d 3e 69 48  azArg[i-pTab->iH
142f0 69 64 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54 45  idden],-1,SQLITE
14300 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
14310 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14320 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50  _OK;.}../* .** P
14330 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
14340 62 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69  ble module xRowi
14350 64 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  d method..*/.sta
14360 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
14370 61 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f  abRowid(sqlite3_
14380 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
14390 61 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65  abCursor, sqlite
143a0 5f 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 50 72  _int64 *p){.  Pr
143b0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a  agmaVtabCursor *
143c0 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74  pCsr = (PragmaVt
143d0 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43  abCursor*)pVtabC
143e0 75 72 73 6f 72 3b 0a 20 20 2a 70 20 3d 20 70 43  ursor;.  *p = pC
143f0 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65  sr->iRowid;.  re
14400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14410 7d 0a 0a 2f 2a 20 54 68 65 20 70 72 61 67 6d 61  }../* The pragma
14420 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f   virtual table o
14430 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20  bject */.static 
14440 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
14450 64 75 6c 65 20 70 72 61 67 6d 61 56 74 61 62 4d  dule pragmaVtabM
14460 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20  odule = {.  0,  
14470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14480 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
14490 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  sion */.  0,    
144a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144b0 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
144c0 65 20 2d 20 63 72 65 61 74 65 20 61 20 74 61 62  e - create a tab
144d0 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  le */.  pragmaVt
144e0 61 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20  abConnect,      
144f0 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74       /* xConnect
14500 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e   - connect to an
14510 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
14520 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 42  */.  pragmaVtabB
14530 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20  estIndex,       
14540 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20    /* xBestIndex 
14550 2d 20 44 65 74 65 72 6d 69 6e 65 20 73 65 61 72  - Determine sear
14560 63 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20  ch strategy */. 
14570 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f   pragmaVtabDisco
14580 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a  nnect,        /*
14590 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44   xDisconnect - D
145a0 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61  isconnect from a
145b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20   table */.  0,  
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73           /* xDes
145e0 74 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74 61  troy - Drop a ta
145f0 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  ble */.  pragmaV
14600 74 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  tabOpen,        
14610 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d        /* xOpen -
14620 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a   open a cursor *
14630 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6c  /.  pragmaVtabCl
14640 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
14650 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f   /* xClose - clo
14660 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  se a cursor */. 
14670 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65   pragmaVtabFilte
14680 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
14690 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69   xFilter - confi
146a0 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72  gure scan constr
146b0 61 69 6e 74 73 20 2a 2f 0a 20 20 70 72 61 67 6d  aints */.  pragm
146c0 61 56 74 61 62 4e 65 78 74 2c 20 20 20 20 20 20  aVtabNext,      
146d0 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74          /* xNext
146e0 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72   - advance a cur
146f0 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  sor */.  pragmaV
14700 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20 20  tabEof,         
14710 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f        /* xEof */
14720 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c  .  pragmaVtabCol
14730 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
14740 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61  /* xColumn - rea
14750 64 20 64 61 74 61 20 2a 2f 0a 20 20 70 72 61 67  d data */.  prag
14760 6d 61 56 74 61 62 52 6f 77 69 64 2c 20 20 20 20  maVtabRowid,    
14770 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77           /* xRow
14780 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  id - read data *
14790 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147b0 20 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77 72   /* xUpdate - wr
147c0 69 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c  ite data */.  0,
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42             /* xB
147f0 65 67 69 6e 20 2d 20 62 65 67 69 6e 20 74 72 61  egin - begin tra
14800 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c  nsaction */.  0,
14810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
14830 79 6e 63 20 2d 20 73 79 6e 63 20 74 72 61 6e 73  ync - sync trans
14840 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  action */.  0,  
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d           /* xCom
14870 6d 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61  mit - commit tra
14880 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c  nsaction */.  0,
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
148b0 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61  ollback - rollba
148c0 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  ck transaction *
148d0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69 6f   /* xFindFunctio
14900 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  n - function ove
14910 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 30 2c  rloading */.  0,
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
14940 65 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74  ename - rename t
14950 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c  he table */.  0,
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
14980 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c  avepoint */.  0,
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
149b0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20 20 20  elease */.  0   
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c           /* xRol
149e0 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f  lbackTo */.};../
149f0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
14a00 65 20 69 66 20 7a 54 61 62 4e 61 6d 65 20 69 73  e if zTabName is
14a10 20 72 65 61 6c 6c 79 20 74 68 65 20 6e 61 6d 65   really the name
14a20 20 6f 66 20 61 20 70 72 61 67 6d 61 2e 20 20 49   of a pragma.  I
14a30 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 65 6e  f it is,.** then
14a40 20 72 65 67 69 73 74 65 72 20 61 6e 20 65 70 6f   register an epo
14a50 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74  nymous virtual t
14a60 61 62 6c 65 20 66 6f 72 20 74 68 61 74 20 70 72  able for that pr
14a70 61 67 6d 61 20 61 6e 64 20 72 65 74 75 72 6e 0a  agma and return.
14a80 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
14a90 74 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a 65 63  the Module objec
14aa0 74 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  t for the new vi
14ab0 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
14ac0 4d 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65 33 50  Module *sqlite3P
14ad0 72 61 67 6d 61 56 74 61 62 52 65 67 69 73 74 65  ragmaVtabRegiste
14ae0 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  r(sqlite3 *db, c
14af0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
14b00 29 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d  ){.  const Pragm
14b10 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a 20 20  aName *pName;.  
14b20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14b30 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  strnicmp(zName, 
14b40 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30  "pragma_", 7)==0
14b50 20 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 70 72   );.  pName = pr
14b60 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61 6d 65  agmaLocate(zName
14b70 2b 37 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  +7);.  if( pName
14b80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
14b90 20 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e 6d 50    if( (pName->mP
14ba0 72 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c  ragFlg & (PragFl
14bb0 67 5f 52 65 73 75 6c 74 30 7c 50 72 61 67 46 6c  g_Result0|PragFl
14bc0 67 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30 20 29  g_Result1))==0 )
14bd0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
14be0 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68  ert( sqlite3Hash
14bf0 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Find(&db->aModul
14c00 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a  e, zName)==0 );.
14c10 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
14c20 56 74 61 62 43 72 65 61 74 65 4d 6f 64 75 6c 65  VtabCreateModule
14c30 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 72 61  (db, zName, &pra
14c40 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c 20 28  gmaVtabModule, (
14c50 76 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30 29 3b  void*)pName, 0);
14c60 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
14c70 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14c80 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69  LTABLE */..#endi
14c90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14ca0 5f 50 52 41 47 4d 41 20 2a 2f 0a                 _PRAGMA */.