/ Hex Artifact Content
Login

Artifact d04725ac25387d9638919e197fb009f378e13af7bf899516979e54b3164e3602:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 61  esult row with a
2400: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
2410: 20 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20   string held in 
2420: 72 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63  register 3.  Dec
2430: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c  rement the resul
2440: 74 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73  t count in regis
2450: 74 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c  ter 1.** and hal
2460: 74 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d  t if the maximum
2470: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
2480: 74 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  t rows have been
2490: 20 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74   issued..*/.stat
24a0: 69 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79  ic int integrity
24b0: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56  CheckResultRow(V
24c0: 64 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61  dbe *v){.  int a
24d0: 64 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ddr;.  sqlite3Vd
24e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
24f0: 65 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b  esultRow, 3, 1);
2500: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
2510: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2520: 50 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69  P_IfPos, 1, sqli
2530: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2540: 64 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56  dr(v)+2, 1);.  V
2550: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2570: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
2580: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
25a0: 20 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d   a pragma statem
25b0: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61  ent.  .**.** Pra
25c0: 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73  gmas are of this
25d0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
25e0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
25f0: 2e 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a  .]id [= value].*
2600: 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66  *.** The identif
2610: 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  ier might also b
2620: 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65  e a string.  The
2630: 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
2640: 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74  ng, and.** ident
2650: 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62  ifier, or a numb
2660: 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61  er.  If minusFla
2670: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
2680: 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  the value is.** 
2690: 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61  a number that wa
26a0: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
26b0: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
26c0: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69  * If the left si
26d0: 64 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e  de is "database.
26e0: 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73  id" then pId1 is
26f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
2700: 6d 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69  me.** and pId2 i
2710: 73 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68  s the id.  If th
2720: 65 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a  e left side is j
2730: 75 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49  ust "id" then pI
2740: 64 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20  d1 is the.** id 
2750: 61 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20  and pId2 is any 
2760: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f  empty string..*/
2770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61  .void sqlite3Pra
2780: 67 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gma(.  Parse *pP
2790: 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a  arse, .  Token *
27a0: 70 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20  pId1,        /* 
27b0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73  First part of [s
27c0: 63 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20  chema.]id field 
27d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32  */.  Token *pId2
27e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  ,        /* Seco
27f0: 6e 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65  nd part of [sche
2800: 6d 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72  ma.]id field, or
2810: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
2820: 20 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f   *pValue,      /
2830: 2a 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c  * Token for <val
2840: 75 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ue>, or NULL */.
2850: 20 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20    int minusFlag 
2860: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2870: 20 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63   a '-' sign prec
2880: 65 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a  eded <value> */.
2890: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74  ){.  char *zLeft
28a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
28b0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
28c0: 46 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20  F-8 string <id> 
28d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68  */.  char *zRigh
28e0: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  t = 0;      /* N
28f0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2900: 46 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75  F-8 string <valu
2910: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2920: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2930: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64   = 0;   /* The d
2940: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
2950: 20 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20    Token *pId;   
2960: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2970: 74 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65  ter to <id> toke
2980: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63  n */.  char *aFc
2990: 6e 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a  ntl[4];       /*
29a0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c   Argument to SQL
29b0: 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41  ITE_FCNTL_PRAGMA
29c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 44 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66  Database index f
29f0: 6f 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f  or <database> */
2a00: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 2f 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  /* return value 
2a30: 66 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54  form SQLITE_FCNT
2a40: 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71  L_PRAGMA */.  sq
2a50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2a60: 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68  se->db;    /* Th
2a70: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2a80: 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70  ction */.  Db *p
2a90: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
2ab0: 70 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65  pecific database
2ac0: 20 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20   being pragmaed 
2ad0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
2ae0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
2af0: 61 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61  arse);  /* Prepa
2b00: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
2b10: 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e  .  const PragmaN
2b20: 61 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20  ame *pPragma;   
2b30: 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f  /* The pragma */
2b40: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
2b50: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2b60: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
2b70: 76 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  v);.  pParse->nM
2b80: 65 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e  em = 2;..  /* In
2b90: 74 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68  terpret the [sch
2ba0: 65 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68  ema.] part of th
2bb0: 65 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  e pragma stateme
2bc0: 6e 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20  nt. iDb is the. 
2bd0: 20 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65   ** index of the
2be0: 20 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70   database this p
2bf0: 72 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61  ragma is being a
2c00: 70 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e  pplied to in db.
2c10: 61 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20  aDb[]. */.  iDb 
2c20: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
2c30: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64  Name(pParse, pId
2c40: 31 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a  1, pId2, &pId);.
2c50: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
2c60: 74 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64  turn;.  pDb = &d
2c70: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
2c80: 2f 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64  /* If the temp d
2c90: 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
2ca0: 20 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65   explicitly name
2cb0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2cc0: 20 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d   .  ** pragma, m
2cd0: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f  ake sure it is o
2ce0: 70 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  pen. .  */.  if(
2cf0: 20 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74   iDb==1 && sqlit
2d00: 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
2d10: 73 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  se(pParse) ){.  
2d20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2d30: 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   zLeft = sqlite3
2d40: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
2d50: 2c 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a  , pId);.  if( !z
2d60: 4c 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Left ) return;. 
2d70: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
2d80: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
2d90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2da0: 2c 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29  , "-%T", pValue)
2db0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2dc0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e  Right = sqlite3N
2dd0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2de0: 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20   pValue);.  }.. 
2df0: 20 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b   assert( pId2 );
2e00: 0a 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e  .  zDb = pId2->n
2e10: 3e 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61  >0 ? pDb->zDbSNa
2e20: 6d 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71  me : 0;.  if( sq
2e30: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
2e40: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52  Parse, SQLITE_PR
2e50: 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69  AGMA, zLeft, zRi
2e60: 67 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ght, zDb) ){.   
2e70: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
2e80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64  ;.  }..  /* Send
2e90: 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   an SQLITE_FCNTL
2ea0: 5f 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e  _PRAGMA file-con
2eb0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65  trol to the unde
2ec0: 72 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20  rlying VFS.  ** 
2ed0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20  connection.  If 
2ee0: 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
2ef0: 45 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d  E_OK, then assum
2f00: 65 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20  e that the VFS. 
2f10: 20 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20   ** handled the 
2f20: 70 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72  pragma and gener
2f30: 61 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70  ate a no-op prep
2f40: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
2f50: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
2f60: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31  ENTATION-OF: R-1
2f70: 32 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65  2238-55120 Whene
2f80: 76 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61  ver a PRAGMA sta
2f90: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
2fa0: 2c 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45  ,.  ** an SQLITE
2fb0: 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69  _FCNTL_PRAGMA fi
2fc0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65  le control is se
2fd0: 6e 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73  nt to the open s
2fe0: 71 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a  qlite3_file.  **
2ff0: 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
3000: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  nding to the dat
3010: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68  abase file to wh
3020: 69 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20  ich the pragma. 
3030: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
3040: 66 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fers..  **.  ** 
3050: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
3060: 46 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38  F: R-29875-31678
3070: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   The argument to
3080: 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
3090: 4c 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69  L_PRAGMA.  ** fi
30a0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e  le control is an
30b0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
30c0: 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63  rs to strings (c
30d0: 68 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20  har**) in which 
30e0: 74 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20  the.  ** second 
30f0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
3100: 72 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65  rray is the name
3110: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61   of the pragma a
3120: 6e 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a  nd the third.  *
3130: 2a 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65  * element is the
3140: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3150: 20 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20   pragma or NULL 
3160: 69 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61  if the pragma ha
3170: 73 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65  s no.  ** argume
3180: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74  nt..  */.  aFcnt
3190: 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e  l[0] = 0;.  aFcn
31a0: 74 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20  tl[1] = zLeft;. 
31b0: 20 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69   aFcntl[2] = zRi
31c0: 67 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d  ght;.  aFcntl[3]
31d0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
31e0: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
31f0: 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
3200: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
3210: 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46  b, zDb, SQLITE_F
3220: 43 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f  CNTL_PRAGMA, (vo
3230: 69 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69  id*)aFcntl);.  i
3240: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3250: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
3260: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
3270: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
3280: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
3290: 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 0, COLNAME_NAM
32a0: 45 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51  E, aFcntl[0], SQ
32b0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
32c0: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
32d0: 65 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b  eText(v, aFcntl[
32e0: 30 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0]);.    sqlite3
32f0: 5f 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29  _free(aFcntl[0])
3300: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d  ;.    goto pragm
3310: 61 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  a_out;.  }.  if(
3320: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
3330: 4f 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20  OUND ){.    if( 
3340: 61 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20  aFcntl[0] ){.   
3350: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3360: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
3370: 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20   aFcntl[0]);.   
3380: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3390: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
33a0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  }.    pParse->nE
33b0: 72 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65  rr++;.    pParse
33c0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67  ->rc = rc;.    g
33d0: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
33e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
33f0: 20 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74   the pragma in t
3400: 68 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20  he lookup table 
3410: 2a 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70  */.  pPragma = p
3420: 72 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66  ragmaLocate(zLef
3430: 74 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d  t);.  if( pPragm
3440: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67  a==0 ) goto prag
3450: 6d 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61  ma_out;..  /* Ma
3460: 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
3470: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c  base schema is l
3480: 6f 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61  oaded if the pra
3490: 67 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61  gma requires tha
34a0: 74 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61  t */.  if( (pPra
34b0: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
34c0: 50 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65  PragFlg_NeedSche
34d0: 6d 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ma)!=0 ){.    if
34e0: 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
34f0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
3500: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
3510: 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
3520: 72 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c  r the result col
3530: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 70 72  umn names for pr
3540: 61 67 6d 61 73 20 74 68 61 74 20 72 65 74 75 72  agmas that retur
3550: 6e 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  n results */.  i
3560: 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72  f( (pPragma->mPr
3570: 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
3580: 4e 6f 43 6f 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20  NoColumns)==0 . 
3590: 20 20 26 26 20 28 28 70 50 72 61 67 6d 61 2d 3e    && ((pPragma->
35a0: 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
35b0: 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d  lg_NoColumns1)==
35c0: 30 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 29 0a  0 || zRight==0).
35d0: 20 20 29 7b 0a 20 20 20 20 73 65 74 50 72 61 67    ){.    setPrag
35e0: 6d 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61  maResultColumnNa
35f0: 6d 65 73 28 76 2c 20 70 50 72 61 67 6d 61 29 3b  mes(v, pPragma);
3600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
3610: 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
3620: 74 65 20 70 72 61 67 6d 61 20 68 61 6e 64 6c 65  te pragma handle
3630: 72 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70  r */.  switch( p
3640: 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70  Pragma->ePragTyp
3650: 20 29 7b 0a 20 20 0a 23 69 66 20 21 64 65 66 69   ){.  .#if !defi
3660: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3670: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 26  PAGER_PRAGMAS) &
3680: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
3690: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
36a0: 44 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  D).  /*.  **  PR
36b0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65  AGMA [schema.]de
36c0: 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65  fault_cache_size
36d0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
36e0: 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63  chema.]default_c
36f0: 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a  ache_size=N.  **
3700: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
3710: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
3720: 20 63 75 72 72 65 6e 74 20 70 65 72 73 69 73 74   current persist
3730: 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ent setting for 
3740: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
3750: 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76  che size.  The v
3760: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
3770: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
3780: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65  ber of.  ** page
3790: 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
37a0: 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  che.  The second
37b0: 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20   form sets both 
37c0: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
37d0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
37e0: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
37f0: 65 72 73 69 73 74 65 6e 74 20 70 61 67 65 20 63  ersistent page c
3800: 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a  ache size value.
3810: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74    ** stored in t
3820: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3830: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65  ..  **.  ** Olde
3840: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
3850: 4c 69 74 65 20 77 6f 75 6c 64 20 73 65 74 20 74  Lite would set t
3860: 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65  he default cache
3870: 20 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a 2a 20   size to a.  ** 
3880: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
3890: 74 6f 20 69 6e 64 69 63 61 74 65 20 73 79 6e 63  to indicate sync
38a0: 68 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20 54 68  hronous=OFF.  Th
38b0: 65 73 65 20 64 61 79 73 2c 20 73 79 6e 63 68 72  ese days, synchr
38c0: 6f 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 61 6c  onous.  ** is al
38d0: 77 61 79 73 20 6f 6e 20 62 79 20 64 65 66 61 75  ways on by defau
38e0: 6c 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  lt regardless of
38f0: 20 74 68 65 20 73 69 67 6e 20 6f 66 20 74 68 65   the sign of the
3900: 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a 20   default cache. 
3910: 20 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74 20 63   ** size.  But c
3920: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b 65 20  ontinue to take 
3930: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
3940: 75 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  ue of the defaul
3950: 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a  t cache.  ** siz
3960: 65 20 6f 66 20 68 69 73 74 6f 72 69 63 61 6c 20  e of historical 
3970: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 20  compatibility.. 
3980: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
3990: 79 70 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  yp_DEFAULT_CACHE
39a0: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 74 61  _SIZE: {.    sta
39b0: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c  tic const int iL
39c0: 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f  n = VDBE_OFFSET_
39d0: 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 73  LINENO(2);.    s
39e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65  tatic const Vdbe
39f0: 4f 70 4c 69 73 74 20 67 65 74 43 61 63 68 65 53  OpList getCacheS
3a00: 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ize[] = {.      
3a10: 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  { OP_Transaction
3a20: 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30  , 0, 0,        0
3a30: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  },              
3a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
3a50: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  */.      { OP_Re
3a60: 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 31 2c  adCookie,  0, 1,
3a70: 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 44 45          BTREE_DE
3a80: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
3a90: 7d 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20  },  /* 1 */.    
3aa0: 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20    { OP_IfPos,   
3ab0: 20 20 20 20 31 2c 20 38 2c 20 20 20 20 20 20 20      1, 8,       
3ac0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
3ad0: 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20  Integer,     0, 
3ae0: 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  2,        0},.  
3af0: 20 20 20 20 7b 20 4f 50 5f 53 75 62 74 72 61 63      { OP_Subtrac
3b00: 74 2c 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20  t,    1, 2,     
3b10: 20 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     1},.      { O
3b20: 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31  P_IfPos,       1
3b30: 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 8,        0},.
3b40: 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
3b50: 65 72 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  er,     0, 1,   
3b60: 20 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20 20       0},        
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 6 */.      {
3b90: 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
3ba0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
3bb0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73  ,.      { OP_Res
3bc0: 75 6c 74 52 6f 77 2c 20 20 20 31 2c 20 31 2c 20  ultRow,   1, 1, 
3bd0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
3be0: 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f  ;.    VdbeOp *aO
3bf0: 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  p;.    sqlite3Vd
3c00: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
3c10: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52  Db);.    if( !zR
3c20: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 50  ight ){.      pP
3c30: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b  arse->nMem += 2;
3c40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3c50: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
3c60: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
3c70: 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69  ySize(getCacheSi
3c80: 7a 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20  ze));.      aOp 
3c90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3ca0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
3cb0: 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65  ize(getCacheSize
3cc0: 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 2c  ), getCacheSize,
3cd0: 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28   iLn);.      if(
3ce0: 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43   ONLY_IF_REALLOC
3cf0: 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20  _STRESS(aOp==0) 
3d00: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61  ) break;.      a
3d10: 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[0].p1 = iDb;.
3d20: 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20        aOp[1].p1 
3d30: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70  = iDb;.      aOp
3d40: 5b 36 5d 2e 70 31 20 3d 20 53 51 4c 49 54 45 5f  [6].p1 = SQLITE_
3d50: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
3d60: 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ZE;.    }else{. 
3d70: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
3d80: 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
3d90: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
3da0: 68 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ht));.      sqli
3db0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
3dc0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
3dd0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
3de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3df0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
3e00: 20 69 44 62 2c 20 42 54 52 45 45 5f 44 45 46 41   iDb, BTREE_DEFA
3e10: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20  ULT_CACHE_SIZE, 
3e20: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73  size);.      ass
3e30: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3e40: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3e50: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
3e60: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63   pDb->pSchema->c
3e70: 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
3e80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3e90: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
3ea0: 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e  (pDb->pBt, pDb->
3eb0: 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73  pSchema->cache_s
3ec0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
3ed0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
3ee0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
3ef0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20  T_PAGER_PRAGMAS 
3f00: 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  && !SQLITE_OMIT_
3f10: 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 23  DEPRECATED */..#
3f20: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
3f30: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
3f40: 41 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a  AGMAS).  /*.  **
3f50: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
3f60: 2e 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20 2a 2a  .]page_size.  **
3f70: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
3f80: 2e 5d 70 61 67 65 5f 73 69 7a 65 3d 4e 0a 20 20  .]page_size=N.  
3f90: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
3fa0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
3fb0: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
3fc0: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
3fd0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
3fe0: 7a 65 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68  ze in bytes.  Th
3ff0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
4000: 74 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  ts the.  ** data
4010: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 76  base page size v
4020: 61 6c 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65  alue.  The value
4030: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 73 65 74   can only be set
4040: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74   if.  ** the dat
4050: 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 79 65  abase has not ye
4060: 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2e 0a  t been created..
4070: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
4080: 54 79 70 5f 50 41 47 45 5f 53 49 5a 45 3a 20 7b  Typ_PAGE_SIZE: {
4090: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
40a0: 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20  = pDb->pBt;.    
40b0: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
40c0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
40d0: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  t ){.      int s
40e0: 69 7a 65 20 3d 20 41 4c 57 41 59 53 28 70 42 74  ize = ALWAYS(pBt
40f0: 29 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  ) ? sqlite3Btree
4100: 47 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 29  GetPageSize(pBt)
4110: 20 3a 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   : 0;.      retu
4120: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73  rnSingleInt(v, s
4130: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
4140: 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  .      /* Malloc
4150: 20 6d 61 79 20 66 61 69 6c 20 77 68 65 6e 20 73   may fail when s
4160: 65 74 74 69 6e 67 20 74 68 65 20 70 61 67 65 2d  etting the page-
4170: 73 69 7a 65 2c 20 61 73 20 74 68 65 72 65 20 69  size, as there i
4180: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20  s an internal.  
4190: 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 74 68      ** buffer th
41a0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f 64  at the pager mod
41b0: 75 6c 65 20 72 65 73 69 7a 65 73 20 75 73 69 6e  ule resizes usin
41c0: 67 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  g sqlite3_reallo
41d0: 63 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  c()..      */.  
41e0: 20 20 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65      db->nextPage
41f0: 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74  size = sqlite3At
4200: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
4210: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
4220: 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
4230: 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
4240: 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
4250: 65 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20 20 20  e,-1,0) ){.     
4260: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
4270: 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  lt(db);.      }.
4280: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
4290: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
42a0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
42b0: 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20  ]secure_delete. 
42c0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
42d0: 65 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65  ema.]secure_dele
42e0: 74 65 3d 4f 4e 2f 4f 46 46 2f 46 41 53 54 0a 20  te=ON/OFF/FAST. 
42f0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
4300: 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20  st form reports 
4310: 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
4320: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
4330: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 66   secure_delete f
4340: 6c 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  lag.  The second
4350: 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68   form changes th
4360: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
4370: 20 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69 6e    ** flag settin
4380: 67 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74 68  g and reports th
4390: 65 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a  e new value..  *
43a0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
43b0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20  _SECURE_DELETE: 
43c0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
43d0: 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20   = pDb->pBt;.   
43e0: 20 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20   int b = -1;.   
43f0: 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20   assert( pBt!=0 
4400: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
4410: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  t ){.      if( s
4420: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
4430: 52 69 67 68 74 2c 20 22 66 61 73 74 22 29 3d 3d  Right, "fast")==
4440: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 20 3d  0 ){.        b =
4450: 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   2;.      }else{
4460: 0a 20 20 20 20 20 20 20 20 62 20 3d 20 73 71 6c  .        b = sql
4470: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
4480: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
4490: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
44a0: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62   pId2->n==0 && b
44b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
44c0: 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
44d0: 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
44e0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
44f0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
4500: 72 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62  reDelete(db->aDb
4510: 5b 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20  [ii].pBt, b);.  
4520: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4530: 62 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  b = sqlite3Btree
4540: 53 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74  SecureDelete(pBt
4550: 2c 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , b);.    return
4560: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b  SingleInt(v, b);
4570: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4580: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4590: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f  MA [schema.]max_
45a0: 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20  page_count.  ** 
45b0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
45c0: 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d  ]max_page_count=
45d0: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
45e0: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
45f0: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
4600: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
4610: 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62   ** maximum numb
4620: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
4630: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
4640: 2e 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63  .  The .  ** sec
4650: 6f 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74  ond form attempt
4660: 73 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73  s to change this
4670: 20 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a   setting.  Both.
4680: 20 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72    ** forms retur
4690: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  n the current se
46a0: 74 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tting..  **.  **
46b0: 20 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   The absolute va
46c0: 6c 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64  lue of N is used
46d0: 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
46e0: 75 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68  umented and migh
46f0: 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20  t.  ** change.  
4700: 54 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65  The only purpose
4710: 20 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61   is to provide a
4720: 6e 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65  n easy way to te
4730: 73 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  st.  ** the sqli
4740: 74 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75  te3AbsInt32() fu
4750: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  nction..  **.  *
4760: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4770: 61 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20  a.]page_count.  
4780: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
4790: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
47a0: 65 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  es in the specif
47b0: 69 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ied database..  
47c0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
47d0: 70 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a  p_PAGE_COUNT: {.
47e0: 20 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20      int iReg;.  
47f0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
4800: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
4810: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67  , iDb);.    iReg
4820: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4830: 6d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  m;.    if( sqlit
4840: 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b  e3Tolower(zLeft[
4850: 30 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20  0])=='p' ){.    
4860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4870: 4f 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f  Op2(v, OP_Pageco
4880: 75 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b  unt, iDb, iReg);
4890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
48a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
48b0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63  Op3(v, OP_MaxPgc
48c0: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a  nt, iDb, iReg, .
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
48f0: 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41  bsInt32(sqlite3A
4900: 74 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20  toi(zRight)));. 
4910: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
4920: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4930: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67  _ResultRow, iReg
4940: 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 1);.    break;
4950: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4960: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4970: 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20  ]locking_mode.  
4980: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4990: 6d 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ma.]locking_mode
49a0: 20 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75   = (normal|exclu
49b0: 73 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73  sive).  */.  cas
49c0: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e  e PragTyp_LOCKIN
49d0: 47 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f  G_MODE: {.    co
49e0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  nst char *zRet =
49f0: 20 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69   "normal";.    i
4a00: 6e 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f  nt eMode = getLo
4a10: 63 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74  ckingMode(zRight
4a20: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32  );..    if( pId2
4a30: 2d 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d  ->n==0 && eMode=
4a40: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4a50: 44 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20  DE_QUERY ){.    
4a60: 20 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41    /* Simple "PRA
4a70: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
4a80: 3b 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ;" statement. Th
4a90: 69 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f  is is a query fo
4aa0: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
4ab0: 75 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c  urrent default l
4ac0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69  ocking mode (whi
4ad0: 63 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  ch may be differ
4ae0: 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ent to.      ** 
4af0: 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
4b00: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
4b10: 61 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f  abase)..      */
4b20: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64  .      eMode = d
4b30: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b  b->dfltLockMode;
4b40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b50: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
4b60: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d  .      if( pId2-
4b70: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >n==0 ){.       
4b80: 20 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   /* This indicat
4b90: 65 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62  es that no datab
4ba0: 61 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65  ase name was spe
4bb0: 63 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20  cified as part. 
4bc0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
4bd0: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e   PRAGMA command.
4be0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
4bf0: 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d  e locking-mode m
4c00: 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
4c10: 2a 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74  * set on all att
4c20: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c  ached databases,
4c30: 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
4c40: 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20  main db file..  
4c50: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
4c60: 20 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71   ** Also, the sq
4c70: 6c 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f  lite3.dfltLockMo
4c80: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  de variable is s
4c90: 65 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20  et so that.     
4ca0: 20 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71     ** any subseq
4cb0: 75 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20  uently attached 
4cc0: 64 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75  databases also u
4cd0: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
4ce0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
4cf0: 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20  ing mode..      
4d00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
4d10: 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
4d20: 65 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44  ert(pDb==&db->aD
4d30: 62 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  b[0]);.        f
4d40: 6f 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e  or(ii=2; ii<db->
4d50: 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
4d60: 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
4d70: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4d80: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4da0: 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
4db0: 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f  Mode(pPager, eMo
4dc0: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  de);.        }. 
4dd0: 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c         db->dfltL
4de0: 6f 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  ockMode = (u8)eM
4df0: 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
4e00: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
4e10: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
4e20: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65  b->pBt);.      e
4e30: 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Mode = sqlite3Pa
4e40: 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  gerLockingMode(p
4e50: 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  Pager, eMode);. 
4e60: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
4e70: 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
4e80: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
4e90: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
4ea0: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4eb0: 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
4ec0: 49 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65  IVE );.    if( e
4ed0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4ee0: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
4ef0: 45 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20  E ){.      zRet 
4f00: 3d 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20  = "exclusive";. 
4f10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
4f20: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65  ingleText(v, zRe
4f30: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
4f40: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
4f50: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
4f60: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a  ournal_mode.  **
4f70: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4f80: 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  .]journal_mode =
4f90: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
4fa0: 20 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65             (dele
4fb0: 74 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74  te|persist|off|t
4fc0: 72 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77  runcate|memory|w
4fd0: 61 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63  al|off).  */.  c
4fe0: 61 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52  ase PragTyp_JOUR
4ff0: 4e 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20  NAL_MODE: {.    
5000: 69 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20  int eMode;      
5010: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
5020: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
5030: 45 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f  E_XXX symbols */
5040: 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
5050: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5060: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69  ounter */..    i
5070: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( zRight==0 ){.
5080: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
5090: 65 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20  e is no "=MODE" 
50a0: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67  part of the prag
50b0: 6d 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66  ma, do a query f
50c0: 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
50d0: 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a  current mode */.
50e0: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41        eMode = PA
50f0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
5100: 51 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65  QUERY;.    }else
5110: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
5120: 61 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20  ar *zMode;.     
5130: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
5140: 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29  Strlen30(zRight)
5150: 3b 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64  ;.      for(eMod
5160: 65 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71  e=0; (zMode = sq
5170: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65  lite3JournalMode
5180: 6e 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b  name(eMode))!=0;
5190: 20 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20   eMode++){.     
51a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
51b0: 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a  rNICmp(zRight, z
51c0: 4d 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72  Mode, n)==0 ) br
51d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
51e0: 20 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b     if( !zMode ){
51f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
5200: 68 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20  he "=MODE" part 
5210: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
5220: 6e 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c  ny known journal
5230: 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a   mode,.        *
5240: 2a 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72  * then do a quer
5250: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f  y */.        eMo
5260: 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
5270: 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20  ALMODE_QUERY;.  
5280: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5290: 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  if( eMode==PAGER
52a0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
52b0: 52 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30  RY && pId2->n==0
52c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e   ){.      /* Con
52d0: 76 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75  vert "PRAGMA jou
52e0: 72 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20  rnal_mode" into 
52f0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
5300: 72 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20  rnal_mode" */.  
5310: 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20      iDb = 0;.   
5320: 20 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a     pId2->n = 1;.
5330: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
5340: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d  =db->nDb-1; ii>=
5350: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
5360: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  if( db->aDb[ii].
5370: 70 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20  pBt && (ii==iDb 
5380: 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29  || pId2->n==0) )
5390: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
53a0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
53b0: 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73  , ii);.        s
53c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
53d0: 28 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  (v, OP_JournalMo
53e0: 64 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65  de, ii, 1, eMode
53f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5400: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5410: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
5420: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
5430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
5440: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
5450: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5460: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a  l_size_limit.  *
5470: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
5480: 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  a.]journal_size_
5490: 6c 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  limit=N.  **.  *
54a0: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
54b0: 20 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72   size limit on r
54c0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
54d0: 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  files..  */.  ca
54e0: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
54f0: 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b  AL_SIZE_LIMIT: {
5500: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
5510: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
5520: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
5530: 3b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74  ;.    i64 iLimit
5540: 20 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a   = -2;.    if( z
5550: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
5560: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
5570: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69  I64(zRight, &iLi
5580: 6d 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mit);.      if( 
5590: 69 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d  iLimit<-1 ) iLim
55a0: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  it = -1;.    }. 
55b0: 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69     iLimit = sqli
55c0: 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
55d0: 69 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c  izeLimit(pPager,
55e0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65   iLimit);.    re
55f0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
5600: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72   iLimit);.    br
5610: 65 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  eak;.  }..#endif
5620: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5630: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
5640: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
5650: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74  GMA [schema.]aut
5660: 6f 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50  o_vacuum.  **  P
5670: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
5680: 75 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a  uto_vacuum=N.  *
5690: 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65  *.  ** Get or se
56a0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
56b0: 68 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74  he database 'aut
56c0: 6f 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65  o-vacuum' parame
56d0: 74 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  ter..  ** The va
56e0: 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20  lue is one of:  
56f0: 30 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20  0 NONE 1 FULL 2 
5700: 49 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f  INCREMENTAL.  */
5710: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5720: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
5730: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
5740: 55 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20  UTO_VACUUM: {.  
5750: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
5760: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  Db->pBt;.    ass
5770: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
5780: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
5790: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
57a0: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74  ngleInt(v, sqlit
57b0: 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
57c0: 63 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20  cuum(pBt));.    
57d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
57e0: 20 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f   eAuto = getAuto
57f0: 56 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a  Vacuum(zRight);.
5800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41        assert( eA
5810: 75 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c  uto>=0 && eAuto<
5820: 3d 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  =2 );.      db->
5830: 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75  nextAutovac = (u
5840: 38 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f  8)eAuto;.      /
5850: 2a 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61  * Call SetAutoVa
5860: 63 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e  cuum() to set in
5870: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74  itialize the int
5880: 65 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20  ernal auto and. 
5890: 20 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63       ** incr-vac
58a0: 75 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20  uum flags. This 
58b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
58c0: 61 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ase this connect
58d0: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65  ion.      ** cre
58e0: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
58f0: 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d  e file. It is im
5900: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20  portant that it 
5910: 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  is created.     
5920: 20 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76   ** as an auto-v
5930: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62  acuum capable db
5940: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5950: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5960: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
5970: 70 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20  pBt, eAuto);.   
5980: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5990: 45 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d  E_OK && (eAuto==
59a0: 31 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29  1 || eAuto==2) )
59b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  {.        /* Whe
59c0: 6e 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75  n setting the au
59d0: 74 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to_vacuum mode t
59e0: 6f 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20  o either "full" 
59f0: 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  or .        ** "
5a00: 69 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72  incremental", wr
5a10: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ite the value of
5a20: 20 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20   meta[6] in the 
5a30: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
5a40: 20 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65   ** file. Before
5a50: 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61   writing to meta
5a60: 5b 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20  [6], check that 
5a70: 6d 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65  meta[3] indicate
5a80: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
5a90: 74 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73  t this really is
5aa0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
5ab0: 63 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65  capable database
5ac0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5ad0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
5ae0: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
5af0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
5b00: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  );.        stati
5b10: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
5b20: 73 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20  st setMeta6[] = 
5b30: 7b 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50  {.          { OP
5b40: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
5b50: 20 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20   0,         1,  
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b70: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
5b80: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61          { OP_Rea
5b90: 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20  dCookie,     0, 
5ba0: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5bb0: 20 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54     BTREE_LARGEST
5bc0: 5f 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20  _ROOT_PAGE},.   
5bd0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20         { OP_If, 
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20              1,  
5bf0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
5c00: 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20            0},   
5c10: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20   /* 2 */.       
5c20: 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20     { OP_Halt,   
5c30: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
5c40: 4b 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20  K, OE_Abort,    
5c50: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c60: 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  3 */.          {
5c70: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
5c80: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42      0,         B
5c90: 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d  TREE_INCR_VACUUM
5ca0: 2c 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f  , 0},    /* 4 */
5cb0: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
5cc0: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
5cd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64  .        int iAd
5ce0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5cf0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
5d00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5d10: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
5d20: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
5d30: 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29  aySize(setMeta6)
5d40: 29 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d  );.        aOp =
5d50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d60: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
5d70: 7a 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65  ze(setMeta6), se
5d80: 74 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20  tMeta6, iLn);.  
5d90: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
5da0: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
5db0: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
5dc0: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d  ;.        aOp[0]
5dd0: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
5de0: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
5df0: 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  Db;.        aOp[
5e00: 32 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b  2].p2 = iAddr+4;
5e10: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e  .        aOp[4].
5e20: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5e30: 20 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41    aOp[4].p3 = eA
5e40: 75 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  uto - 1;.       
5e50: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
5e60: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
5e70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5e80: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
5e90: 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  if..  /*.  **  P
5ea0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69  RAGMA [schema.]i
5eb0: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
5ec0: 6d 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  m(N).  **.  ** D
5ed0: 6f 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63  o N steps of inc
5ee0: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69  remental vacuumi
5ef0: 6e 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ng on a database
5f00: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5f10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5f20: 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61  ACUUM.  case Pra
5f30: 67 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c  gTyp_INCREMENTAL
5f40: 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69  _VACUUM: {.    i
5f50: 6e 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b  nt iLimit, addr;
5f60: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
5f70: 3d 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65  =0 || !sqlite3Ge
5f80: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
5f90: 69 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69  iLimit) || iLimi
5fa0: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  t<=0 ){.      iL
5fb0: 69 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66  imit = 0x7ffffff
5fc0: 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  f;.    }.    sql
5fd0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5fe0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5ff0: 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
6000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6010: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c  , OP_Integer, iL
6020: 69 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64  imit, 1);.    ad
6030: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
6040: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63  AddOp1(v, OP_Inc
6050: 72 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56  rVacuum, iDb); V
6060: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6080: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp1(v, OP_Resu
6090: 6c 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73  ltRow, 1);.    s
60a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
60b0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
60c0: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
60d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
60e0: 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64  OP_IfPos, 1, add
60f0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
6100: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6110: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
6120: 61 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b  addr);.    break
6130: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
6140: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6150: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
6160: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6170: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6180: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
6190: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
61a0: 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20  e_size=N.  **.  
61b0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
61c0: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
61d0: 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74  rrent local sett
61e0: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
61f0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
6200: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  . The second for
6210: 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c  m sets the local
6220: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
6230: 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66   size value.  If
6240: 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74   N is positive t
6250: 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a  hen that is the.
6260: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
6270: 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
6280: 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61  e.  If N is nega
6290: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  tive, then the. 
62a0: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
62b0: 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20  ges is adjusted 
62c0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
62d0: 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79  e uses -N kibiby
62e0: 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f  tes.  ** of memo
62f0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
6300: 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49  PragTyp_CACHE_SI
6310: 5a 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE: {.    assert
6320: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
6330: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
6340: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
6350: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6360: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6370: 28 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  (v, pDb->pSchema
6380: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
6390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
63a0: 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74  int size = sqlit
63b0: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
63c0: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
63d0: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  ma->cache_size =
63e0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
63f0: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
6400: 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20  eSize(pDb->pBt, 
6410: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
6420: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
6430: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6440: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
6450: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6460: 65 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52  e_spill.  **  PR
6470: 41 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c  AGMA cache_spill
6480: 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50  =BOOLEAN.  **  P
6490: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63  RAGMA [schema.]c
64a0: 61 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a  ache_spill=N.  *
64b0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
64c0: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
64d0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20  e current local 
64e0: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
64f0: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
6500: 73 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20  spill size. The 
6510: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e  second form turn
6520: 73 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e  s cache spill on
6530: 0a 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57  .  ** or off.  W
6540: 68 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63  hen turnning cac
6550: 68 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65  he spill on, the
6560: 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
6570: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
6580: 20 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68   cache_size.  Th
6590: 65 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74  e third form set
65a0: 73 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74  s a spill size t
65b0: 68 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  hat.  ** may be 
65c0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74  different form t
65d0: 68 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  he cache size.. 
65e0: 20 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69   ** If N is posi
65f0: 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69  tive then that i
6600: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
6610: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6620: 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69  e cache.  If N i
6630: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
6640: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
6650: 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a   of pages is adj
6660: 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  usted so that th
6670: 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20  e cache uses -N 
6680: 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f  kibibytes.  ** o
6690: 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20  f memory..  **. 
66a0: 20 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   ** If the numbe
66b0: 72 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c  r of cache_spill
66c0: 20 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74   pages is less t
66d0: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
66e0: 66 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a  f.  ** cache_siz
66f0: 65 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c  e pages, no spil
6700: 6c 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69  ling occurs unti
6710: 6c 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  l the page count
6720: 20 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68   exceeds.  ** th
6730: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
6740: 65 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20  e_size pages..  
6750: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68  **.  ** The cach
6760: 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20  e_spill=BOOLEAN 
6770: 73 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20  setting applies 
6780: 74 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  to all attached 
6790: 73 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f  schemas,.  ** no
67a0: 74 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d  t just the schem
67b0: 61 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a  a specified..  *
67c0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
67d0: 5f 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a  _CACHE_SPILL: {.
67e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
67f0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
6800: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
6810: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
6820: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
6830: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20  nSingleInt(v,.  
6840: 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67         (db->flag
6850: 73 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65  s & SQLITE_Cache
6860: 53 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20  Spill)==0 ? 0 : 
6870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6880: 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
6890: 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30  lSize(pDb->pBt,0
68a0: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
68b0: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
68c0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  1;.      if( sql
68d0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
68e0: 67 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20  ght, &size) ){. 
68f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
6900: 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
6910: 70 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b  pDb->pBt, size);
6920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6930: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
6940: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a  lean(zRight, siz
6950: 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  e!=0) ){.       
6960: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
6970: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b  LITE_CacheSpill;
6980: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6990: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
69a0: 26 3d 20 7e 53 51 4c 49 54 45 5f 43 61 63 68 65  &= ~SQLITE_Cache
69b0: 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  Spill;.      }. 
69c0: 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72       setAllPager
69d0: 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d  Flags(db);.    }
69e0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
69f0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
6a00: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70  MA [schema.]mmap
6a10: 5f 73 69 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20  _size(N).  **.  
6a20: 2a 2a 20 55 73 65 64 20 74 6f 20 73 65 74 20 6d  ** Used to set m
6a30: 61 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69  apping size limi
6a40: 74 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 73  t. The mapping s
6a50: 69 7a 65 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a  ize limit is.  *
6a60: 2a 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  * used to limit 
6a70: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 73 69  the aggregate si
6a80: 7a 65 20 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79  ze of all memory
6a90: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20   mapped regions 
6aa0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  of the.  ** data
6ab0: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
6ac0: 69 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  is parameter is 
6ad0: 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  set to zero, the
6ae0: 6e 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  n memory mapping
6af0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65  .  ** is not use
6b00: 64 20 61 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20  d at all.  If N 
6b10: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
6b20: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 65  n the default me
6b30: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69  mory map.  ** li
6b40: 6d 69 74 20 64 65 74 65 72 6d 69 6e 65 64 20 62  mit determined b
6b50: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
6b60: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
6b70: 4d 41 50 5f 53 49 5a 45 29 20 69 73 20 73 65 74  MAP_SIZE) is set
6b80: 2e 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 61 6d  ..  ** The param
6b90: 65 74 65 72 20 4e 20 69 73 20 6d 65 61 73 75 72  eter N is measur
6ba0: 65 64 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a  ed in bytes..  *
6bb0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 76 61 6c 75  *.  ** This valu
6bc0: 65 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20  e is advisory.  
6bd0: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56  The underlying V
6be0: 46 53 20 69 73 20 66 72 65 65 20 74 6f 20 6d 65  FS is free to me
6bf0: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73  mory map.  ** as
6c00: 20 6c 69 74 74 6c 65 20 6f 72 20 61 73 20 6d 75   little or as mu
6c10: 63 68 20 61 73 20 69 74 20 77 61 6e 74 73 2e 20  ch as it wants. 
6c20: 20 45 78 63 65 70 74 2c 20 69 66 20 4e 20 69 73   Except, if N is
6c30: 20 73 65 74 20 74 6f 20 30 20 74 68 65 6e 20 74   set to 0 then t
6c40: 68 65 0a 20 20 2a 2a 20 75 70 70 65 72 20 6c 61  he.  ** upper la
6c50: 79 65 72 73 20 77 69 6c 6c 20 6e 65 76 65 72 20  yers will never 
6c60: 69 6e 76 6f 6b 65 20 74 68 65 20 78 46 65 74 63  invoke the xFetc
6c70: 68 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20  h interfaces to 
6c80: 74 68 65 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20  the VFS..  */.  
6c90: 63 61 73 65 20 50 72 61 67 54 79 70 5f 4d 4d 41  case PragTyp_MMA
6ca0: 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71  P_SIZE: {.    sq
6cb0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
6cc0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
6cd0: 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61  MAP_SIZE>0.    a
6ce0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
6cf0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
6d00: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
6d10: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
6d20: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
6d30: 20 20 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48     sqlite3DecOrH
6d40: 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20  exToI64(zRight, 
6d50: 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &sz);.      if( 
6d60: 73 7a 3c 30 20 29 20 73 7a 20 3d 20 73 71 6c 69  sz<0 ) sz = sqli
6d70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
6d80: 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 69 66  szMmap;.      if
6d90: 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64  ( pId2->n==0 ) d
6da0: 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a  b->szMmap = sz;.
6db0: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d        for(ii=db-
6dc0: 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69  >nDb-1; ii>=0; i
6dd0: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i--){.        if
6de0: 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  ( db->aDb[ii].pB
6df0: 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c  t && (ii==iDb ||
6e00: 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a   pId2->n==0) ){.
6e10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6e20: 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
6e30: 69 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  it(db->aDb[ii].p
6e40: 42 74 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  Bt, sz);.       
6e50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6e60: 0a 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20  .    sz = -1;.  
6e70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
6e80: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
6e90: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  zDb, SQLITE_FCNT
6ea0: 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
6eb0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 7a 20  );.#else.    sz 
6ec0: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 0;.    rc = SQ
6ed0: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
6ee0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6ef0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6f00: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
6f10: 2c 20 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , sz);.    }else
6f20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6f30: 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
6f40: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6f50: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
6f60: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  rc = rc;.    }. 
6f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6f80: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
6f90: 41 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a  A temp_store.  *
6fa0: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
6fb0: 73 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74  store = "default
6fc0: 22 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65  "|"memory"|"file
6fd0: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
6fe0: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
6ff0: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
7000: 20 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67   temp_store flag
7010: 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a  .  Changing.  **
7020: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
7030: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63   does not make c
7040: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69  hanges to the di
7050: 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  sk file and the 
7060: 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c  default.  ** val
7070: 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f  ue will be resto
7080: 72 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d  red the next tim
7090: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
70a0: 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20  s opened..  **. 
70b0: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74   ** Note that it
70c0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
70d0: 20 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d   the library com
70e0: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
70f0: 73 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69  s to.  ** overri
7100: 64 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a  de this setting.
7110: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7120: 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20  Typ_TEMP_STORE: 
7130: 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  {.    if( !zRigh
7140: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
7150: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62  nSingleInt(v, db
7160: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20  ->temp_store);. 
7170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7180: 63 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67  changeTempStorag
7190: 65 28 70 50 61 72 73 65 2c 20 7a 52 69 67 68 74  e(pParse, zRight
71a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
71b0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
71c0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
71d0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
71e0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
71f0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
7200: 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74  ory = ""|"direct
7210: 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20  ory_name".  **. 
7220: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
7230: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
7240: 65 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74  e of the temp_st
7250: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c  ore_directory fl
7260: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7270: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7280: 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72  s a specific dir
7290: 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65  ectory to be use
72a0: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
72b0: 66 69 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74  files..  ** Sett
72c0: 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74  ing to a null st
72d0: 72 69 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20  ring reverts to 
72e0: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70  the default temp
72f0: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
7300: 73 65 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20  search..  ** If 
7310: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
7320: 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ory is changed, 
7330: 74 68 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54  then invalidateT
7340: 65 6d 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a  empStorage..  **
7350: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
7360: 67 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f  gTyp_TEMP_STORE_
7370: 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20  DIRECTORY: {.   
7380: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7390: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
73a0: 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65  leText(v, sqlite
73b0: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
73c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
73d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
73e0: 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20  T_WSD.      if( 
73f0: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
7400: 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
7410: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7420: 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70  e3OsAccess(db->p
7430: 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c  Vfs, zRight, SQL
7440: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
7450: 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20  RITE, &res);.   
7460: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
7470: 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30  ITE_OK || res==0
7480: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7490: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
74a0: 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69  arse, "not a wri
74b0: 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22  table directory"
74c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
74d0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
74e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
74f0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
7500: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20  _TEMP_STORE==0. 
7510: 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45        || (SQLITE
7520: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26  _TEMP_STORE==1 &
7530: 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  & db->temp_store
7540: 3c 3d 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  <=1).       || (
7550: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7560: 45 3d 3d 32 20 26 26 20 64 62 2d 3e 74 65 6d 70  E==2 && db->temp
7570: 5f 73 74 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20  _store==1).     
7580: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
7590: 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67  lidateTempStorag
75a0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
75b0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
75c0: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 74 65  _free(sqlite3_te
75d0: 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
75e0: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
75f0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
7600: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
7610: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
7620: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
7630: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
7640: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7650: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7660: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7670: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7680: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7690: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
76a0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
76b0: 57 49 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  WIN.  /*.  **   
76c0: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
76d0: 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a  e_directory.  **
76e0: 20 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73     PRAGMA data_s
76f0: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d  tore_directory =
7700: 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e   ""|"directory_n
7710: 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ame".  **.  ** R
7720: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
7730: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20   local value of 
7740: 74 68 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  the data_store_d
7750: 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20  irectory flag.  
7760: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
7770: 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73  e value sets a s
7780: 70 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72  pecific director
7790: 79 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  y to be used for
77a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
77b0: 74 68 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73  that.  ** were s
77c0: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 20  pecified with a 
77d0: 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
77e0: 65 2e 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61  e.  Setting to a
77f0: 20 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76   null string rev
7800: 65 72 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  erts.  ** to the
7810: 20 64 65 66 61 75 6c 74 20 64 61 74 61 62 61 73   default databas
7820: 65 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69  e directory, whi
7830: 63 68 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ch for database 
7840: 66 69 6c 65 73 20 73 70 65 63 69 66 69 65 64 20  files specified 
7850: 77 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61  with.  ** a rela
7860: 74 69 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70  tive path will p
7870: 72 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65 64  robably be based
7880: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
7890: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
78a0: 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20  e.  ** process. 
78b0: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   Database file s
78c0: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 6e  pecified with an
78d0: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61   absolute path a
78e0: 72 65 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a  re not impacted.
78f0: 20 20 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74    ** by this set
7900: 74 69 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73  ting, regardless
7910: 20 6f 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20   of its value.. 
7920: 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
7930: 50 72 61 67 54 79 70 5f 44 41 54 41 5f 53 54 4f  PragTyp_DATA_STO
7940: 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a  RE_DIRECTORY: {.
7950: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
7960: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
7970: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 73 71 6c  ingleText(v, sql
7980: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
7990: 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ory);.    }else{
79a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
79b0: 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 69  OMIT_WSD.      i
79c0: 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a  f( zRight[0] ){.
79d0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
79e0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
79f0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 64 62  lite3OsAccess(db
7a00: 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68 74 2c 20  ->pVfs, zRight, 
7a10: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
7a20: 41 44 57 52 49 54 45 2c 20 26 72 65 73 29 3b 0a  ADWRITE, &res);.
7a30: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
7a40: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73  SQLITE_OK || res
7a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7a60: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7a70: 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 20  (pParse, "not a 
7a80: 77 72 69 74 61 62 6c 65 20 64 69 72 65 63 74 6f  writable directo
7a90: 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ry");.          
7aa0: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
7ab0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7ac0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7ad0: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 64 61  _free(sqlite3_da
7ae0: 74 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  ta_directory);. 
7af0: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
7b00: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
7b10: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
7b20: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
7b30: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
7b40: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
7b50: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7b60: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7b70: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7b80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7b90: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7ba0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7bb0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
7bc0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
7bd0: 4e 47 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20  NG_STYLE.  /*.  
7be0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
7bf0: 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ema.]lock_proxy_
7c00: 66 69 6c 65 0a 20 20 2a 2a 20 20 20 50 52 41 47  file.  **   PRAG
7c10: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b  MA [schema.]lock
7c20: 5f 70 72 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a  _proxy_file = ":
7c30: 61 75 74 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c  auto:"|"lock_fil
7c40: 65 5f 70 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a  e_path".  **.  *
7c50: 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
7c60: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
7c70: 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
7c80: 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
7c90: 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
7ca0: 73 65 74 73 20 61 20 73 70 65 63 69 66 69 63 20  sets a specific 
7cb0: 66 69 6c 65 20 74 6f 20 62 65 20 75 73 65 64 20  file to be used 
7cc0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 63 63  for database acc
7cd0: 65 73 73 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a  ess locks..  **.
7ce0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7cf0: 54 79 70 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46  Typ_LOCK_PROXY_F
7d00: 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21  ILE: {.    if( !
7d10: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
7d20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
7d30: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
7d40: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  r(pDb->pBt);.   
7d50: 20 20 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66     char *proxy_f
7d60: 69 6c 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b  ile_path = NULL;
7d70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7d80: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c  ile *pFile = sql
7d90: 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
7da0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
7db0: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
7dc0: 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c  lHint(pFile, SQL
7dd0: 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
7de0: 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  YFILE, .        
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 20 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70     &proxy_file_p
7e10: 61 74 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ath);.      retu
7e20: 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20  rnSingleText(v, 
7e30: 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29  proxy_file_path)
7e40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e50: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
7e60: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7e70: 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  ager(pDb->pBt);.
7e80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
7e90: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
7ea0: 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
7eb0: 67 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ger);.      int 
7ec0: 72 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  res;.      if( z
7ed0: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7ee0: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7ef0: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7f00: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7f10: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 20 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20      zRight);.   
7f50: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
7f60: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7f70: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7f80: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7f90: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20      NULL);.     
7fd0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73   }.      if( res
7fe0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7ff0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
8000: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8010: 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f  failed to set lo
8020: 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b  ck proxy file");
8030: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72  .        goto pr
8040: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
8050: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
8060: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
8070: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
8080: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20  OCKING_STYLE */ 
8090: 20 20 20 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a       .    .  /*.
80a0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
80b0: 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f  chema.]synchrono
80c0: 75 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  us.  **   PRAGMA
80d0: 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72   [schema.]synchr
80e0: 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52  onous=OFF|ON|NOR
80f0: 4d 41 4c 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20  MAL|FULL|EXTRA. 
8100: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
8110: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
8120: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
8130: 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20  nchronous flag. 
8140: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
8150: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64  he local value d
8160: 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61  oes not make cha
8170: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b  nges to the disk
8180: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20   file and the.  
8190: 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
81a0: 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65   will be restore
81b0: 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  d the next time 
81c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
81d0: 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a    ** opened..  *
81e0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
81f0: 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a  _SYNCHRONOUS: {.
8200: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
8210: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
8220: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d  ingleInt(v, pDb-
8230: 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29  >safety_level-1)
8240: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8250: 20 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f     if( !db->auto
8260: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
8270: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8280: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
8290: 20 20 20 20 20 20 20 22 53 61 66 65 74 79 20 6c         "Safety l
82a0: 65 76 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20  evel may not be 
82b0: 63 68 61 6e 67 65 64 20 69 6e 73 69 64 65 20 61  changed inside a
82c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a   transaction");.
82d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
82e0: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
82f0: 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28    int iLevel = (
8300: 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a  getSafetyLevel(z
8310: 52 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26 20  Right,0,1)+1) & 
8320: 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
8330: 53 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20  S_MASK;.        
8340: 69 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20  if( iLevel==0 ) 
8350: 69 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20  iLevel = 1;.    
8360: 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
8370: 6c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a  level = iLevel;.
8380: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53 79          pDb->bSy
8390: 6e 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  ncSet = 1;.     
83a0: 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c     setAllPagerFl
83b0: 61 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  ags(db);.      }
83c0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
83d0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
83e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
83f0: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  R_PRAGMAS */..#i
8400: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8410: 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20  T_FLAG_PRAGMAS. 
8420: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4c   case PragTyp_FL
8430: 41 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  AG: {.    if( zR
8440: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
8450: 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74   setPragmaResult
8460: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70  ColumnNames(v, p
8470: 50 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20 72  Pragma);.      r
8480: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
8490: 2c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 70  , (db->flags & p
84a0: 50 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30  Pragma->iArg)!=0
84b0: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
84c0: 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
84d0: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20  pPragma->iArg;  
84e0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
84f0: 73 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65 61  s to set or clea
8500: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
8510: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
8520: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
8530: 46 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70  Foreign key supp
8540: 6f 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 65  ort may not be e
8550: 6e 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62 6c  nabled or disabl
8560: 65 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20  ed while not.   
8570: 20 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d       ** in auto-
8580: 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f  commit mode.  */
8590: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d  .        mask &=
85a0: 20 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   ~(SQLITE_Foreig
85b0: 6e 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a  nKeys);.      }.
85c0: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
85d0: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
85e0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
85f0: 68 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55  h.authLevel==UAU
8600: 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20  TH_User ){.     
8610: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
8620: 6f 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65  ow non-admin use
8630: 72 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  rs to modify the
8640: 20 73 63 68 65 6d 61 20 61 72 62 69 74 72 61 72   schema arbitrar
8650: 69 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ily */.        m
8660: 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ask &= ~(SQLITE_
8670: 57 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20 20  WriteSchema);.  
8680: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
8690: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
86a0: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
86b0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
86c0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73  db->flags |= mas
86d0: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
86e0: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
86f0: 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  s &= ~mask;.    
8700: 20 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51      if( mask==SQ
8710: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 20  LITE_DeferFKs ) 
8720: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
8730: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
8740: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79  }..      /* Many
8750: 20 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72 61   of the flag-pra
8760: 67 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65 20  gmas modify the 
8770: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
8780: 79 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20 20  y the SQL .     
8790: 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65 67   ** compiler (eg
87a0: 2e 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29  . count_changes)
87b0: 2e 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f  . So add an opco
87c0: 64 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c 6c  de to expire all
87d0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
87e0: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
87f0: 73 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69 6e  s after modifyin
8800: 67 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75 65  g a pragma value
8810: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8820: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8830: 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29  p0(v, OP_Expire)
8840: 3b 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61  ;.      setAllPa
8850: 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20  gerFlags(db);.  
8860: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8870: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8880: 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52  ITE_OMIT_FLAG_PR
8890: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
88a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  f SQLITE_OMIT_SC
88b0: 48 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f  HEMA_PRAGMAS.  /
88c0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
88d0: 74 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c  table_info(<tabl
88e0: 65 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  e>).  **.  ** Re
88f0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
8900: 77 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  w for each colum
8910: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74  n of the named t
8920: 61 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e  able. The column
8930: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65  s of.  ** the re
8940: 74 75 72 6e 65 64 20 64 61 74 61 20 73 65 74 20  turned data set 
8950: 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  are:.  **.  ** c
8960: 69 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  id:        Colum
8970: 6e 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20 66  n id (numbered f
8980: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
8990: 74 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20 30  t, starting at 0
89a0: 29 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20  ).  ** name:    
89b0: 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20     Column name. 
89c0: 20 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20 20   ** type:       
89d0: 43 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  Column declarati
89e0: 6f 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f  on type..  ** no
89f0: 74 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20 69  tnull:    True i
8a00: 66 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20  f 'NOT NULL' is 
8a10: 70 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64  part of column d
8a20: 65 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  eclaration.  ** 
8a30: 64 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65 20  dflt_value: The 
8a40: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
8a50: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66  r the column, if
8a60: 20 61 6e 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   any..  */.  cas
8a70: 65 20 50 72 61 67 54 79 70 5f 54 41 42 4c 45 5f  e PragTyp_TABLE_
8a80: 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74  INFO: if( zRight
8a90: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
8aa0: 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  Tab;.    pTab = 
8ab0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
8ac0: 6c 65 28 70 50 61 72 73 65 2c 20 4c 4f 43 41 54  le(pParse, LOCAT
8ad0: 45 5f 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c  E_NOERR, zRight,
8ae0: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
8af0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Tab ){.      int
8b00: 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69 6e 74   i, k;.      int
8b10: 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a 20 20   nHidden = 0;.  
8b20: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
8b30: 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
8b40: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
8b50: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
8b60: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
8b70: 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20  >nMem = 6;.     
8b80: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
8b90: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
8ba0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
8bb0: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
8bc0: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
8bd0: 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Tab);.      for(
8be0: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
8bf0: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
8c00: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
8c10: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
8c20: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f  HiddenColumn(pCo
8c30: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
8c40: 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20  nHidden++;.     
8c50: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8c60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8c70: 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46   if( (pCol->colF
8c80: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
8c90: 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20 20  RIMKEY)==0 ){.  
8ca0: 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20          k = 0;. 
8cb0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8cc0: 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPk==0 ){.     
8cd0: 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20       k = 1;.    
8ce0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8cf0: 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
8d00: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70  =pTab->nCol && p
8d10: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31  Pk->aiColumn[k-1
8d20: 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20  ]!=i; k++){}.   
8d30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
8d40: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70 44 66  ssert( pCol->pDf
8d50: 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70  lt==0 || pCol->p
8d60: 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41  Dflt->op==TK_SPA
8d70: 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
8d80: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
8d90: 64 28 76 2c 20 31 2c 20 22 69 73 73 69 73 69 22  d(v, 1, "issisi"
8da0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8db0: 20 69 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20   i-nHidden,.    
8dc0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
8dd0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
8de0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
8df0: 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22  lumnType(pCol,""
8e00: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
8e10: 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20    pCol->notNull 
8e20: 3f 20 31 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  ? 1 : 0,.       
8e30: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44          pCol->pD
8e40: 66 6c 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c  flt ? pCol->pDfl
8e50: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c  t->u.zToken : 0,
8e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e70: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
8e80: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
8e90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8ea0: 42 55 47 0a 20 20 63 61 73 65 20 50 72 61 67 54  BUG.  case PragT
8eb0: 79 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20 20 20  yp_STATS: {.    
8ec0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
8ed0: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
8ee0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
8ef0: 20 35 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   5;.    sqlite3C
8f00: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
8f10: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
8f20: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
8f30: 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53  shFirst(&pDb->pS
8f40: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
8f50: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
8f60: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 20 20  Next(i)){.      
8f70: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
8f80: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
8f90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8fa0: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
8fb0: 2c 20 22 73 73 69 69 69 22 2c 0a 20 20 20 20 20  , "ssiii",.     
8fc0: 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
8fd0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 30 2c  e,.           0,
8fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
8ff0: 2d 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20 20 20  ->szTabRow,.    
9000: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f         pTab->nRo
9010: 77 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20 20 20  wLogEst,.       
9020: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
9030: 67 73 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  gs);.      for(p
9040: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
9050: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
9060: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
9070: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9080: 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20 22 73  ltiLoad(v, 2, "s
9090: 69 69 69 58 22 2c 0a 20 20 20 20 20 20 20 20 20  iiiX",.         
90a0: 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20    pIdx->zName,. 
90b0: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
90c0: 73 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20 20  szIdxRow,.      
90d0: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f 77       pIdx->aiRow
90e0: 4c 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20 20 20  LogEst[0],.     
90f0: 20 20 20 20 20 20 70 49 64 78 2d 3e 68 61 73 53        pIdx->hasS
9100: 74 61 74 31 29 3b 0a 20 20 20 20 20 20 20 20 73  tat1);.        s
9110: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9120: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9130: 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 7d  , 1, 5);.      }
9140: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
9150: 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61  ak;.#endif..  ca
9160: 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58  se PragTyp_INDEX
9170: 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68  _INFO: if( zRigh
9180: 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t ){.    Index *
9190: 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20  pIdx;.    Table 
91a0: 2a 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78 20  *pTab;.    pIdx 
91b0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
91c0: 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a  ex(db, zRight, z
91d0: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  Db);.    if( pId
91e0: 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  x ){.      int i
91f0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 3b 0a  ;.      int mx;.
9200: 20 20 20 20 20 20 69 66 28 20 70 50 72 61 67 6d        if( pPragm
9210: 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20 20 20  a->iArg ){.     
9220: 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64     /* PRAGMA ind
9230: 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77 65 72 20  ex_xinfo (newer 
9240: 76 65 72 73 69 6f 6e 20 77 69 74 68 20 6d 6f 72  version with mor
9250: 65 20 72 6f 77 73 20 61 6e 64 20 63 6f 6c 75 6d  e rows and colum
9260: 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ns) */.        m
9270: 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  x = pIdx->nColum
9280: 6e 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  n;.        pPars
9290: 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20  e->nMem = 6;.   
92a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
92b0: 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65    /* PRAGMA inde
92c0: 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63 79 20 76  x_info (legacy v
92d0: 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 20  ersion) */.     
92e0: 20 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 4b     mx = pIdx->nK
92f0: 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  eyCol;.        p
9300: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b  Parse->nMem = 3;
9310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
9320: 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
9330: 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  le;.      sqlite
9340: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
9350: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
9360: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9370: 61 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61  arse->nMem<=pPra
9380: 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 20  gma->nPragCName 
9390: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
93a0: 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<mx; i++){.  
93b0: 20 20 20 20 20 20 69 31 36 20 63 6e 75 6d 20 3d        i16 cnum =
93c0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
93d0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  i];.        sqli
93e0: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
93f0: 28 76 2c 20 31 2c 20 22 69 69 73 58 22 2c 20 69  (v, 1, "iisX", i
9400: 2c 20 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  , cnum,.        
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9420: 20 20 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20       cnum<0 ? 0 
9430: 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75  : pTab->aCol[cnu
9440: 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m].zName);.     
9450: 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e     if( pPragma->
9460: 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iArg ){.        
9470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9480: 74 69 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73  tiLoad(v, 4, "is
9490: 69 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iX",.           
94a0: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
94b0: 72 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  r[i],.          
94c0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69    pIdx->azColl[i
94d0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ],.            i
94e0: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  <pIdx->nKeyCol);
94f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9510: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
9520: 74 52 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d  tRow, 1, pParse-
9530: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  >nMem);.      }.
9540: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9550: 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  k;..  case PragT
9560: 79 70 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69  yp_INDEX_LIST: i
9570: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
9580: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9590: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
95a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54     int i;.    pT
95b0: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
95c0: 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74  Table(db, zRight
95d0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
95e0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 50  pTab ){.      pP
95f0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a  arse->nMem = 5;.
9600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
9610: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
9620: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
9630: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
9640: 3e 70 49 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49  >pIndex, i=0; pI
9650: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
9660: 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Next, i++){.    
9670: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9680: 61 7a 4f 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22  azOrigin[] = { "
9690: 63 22 2c 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b  c", "u", "pk" };
96a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
96b0: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
96c0: 20 31 2c 20 22 69 73 69 73 69 22 2c 0a 20 20 20   1, "isisi",.   
96d0: 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20          i,.     
96e0: 20 20 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d        pIdx->zNam
96f0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 49 73  e,.           Is
9700: 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
9710: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  ),.           az
9720: 4f 72 69 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78  Origin[pIdx->idx
9730: 54 79 70 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Type],.         
9740: 20 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78    pIdx->pPartIdx
9750: 57 68 65 72 65 21 3d 30 29 3b 0a 20 20 20 20 20  Where!=0);.     
9760: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
9770: 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72  reak;..  case Pr
9780: 61 67 54 79 70 5f 44 41 54 41 42 41 53 45 5f 4c  agTyp_DATABASE_L
9790: 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  IST: {.    int i
97a0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
97b0: 65 6d 20 3d 20 33 3b 0a 20 20 20 20 66 6f 72 28  em = 3;.    for(
97c0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
97d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
97e0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d  db->aDb[i].pBt==
97f0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
9800: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
9810: 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 21  aDb[i].zDbSName!
9820: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
9830: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9840: 28 76 2c 20 31 2c 20 22 69 73 73 22 2c 0a 20 20  (v, 1, "iss",.  
9850: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
9860: 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44     db->aDb[i].zD
9870: 62 53 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  bSName,.        
9880: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
9890: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
98a0: 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 7d  [i].pBt));.    }
98b0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20  .  }.  break;.. 
98c0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f   case PragTyp_CO
98d0: 4c 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a  LLATION_LIST: {.
98e0: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
98f0: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
9900: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
9910: 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 70 3d   = 2;.    for(p=
9920: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
9930: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20  &db->aCollSeq); 
9940: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
9950: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 43  ext(p)){.      C
9960: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
9970: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
9980: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
9990: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
99a0: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
99b0: 69 73 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d  is", i++, pColl-
99c0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
99d0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66   }.  break;..#if
99e0: 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f  def SQLITE_INTRO
99f0: 53 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53  SPECTION_PRAGMAS
9a00: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9a10: 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b  FUNCTION_LIST: {
9a20: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
9a30: 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20  HashElem *j;.   
9a40: 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 20   FuncDef *p;.   
9a50: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9a60: 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  2;.    for(i=0; 
9a70: 69 3c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 48 41  i<SQLITE_FUNC_HA
9a80: 53 48 5f 53 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20  SH_SZ; i++){.   
9a90: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 33     for(p=sqlite3
9aa0: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
9ab0: 2e 61 5b 69 5d 3b 20 70 3b 20 70 3d 70 2d 3e 75  .a[i]; p; p=p->u
9ac0: 2e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  .pHash ){.      
9ad0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9ae0: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 69  tiLoad(v, 1, "si
9af0: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 31 29 3b  ", p->zName, 1);
9b00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9b10: 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65 48     for(j=sqliteH
9b20: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46  ashFirst(&db->aF
9b30: 75 6e 63 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69 74  unc); j; j=sqlit
9b40: 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a 20  eHashNext(j)){. 
9b50: 20 20 20 20 20 70 20 3d 20 28 46 75 6e 63 44 65       p = (FuncDe
9b60: 66 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  f*)sqliteHashDat
9b70: 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  a(j);.      sqli
9b80: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9b90: 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d 3e  (v, 1, "si", p->
9ba0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  zName, 0);.    }
9bb0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23  .  }.  break;..#
9bc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9bd0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
9be0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4d    case PragTyp_M
9bf0: 4f 44 55 4c 45 5f 4c 49 53 54 3a 20 7b 0a 20 20  ODULE_LIST: {.  
9c00: 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a 20    HashElem *j;. 
9c10: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9c20: 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 73  = 1;.    for(j=s
9c30: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9c40: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 6a 3b  db->aModule); j;
9c50: 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   j=sqliteHashNex
9c60: 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 4d 6f 64  t(j)){.      Mod
9c70: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
9c80: 75 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ule*)sqliteHashD
9c90: 61 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71  ata(j);.      sq
9ca0: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9cb0: 61 64 28 76 2c 20 31 2c 20 22 73 22 2c 20 70 4d  ad(v, 1, "s", pM
9cc0: 6f 64 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  od->zName);.    
9cd0: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
9ce0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9cf0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9d00: 45 20 2a 2f 0a 0a 20 20 63 61 73 65 20 50 72 61  E */..  case Pra
9d10: 67 54 79 70 5f 50 52 41 47 4d 41 5f 4c 49 53 54  gTyp_PRAGMA_LIST
9d20: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  : {.    int i;. 
9d30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
9d40: 72 61 79 53 69 7a 65 28 61 50 72 61 67 6d 61 4e  raySize(aPragmaN
9d50: 61 6d 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ame); i++){.    
9d60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9d70: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 22  tiLoad(v, 1, "s"
9d80: 2c 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 69 5d  , aPragmaName[i]
9d90: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
9da0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
9db0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54  if /* SQLITE_INT
9dc0: 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d  ROSPECTION_PRAGM
9dd0: 41 53 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  AS */..#endif /*
9de0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
9df0: 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  EMA_PRAGMAS */..
9e00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9e10: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
9e20: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46    case PragTyp_F
9e30: 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49 53 54 3a  OREIGN_KEY_LIST:
9e40: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
9e50: 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20 20     FKey *pFK;.  
9e60: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
9e70: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
9e80: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
9e90: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
9ea0: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
9eb0: 20 20 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e 70     pFK = pTab->p
9ec0: 46 4b 65 79 3b 0a 20 20 20 20 20 20 69 66 28 20  FKey;.      if( 
9ed0: 70 46 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pFK ){.        i
9ee0: 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20  nt i = 0; .     
9ef0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9f00: 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 8;.        sql
9f10: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
9f20: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
9f30: 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
9f40: 28 70 46 4b 29 7b 0a 20 20 20 20 20 20 20 20 20  (pFK){.         
9f50: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
9f60: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b    for(j=0; j<pFK
9f70: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
9f80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9f90: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9fa0: 2c 20 31 2c 20 22 69 69 73 73 73 73 73 73 22 2c  , 1, "iissssss",
9fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9fc0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20      i,.         
9fd0: 20 20 20 20 20 20 20 20 20 20 6a 2c 0a 20 20 20            j,.   
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20 20 20  pFK->zTo,.      
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
a010: 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61 43 6f  b->aCol[pFK->aCo
a020: 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d  l[j].iFrom].zNam
a030: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
a040: 20 20 20 20 20 20 70 46 4b 2d 3e 61 43 6f 6c 5b        pFK->aCol[
a050: 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20 20 20  j].zCol,.       
a060: 20 20 20 20 20 20 20 20 20 20 20 20 61 63 74 69              acti
a070: 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74  onName(pFK->aAct
a080: 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f 4e 20  ion[1]),  /* ON 
a090: 55 50 44 41 54 45 20 2a 2f 0a 20 20 20 20 20 20  UPDATE */.      
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63 74               act
a0b0: 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63  ionName(pFK->aAc
a0c0: 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20 4f 4e  tion[0]),  /* ON
a0d0: 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20 20 20   DELETE */.     
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e                "N
a0f0: 4f 4e 45 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ONE");.         
a100: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2b 2b 69   }.          ++i
a110: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 20  ;.          pFK 
a120: 3d 20 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d  = pFK->pNextFrom
a130: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a140: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
a150: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
a160: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a170: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
a180: 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  Y) */..#ifndef S
a190: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
a1a0: 47 4e 5f 4b 45 59 0a 23 69 66 6e 64 65 66 20 53  GN_KEY.#ifndef S
a1b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
a1c0: 45 52 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ER.  case PragTy
a1d0: 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 43 48  p_FOREIGN_KEY_CH
a1e0: 45 43 4b 3a 20 7b 0a 20 20 20 20 46 4b 65 79 20  ECK: {.    FKey 
a1f0: 2a 70 46 4b 3b 20 20 20 20 20 20 20 20 20 20 20  *pFK;           
a200: 20 20 2f 2a 20 41 20 66 6f 72 65 69 67 6e 20 6b    /* A foreign k
a210: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ey constraint */
a220: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
a230: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
a240: 68 69 6c 64 20 74 61 62 6c 65 20 63 6f 6e 74 61  hild table conta
a250: 69 6e 20 22 52 45 46 45 52 45 4e 43 45 53 22 20  in "REFERENCES" 
a260: 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 20 20 54  keyword */.    T
a270: 61 62 6c 65 20 2a 70 50 61 72 65 6e 74 3b 20 20  able *pParent;  
a280: 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20        /* Parent 
a290: 74 61 62 6c 65 20 74 68 61 74 20 63 68 69 6c 64  table that child
a2a0: 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20   points to */.  
a2b0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
a2c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
a2d0: 78 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  x in the parent 
a2e0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
a2f0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
a300: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
a310: 74 65 72 3a 20 20 46 6f 72 65 69 67 6e 20 6b 65  ter:  Foreign ke
a320: 79 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 54 61  y number for pTa
a330: 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20  b */.    int j; 
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a  /* Loop counter:
a360: 20 20 46 69 65 6c 64 20 6f 66 20 74 68 65 20 66    Field of the f
a370: 6f 72 65 69 67 6e 20 6b 65 79 20 2a 2f 0a 20 20  oreign key */.  
a380: 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
a390: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
a3a0: 20 63 6f 75 6e 74 65 72 3a 20 20 4e 65 78 74 20   counter:  Next 
a3b0: 74 61 62 6c 65 20 69 6e 20 73 63 68 65 6d 61 20  table in schema 
a3c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 78 3b 20 20 20  */.    int x;   
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a3e0: 20 72 65 73 75 6c 74 20 76 61 72 69 61 62 6c 65   result variable
a3f0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
a400: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 2f  esult;         /
a410: 2a 20 33 20 72 65 67 69 73 74 65 72 73 20 74 6f  * 3 registers to
a420: 20 68 6f 6c 64 20 61 20 72 65 73 75 6c 74 20 72   hold a result r
a430: 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ow */.    int re
a440: 67 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  gKey;           
a450: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20   /* Register to 
a460: 68 6f 6c 64 20 6b 65 79 20 66 6f 72 20 63 68 65  hold key for che
a470: 63 6b 69 6e 67 20 74 68 65 20 46 4b 20 2a 2f 0a  cking the FK */.
a480: 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 20      int regRow; 
a490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
a4a0: 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
a4b0: 61 20 72 6f 77 20 66 72 6f 6d 20 70 54 61 62 20  a row from pTab 
a4c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54  */.    int addrT
a4d0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
a4e0: 20 54 6f 70 20 6f 66 20 61 20 6c 6f 6f 70 20 63   Top of a loop c
a4f0: 68 65 63 6b 69 6e 67 20 66 6f 72 65 69 67 6e 20  hecking foreign 
a500: 6b 65 79 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  keys */.    int 
a510: 61 64 64 72 4f 6b 3b 20 20 20 20 20 20 20 20 20  addrOk;         
a520: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
a530: 69 66 20 74 68 65 20 6b 65 79 20 69 73 20 4f 4b  if the key is OK
a540: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61 69 43   */.    int *aiC
a550: 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ols;           /
a560: 2a 20 63 68 69 6c 64 20 74 6f 20 70 61 72 65 6e  * child to paren
a570: 74 20 63 6f 6c 75 6d 6e 20 6d 61 70 70 69 6e 67  t column mapping
a580: 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52 65 73 75   */..    regResu
a590: 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  lt = pParse->nMe
a5a0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
a5b0: 3e 6e 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20 20 20  >nMem += 4;.    
a5c0: 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50 61 72 73  regKey = ++pPars
a5d0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
a5e0: 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Row = ++pParse->
a5f0: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
a600: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
a610: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
a620: 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61      k = sqliteHa
a630: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
a640: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [iDb].pSchema->t
a650: 62 6c 48 61 73 68 29 3b 0a 20 20 20 20 77 68 69  blHash);.    whi
a660: 6c 65 28 20 6b 20 29 7b 0a 20 20 20 20 20 20 69  le( k ){.      i
a670: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
a680: 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69       pTab = sqli
a690: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
a6a0: 50 61 72 73 65 2c 20 30 2c 20 7a 52 69 67 68 74  Parse, 0, zRight
a6b0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , zDb);.        
a6c0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  k = 0;.      }el
a6d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  se{.        pTab
a6e0: 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
a6f0: 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
a700: 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65        k = sqlite
a710: 48 61 73 68 4e 65 78 74 28 6b 29 3b 0a 20 20 20  HashNext(k);.   
a720: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a730: 54 61 62 3d 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  Tab==0 || pTab->
a740: 70 46 4b 65 79 3d 3d 30 20 29 20 63 6f 6e 74 69  pFKey==0 ) conti
a750: 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nue;.      sqlit
a760: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
a770: 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
a780: 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
a790: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
a7a0: 70 54 61 62 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f  pTab->nCol+regRo
a7b0: 77 3e 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  w>pParse->nMem )
a7c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
a7d0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67  pTab->nCol + reg
a7e0: 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
a7f0: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
a800: 73 65 2c 20 30 2c 20 69 44 62 2c 20 70 54 61 62  se, 0, iDb, pTab
a810: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
a820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a830: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 72  eLoadString(v, r
a840: 65 67 52 65 73 75 6c 74 2c 20 70 54 61 62 2d 3e  egResult, pTab->
a850: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f  zName);.      fo
a860: 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d  r(i=1, pFK=pTab-
a870: 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b  >pFKey; pFK; i++
a880: 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74  , pFK=pFK->pNext
a890: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70  From){.        p
a8a0: 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  Parent = sqlite3
a8b0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46  FindTable(db, pF
a8c0: 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20  K->zTo, zDb);.  
a8d0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e        if( pParen
a8e0: 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
a8f0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20  .        pIdx = 
a900: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
a910: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
a920: 73 65 2c 20 69 44 62 2c 20 70 50 61 72 65 6e 74  se, iDb, pParent
a930: 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 50 61 72 65  ->tnum, 0, pPare
a940: 6e 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  nt->zName);.    
a950: 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 46      x = sqlite3F
a960: 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50 61  kLocateIndex(pPa
a970: 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 46  rse, pParent, pF
a980: 4b 2c 20 26 70 49 64 78 2c 20 30 29 3b 0a 20 20  K, &pIdx, 0);.  
a990: 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29        if( x==0 )
a9a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
a9b0: 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx==0 ){.     
a9c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
a9d0: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
a9e0: 69 2c 20 69 44 62 2c 20 70 50 61 72 65 6e 74 2c  i, iDb, pParent,
a9f0: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
aa00: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
aa20: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
aa30: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 2c   OP_OpenRead, i,
aa40: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
aa50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
aa60: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
aa70: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
aa80: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
aa90: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
aaa0: 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30  .          k = 0
aab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
aac0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
aad0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
aae0: 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  t( pParse->nErr>
aaf0: 30 20 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b 0a 20  0 || pFK==0 );. 
ab00: 20 20 20 20 20 69 66 28 20 70 46 4b 20 29 20 62       if( pFK ) b
ab10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
ab20: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3c 69 20 29  pParse->nTab<i )
ab30: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
ab40: 69 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  i;.      addrTop
ab50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ab60: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
ab70: 64 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  d, 0); VdbeCover
ab80: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  age(v);.      fo
ab90: 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d  r(i=1, pFK=pTab-
aba0: 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b  >pFKey; pFK; i++
abb0: 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74  , pFK=pFK->pNext
abc0: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70  From){.        p
abd0: 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  Parent = sqlite3
abe0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46  FindTable(db, pF
abf0: 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20  K->zTo, zDb);.  
ac00: 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a        pIdx = 0;.
ac10: 20 20 20 20 20 20 20 20 61 69 43 6f 6c 73 20 3d          aiCols =
ac20: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
ac30: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20  pParent ){.     
ac40: 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
ac50: 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50  FkLocateIndex(pP
ac60: 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  arse, pParent, p
ac70: 46 4b 2c 20 26 70 49 64 78 2c 20 26 61 69 43 6f  FK, &pIdx, &aiCo
ac80: 6c 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ls);.          a
ac90: 73 73 65 72 74 28 20 78 3d 3d 30 20 29 3b 0a 20  ssert( x==0 );. 
aca0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
acb0: 20 61 64 64 72 4f 6b 20 3d 20 73 71 6c 69 74 65   addrOk = sqlite
acc0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
acd0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47  );..        /* G
ace0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
acf0: 72 65 61 64 20 74 68 65 20 63 68 69 6c 64 20 6b  read the child k
ad00: 65 79 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 72  ey values into r
ad10: 65 67 69 73 74 65 72 73 0a 20 20 20 20 20 20 20  egisters.       
ad20: 20 2a 2a 20 72 65 67 52 6f 77 2e 2e 72 65 67 52   ** regRow..regR
ad30: 6f 77 2b 6e 2e 20 49 66 20 61 6e 79 20 6f 66 20  ow+n. If any of 
ad40: 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 76 61  the child key va
ad50: 6c 75 65 73 20 61 72 65 20 4e 55 4c 4c 2c 20 74  lues are NULL, t
ad60: 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
ad70: 72 6f 77 20 63 61 6e 6e 6f 74 20 63 61 75 73 65  row cannot cause
ad80: 20 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e   an FK violation
ad90: 2e 20 4a 75 6d 70 20 64 69 72 65 63 74 6c 79 20  . Jump directly 
ada0: 74 6f 20 61 64 64 72 4f 6b 20 69 6e 20 0a 20 20  to addrOk in .  
adb0: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
adc0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  se. */.        f
add0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e  or(j=0; j<pFK->n
ade0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
adf0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
ae00: 61 69 43 6f 6c 73 20 3f 20 61 69 43 6f 6c 73 5b  aiCols ? aiCols[
ae10: 6a 5d 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a  j] : pFK->aCol[j
ae20: 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20  ].iFrom;.       
ae30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ae40: 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
ae50: 6c 65 28 76 2c 20 70 54 61 62 2c 20 30 2c 20 69  le(v, pTab, 0, i
ae60: 43 6f 6c 2c 20 72 65 67 52 6f 77 2b 6a 29 3b 0a  Col, regRow+j);.
ae70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ae80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ae90: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77  P_IsNull, regRow
aea0: 2b 6a 2c 20 61 64 64 72 4f 6b 29 3b 20 56 64 62  +j, addrOk); Vdb
aeb0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
aec0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
aed0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
aee0: 65 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 70  e to query the p
aef0: 61 72 65 6e 74 20 69 6e 64 65 78 20 66 6f 72 20  arent index for 
af00: 61 20 6d 61 74 63 68 69 6e 67 20 70 61 72 65 6e  a matching paren
af10: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79  t.        ** key
af20: 2e 20 49 66 20 61 20 6d 61 74 63 68 20 69 73 20  . If a match is 
af30: 66 6f 75 6e 64 2c 20 6a 75 6d 70 20 74 6f 20 61  found, jump to a
af40: 64 64 72 4f 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  ddrOk. */.      
af50: 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
af60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
af70: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
af80: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
af90: 6f 77 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72  ow, pFK->nCol, r
afa0: 65 67 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20  egKey,.         
afb0: 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65       sqlite3Inde
afc0: 78 41 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c  xAffinityStr(db,
afd0: 70 49 64 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c  pIdx), pFK->nCol
afe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
aff0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
b000: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
b010: 2c 20 61 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79  , addrOk, regKey
b020: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
b030: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b040: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
b050: 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
b060: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 20          int jmp 
b070: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
b080: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 3b 0a 20  rentAddr(v)+2;. 
b090: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b0a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b0b0: 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 2c 20 6a  _SeekRowid, i, j
b0c0: 6d 70 2c 20 72 65 67 52 6f 77 29 3b 20 56 64 62  mp, regRow); Vdb
b0d0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b0e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b0f0: 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 4f  dbeGoto(v, addrO
b100: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  k);.          as
b110: 73 65 72 74 28 20 70 46 4b 2d 3e 6e 43 6f 6c 3d  sert( pFK->nCol=
b120: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  =1 );.        }.
b130: 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  .        /* Gene
b140: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 70  rate code to rep
b150: 6f 72 74 20 61 6e 20 46 4b 20 76 69 6f 6c 61 74  ort an FK violat
b160: 69 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ion to the calle
b170: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  r. */.        if
b180: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
b190: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b1a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b1b0: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20  v, OP_Rowid, 0, 
b1c0: 72 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20  regResult+1);.  
b1d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b1e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b1f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
b200: 75 6c 6c 2c 20 30 2c 20 72 65 67 52 65 73 75 6c  ull, 0, regResul
b210: 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t+1);.        }.
b220: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b230: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
b240: 72 65 67 52 65 73 75 6c 74 2b 32 2c 20 22 73 69  regResult+2, "si
b250: 58 22 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d  X", pFK->zTo, i-
b260: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
b270: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b280: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
b290: 65 67 52 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20  egResult, 4);.  
b2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b2b0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
b2c0: 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20   addrOk);.      
b2d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
b2e0: 64 62 2c 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20  db, aiCols);.   
b2f0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b300: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b310: 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64 72  OP_Next, 0, addr
b320: 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  Top+1); VdbeCove
b330: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
b340: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
b350: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
b360: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
b370: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  k;.#endif /* !de
b380: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b390: 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 23 65  T_TRIGGER) */.#e
b3a0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
b3b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
b3c0: 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69  EIGN_KEY) */..#i
b3d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 63  fndef NDEBUG.  c
b3e0: 61 73 65 20 50 72 61 67 54 79 70 5f 50 41 52 53  ase PragTyp_PARS
b3f0: 45 52 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20  ER_TRACE: {.    
b400: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
b410: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
b420: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
b430: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
b440: 73 71 6c 69 74 65 33 50 61 72 73 65 72 54 72 61  sqlite3ParserTra
b450: 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73  ce(stdout, "pars
b460: 65 72 3a 20 22 29 3b 0a 20 20 20 20 20 20 7d 65  er: ");.      }e
b470: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
b480: 69 74 65 33 50 61 72 73 65 72 54 72 61 63 65 28  ite3ParserTrace(
b490: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
b4a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
b4b0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
b4c0: 65 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b  einstall the LIK
b4d0: 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74  E and GLOB funct
b4e0: 69 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61  ions.  The varia
b4f0: 6e 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20  nt of LIKE.  ** 
b500: 75 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73  used will be cas
b510: 65 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e  e sensitive or n
b520: 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ot depending on 
b530: 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
b540: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 53  case PragTyp_CAS
b550: 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45  E_SENSITIVE_LIKE
b560: 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
b570: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
b580: 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46  te3RegisterLikeF
b590: 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c  unctions(db, sql
b5a0: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
b5b0: 52 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20  Right, 0));.    
b5c0: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
b5d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49  #ifndef SQLITE_I
b5e0: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45  NTEGRITY_CHECK_E
b5f0: 52 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e  RROR_MAX.# defin
b600: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49  e SQLITE_INTEGRI
b610: 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d  TY_CHECK_ERROR_M
b620: 41 58 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23  AX 100.#endif..#
b630: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b640: 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
b650: 43 4b 0a 20 20 2f 2a 20 20 20 20 50 52 41 47 4d  CK.  /*    PRAGM
b660: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
b670: 6b 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41  k.  **    PRAGMA
b680: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
b690: 28 4e 29 0a 20 20 2a 2a 20 20 20 20 50 52 41 47  (N).  **    PRAG
b6a0: 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 0a 20  MA quick_check. 
b6b0: 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75   **    PRAGMA qu
b6c0: 69 63 6b 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a  ick_check(N).  *
b6d0: 2a 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  *.  ** Verify th
b6e0: 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
b6f0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
b700: 2a 0a 20 20 2a 2a 20 54 68 65 20 22 71 75 69 63  *.  ** The "quic
b710: 6b 5f 63 68 65 63 6b 22 20 69 73 20 72 65 64 75  k_check" is redu
b720: 63 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a  ced version of .
b730: 20 20 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f 63    ** integrity_c
b740: 68 65 63 6b 20 64 65 73 69 67 6e 65 64 20 74 6f  heck designed to
b750: 20 64 65 74 65 63 74 20 6d 6f 73 74 20 64 61 74   detect most dat
b760: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
b770: 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .  ** without th
b780: 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 63 72  e overhead of cr
b790: 6f 73 73 2d 63 68 65 63 6b 69 6e 67 20 69 6e 64  oss-checking ind
b7a0: 65 78 65 73 2e 20 20 51 75 69 63 6b 5f 63 68 65  exes.  Quick_che
b7b0: 63 6b 0a 20 20 2a 2a 20 69 73 20 6c 69 6e 65 61  ck.  ** is linea
b7c0: 72 20 74 69 6d 65 20 77 68 65 72 65 61 73 65 20  r time wherease 
b7d0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
b7e0: 69 73 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a  is O(NlogN)..  *
b7f0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
b800: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
b810: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a  : {.    int i, j
b820: 2c 20 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a 0a  , addr, mxErr;..
b830: 20 20 20 20 69 6e 74 20 69 73 51 75 69 63 6b 20      int isQuick 
b840: 3d 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65  = (sqlite3Tolowe
b850: 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71 27  r(zLeft[0])=='q'
b860: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
b870: 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64  e PRAGMA command
b880: 20 77 61 73 20 6f 66 20 74 68 65 20 66 6f 72 6d   was of the form
b890: 20 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69 6e   "PRAGMA <db>.in
b8a0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 2c 0a  tegrity_check",.
b8b0: 20 20 20 20 2a 2a 20 74 68 65 6e 20 69 44 62 20      ** then iDb 
b8c0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
b8d0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
b8e0: 61 73 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ase identified b
b8f0: 79 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20 49  y <db>..    ** I
b900: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
b910: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 64 61   integrity of da
b920: 74 61 62 61 73 65 20 69 44 62 20 6f 6e 6c 79 20  tabase iDb only 
b930: 69 73 20 76 65 72 69 66 69 65 64 20 62 79 0a 20  is verified by. 
b940: 20 20 20 2a 2a 20 74 68 65 20 56 44 42 45 20 63     ** the VDBE c
b950: 72 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20 20  reated below..  
b960: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65    **.    ** Othe
b970: 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f  rwise, if the co
b980: 6d 6d 61 6e 64 20 77 61 73 20 73 69 6d 70 6c 79  mmand was simply
b990: 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   "PRAGMA integri
b9a0: 74 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20 20  ty_check" (or.  
b9b0: 20 20 2a 2a 20 22 50 52 41 47 4d 41 20 71 75 69    ** "PRAGMA qui
b9c0: 63 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68 65 6e  ck_check"), then
b9d0: 20 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 30   iDb is set to 0
b9e0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
b9f0: 73 65 74 20 69 44 62 0a 20 20 20 20 2a 2a 20 74  set iDb.    ** t
ba00: 6f 20 2d 31 20 68 65 72 65 2c 20 74 6f 20 69 6e  o -1 here, to in
ba10: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
ba20: 56 44 42 45 20 73 68 6f 75 6c 64 20 76 65 72 69  VDBE should veri
ba30: 66 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  fy the integrity
ba40: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 61  .    ** of all a
ba50: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
ba60: 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  s.  */.    asser
ba70: 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20  t( iDb>=0 );.   
ba80: 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20   assert( iDb==0 
ba90: 7c 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20 20  || pId2->z );.  
baa0: 20 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d 30    if( pId2->z==0
bab0: 20 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20 20   ) iDb = -1;..  
bac0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
bad0: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
bae0: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
baf0: 6e 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20 2f  nMem = 6;..    /
bb00: 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
bb10: 6d 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f  m error count */
bb20: 0a 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c  .    mxErr = SQL
bb30: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
bb40: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20  ECK_ERROR_MAX;. 
bb50: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
bb60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65  .      sqlite3Ge
bb70: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
bb80: 6d 78 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66  mxErr);.      if
bb90: 28 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20  ( mxErr<=0 ){.  
bba0: 20 20 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51        mxErr = SQ
bbb0: 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43  LITE_INTEGRITY_C
bbc0: 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a  HECK_ERROR_MAX;.
bbd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bbe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bbf0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
bc00: 72 2c 20 6d 78 45 72 72 2d 31 2c 20 31 29 3b 20  r, mxErr-1, 1); 
bc10: 2f 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20  /* reg[1] holds 
bc20: 65 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a  errors left */..
bc30: 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74      /* Do an int
bc40: 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6e 20  egrity check on 
bc50: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
bc60: 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  le */.    for(i=
bc70: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
bc80: 2b 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c  +){.      HashEl
bc90: 65 6d 20 2a 78 3b 20 20 20 20 20 2f 2a 20 46 6f  em *x;     /* Fo
bca0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
bcb0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73 63 68  ables in the sch
bcc0: 65 6d 61 20 2a 2f 0a 20 20 20 20 20 20 48 61 73  ema */.      Has
bcd0: 68 20 2a 70 54 62 6c 73 3b 20 20 20 20 20 2f 2a  h *pTbls;     /*
bce0: 20 53 65 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c   Set of all tabl
bcf0: 65 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  es in the schema
bd00: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   */.      int *a
bd10: 52 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20 41 72  Root;      /* Ar
bd20: 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  ray of root page
bd30: 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20   numbers of all 
bd40: 62 74 72 65 65 73 20 2a 2f 0a 20 20 20 20 20 20  btrees */.      
bd50: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20  int cnt = 0;    
bd60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
bd70: 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d  tries in aRoot[]
bd80: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6d 78   */.      int mx
bd90: 49 64 78 20 3d 20 30 3b 20 20 20 2f 2a 20 4d 61  Idx = 0;   /* Ma
bda0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
bdb0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 79 20  indexes for any 
bdc0: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20  table */..      
bdd0: 69 66 28 20 4f 4d 49 54 5f 54 45 4d 50 44 42 20  if( OMIT_TEMPDB 
bde0: 26 26 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e  && i==1 ) contin
bdf0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44  ue;.      if( iD
be00: 62 3e 3d 30 20 26 26 20 69 21 3d 69 44 62 20 29  b>=0 && i!=iDb )
be10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
be20: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
be30: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
be40: 2c 20 69 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  , i);..      /* 
be50: 44 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20  Do an integrity 
be60: 63 68 65 63 6b 20 6f 66 20 74 68 65 20 42 2d 54  check of the B-T
be70: 72 65 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ree.      **.   
be80: 20 20 20 2a 2a 20 42 65 67 69 6e 20 62 79 20 66     ** Begin by f
be90: 69 6e 64 69 6e 67 20 74 68 65 20 72 6f 6f 74 20  inding the root 
bea0: 70 61 67 65 73 20 6e 75 6d 62 65 72 73 0a 20 20  pages numbers.  
beb0: 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74      ** for all t
bec0: 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
bed0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
bee0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
bef0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
bf00: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
bf10: 28 64 62 2c 20 69 2c 20 30 29 20 29 3b 0a 20 20  (db, i, 0) );.  
bf20: 20 20 20 20 70 54 62 6c 73 20 3d 20 26 64 62 2d      pTbls = &db-
bf30: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[i].pSchema-
bf40: 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 20 20  >tblHash;.      
bf50: 66 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c  for(cnt=0, x=sql
bf60: 69 74 65 48 61 73 68 46 69 72 73 74 28 70 54 62  iteHashFirst(pTb
bf70: 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65  ls); x; x=sqlite
bf80: 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20  HashNext(x)){.  
bf90: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
bfa0: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
bfb0: 74 61 28 78 29 3b 20 20 2f 2a 20 43 75 72 72 65  ta(x);  /* Curre
bfc0: 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  nt table */.    
bfd0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
c000: 78 20 6f 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  x on pTab */.   
c010: 20 20 20 20 20 69 6e 74 20 6e 49 64 78 3b 20 20       int nIdx;  
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c040: 20 6f 66 20 69 6e 64 65 78 65 73 20 6f 6e 20 70   of indexes on p
c050: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  Tab */.        i
c060: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
c070: 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  ) ) cnt++;.     
c080: 20 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70     for(nIdx=0, p
c090: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
c0a0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
c0b0: 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b  x->pNext, nIdx++
c0c0: 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20  ){ cnt++; }.    
c0d0: 20 20 20 20 69 66 28 20 6e 49 64 78 3e 6d 78 49      if( nIdx>mxI
c0e0: 64 78 20 29 20 6d 78 49 64 78 20 3d 20 6e 49 64  dx ) mxIdx = nId
c0f0: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
c100: 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33   aRoot = sqlite3
c110: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
c120: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 63  , sizeof(int)*(c
c130: 6e 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66  nt+1));.      if
c140: 28 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72 65  ( aRoot==0 ) bre
c150: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e  ak;.      for(cn
c160: 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73  t=0, x=sqliteHas
c170: 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78  hFirst(pTbls); x
c180: 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; x=sqliteHashNe
c190: 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(x)){.        
c1a0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
c1b0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b  liteHashData(x);
c1c0: 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
c1d0: 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66  pIdx;.        if
c1e0: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
c1f0: 20 29 20 61 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20   ) aRoot[++cnt] 
c200: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20  = pTab->tnum;.  
c210: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
c220: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
c230: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
c240: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
c250: 61 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20 3d 20 70  aRoot[++cnt] = p
c260: 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
c270: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
c280: 20 20 20 61 52 6f 6f 74 5b 30 5d 20 3d 20 63 6e     aRoot[0] = cn
c290: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b  t;..      /* Mak
c2a0: 65 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  e sure sufficien
c2b0: 74 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  t number of regi
c2c0: 73 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  sters have been 
c2d0: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20  allocated */.   
c2e0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
c2f0: 3d 20 4d 41 58 28 20 70 50 61 72 73 65 2d 3e 6e  = MAX( pParse->n
c300: 4d 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b 0a  Mem, 8+mxIdx );.
c310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
c320: 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
c330: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f  Parse);..      /
c340: 2a 20 44 6f 20 74 68 65 20 62 2d 74 72 65 65 20  * Do the b-tree 
c350: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 73  integrity checks
c360: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
c370: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
c380: 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 32  P_IntegrityCk, 2
c390: 2c 20 63 6e 74 2c 20 31 2c 20 28 63 68 61 72 2a  , cnt, 1, (char*
c3a0: 29 61 52 6f 6f 74 2c 50 34 5f 49 4e 54 41 52 52  )aRoot,P4_INTARR
c3b0: 41 59 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  AY);.      sqlit
c3c0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
c3d0: 2c 20 28 75 38 29 69 29 3b 0a 20 20 20 20 20 20  , (u8)i);.      
c3e0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
c3f0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
c400: 73 4e 75 6c 6c 2c 20 32 29 3b 20 56 64 62 65 43  sNull, 2); VdbeC
c410: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
c420: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c430: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
c440: 38 2c 20 30 2c 20 33 2c 20 30 2c 0a 20 20 20 20  8, 0, 3, 0,.    
c450: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
c460: 6e 74 66 28 64 62 2c 20 22 2a 2a 2a 20 69 6e 20  ntf(db, "*** in 
c470: 64 61 74 61 62 61 73 65 20 25 73 20 2a 2a 2a 5c  database %s ***\
c480: 6e 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  n", db->aDb[i].z
c490: 44 62 53 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  DbSName),.      
c4a0: 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a     P4_DYNAMIC);.
c4b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c4c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
c4d0: 6e 63 61 74 2c 20 32 2c 20 33 2c 20 33 29 3b 0a  ncat, 2, 3, 3);.
c4e0: 20 20 20 20 20 20 69 6e 74 65 67 72 69 74 79 43        integrityC
c4f0: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29  heckResultRow(v)
c500: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c510: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
c520: 64 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ddr);..      /* 
c530: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  Make sure all th
c540: 65 20 69 6e 64 69 63 65 73 20 61 72 65 20 63 6f  e indices are co
c550: 6e 73 74 72 75 63 74 65 64 20 63 6f 72 72 65 63  nstructed correc
c560: 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tly..      */.  
c570: 20 20 20 20 66 6f 72 28 78 3d 73 71 6c 69 74 65      for(x=sqlite
c580: 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29  HashFirst(pTbls)
c590: 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73  ; x; x=sqliteHas
c5a0: 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20  hNext(x)){.     
c5b0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
c5c0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
c5d0: 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65  x);.        Inde
c5e0: 78 20 2a 70 49 64 78 2c 20 2a 70 50 6b 3b 0a 20  x *pIdx, *pPk;. 
c5f0: 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50         Index *pP
c600: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
c610: 20 20 69 6e 74 20 6c 6f 6f 70 54 6f 70 3b 0a 20    int loopTop;. 
c620: 20 20 20 20 20 20 20 69 6e 74 20 69 44 61 74 61         int iData
c630: 43 75 72 2c 20 69 49 64 78 43 75 72 3b 0a 20 20  Cur, iIdxCur;.  
c640: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2d        int r1 = -
c650: 31 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  1;..        if( 
c660: 70 54 61 62 2d 3e 74 6e 75 6d 3c 31 20 29 20 63  pTab->tnum<1 ) c
c670: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 53 6b 69  ontinue;  /* Ski
c680: 70 20 56 49 45 57 73 20 6f 72 20 56 49 52 54 55  p VIEWs or VIRTU
c690: 41 4c 20 54 41 42 4c 45 73 20 2a 2f 0a 20 20 20  AL TABLEs */.   
c6a0: 20 20 20 20 20 70 50 6b 20 3d 20 48 61 73 52 6f       pPk = HasRo
c6b0: 77 69 64 28 70 54 61 62 29 20 3f 20 30 20 3a 20  wid(pTab) ? 0 : 
c6c0: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
c6d0: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
c6e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c6f0: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
c700: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
c710: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64  ite3OpenTableAnd
c720: 49 6e 64 69 63 65 73 28 70 50 61 72 73 65 2c 20  Indices(pParse, 
c730: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
c740: 64 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  d, 0,.          
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 26           1, 0, &
c770: 69 44 61 74 61 43 75 72 2c 20 26 69 49 64 78 43  iDataCur, &iIdxC
c780: 75 72 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ur);.        /* 
c790: 72 65 67 5b 37 5d 20 63 6f 75 6e 74 73 20 74 68  reg[7] counts th
c7a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
c7b0: 69 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ies in the table
c7c0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 67  ..        ** reg
c7d0: 5b 38 2b 69 5d 20 63 6f 75 6e 74 73 20 74 68 65  [8+i] counts the
c7e0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
c7f0: 65 73 20 69 6e 20 74 68 65 20 69 2d 74 68 20 69  es in the i-th i
c800: 6e 64 65 78 20 0a 20 20 20 20 20 20 20 20 2a 2f  ndex .        */
c810: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c820: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c830: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 37 29 3b  _Integer, 0, 7);
c840: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
c850: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
c860: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
c870: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b  pIdx->pNext, j++
c880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
c890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c8a0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
c8b0: 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65 78 20   8+j); /* index 
c8c0: 65 6e 74 72 69 65 73 20 63 6f 75 6e 74 65 72 20  entries counter 
c8d0: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
c8e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
c8f0: 72 73 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20 29  rse->nMem>=8+j )
c900: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
c910: 28 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73  ( sqlite3NoTemps
c920: 49 6e 52 61 6e 67 65 28 70 50 61 72 73 65 2c 31  InRange(pParse,1
c930: 2c 37 2b 6a 29 20 29 3b 0a 20 20 20 20 20 20 20  ,7+j) );.       
c940: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c950: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
c960: 20 69 44 61 74 61 43 75 72 2c 20 30 29 3b 20 56   iDataCur, 0); V
c970: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
c980: 20 20 20 20 20 20 20 20 6c 6f 6f 70 54 6f 70 20          loopTop 
c990: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c9a0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
c9b0: 2c 20 37 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 7, 1);.       
c9c0: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
c9d0: 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  all NOT NULL col
c9e0: 75 6d 6e 73 20 72 65 61 6c 6c 79 20 61 72 65 20  umns really are 
c9f0: 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20  NOT NULL */.    
ca00: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
ca10: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
ca20: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
ca30: 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20  *zErr;.         
ca40: 20 69 6e 74 20 6a 6d 70 32 3b 0a 20 20 20 20 20   int jmp2;.     
ca50: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62       if( j==pTab
ca60: 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e  ->iPKey ) contin
ca70: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
ca80: 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ( pTab->aCol[j].
ca90: 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e  notNull==0 ) con
caa0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
cab0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
cac0: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
cad0: 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43  (v, pTab, iDataC
cae0: 75 72 2c 20 6a 2c 20 33 29 3b 0a 20 20 20 20 20  ur, j, 3);.     
caf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cb00: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
cb10: 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
cb20: 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20           jmp2 = 
cb30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cb40: 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
cb50: 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   3); VdbeCoverag
cb60: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
cb70: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  zErr = sqlite3MP
cb80: 72 69 6e 74 66 28 64 62 2c 20 22 4e 55 4c 4c 20  rintf(db, "NULL 
cb90: 76 61 6c 75 65 20 69 6e 20 25 73 2e 25 73 22 2c  value in %s.%s",
cba0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
cbd0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
cbe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cbf0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
cc00: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
cc10: 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44  3, 0, zErr, P4_D
cc20: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
cc30: 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63     integrityChec
cc40: 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20  kResultRow(v);. 
cc50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cc60: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
cc70: 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  jmp2);.        }
cc80: 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69  .        /* Veri
cc90: 66 79 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  fy CHECK constra
cca0: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
ccb0: 69 66 28 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  if( pTab->pCheck
ccc0: 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
ccd0: 20 53 51 4c 49 54 45 5f 49 67 6e 6f 72 65 43 68   SQLITE_IgnoreCh
cce0: 65 63 6b 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ecks)==0 ){.    
ccf0: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
cd00: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
cd10: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
cd20: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 30 29  pTab->pCheck, 0)
cd30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
cd40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cd50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
cd60: 20 20 20 69 6e 74 20 61 64 64 72 43 6b 46 61 75     int addrCkFau
cd70: 6c 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  lt = sqlite3Vdbe
cd80: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
cd90: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64            int ad
cda0: 64 72 43 6b 4f 6b 20 3d 20 73 71 6c 69 74 65 33  drCkOk = sqlite3
cdb0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
cdc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
cdd0: 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20  ar *zErr;.      
cde0: 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
cdf0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
ce00: 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 44 61 74  >iSelfTab = iDat
ce10: 61 43 75 72 20 2b 20 31 3b 0a 20 20 20 20 20 20  aCur + 1;.      
ce20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ce30: 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
ce40: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
ce50: 66 6f 72 28 6b 3d 70 43 68 65 63 6b 2d 3e 6e 45  for(k=pCheck->nE
ce60: 78 70 72 2d 31 3b 20 6b 3e 30 3b 20 6b 2d 2d 29  xpr-1; k>0; k--)
ce70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
ce80: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
ce90: 73 65 28 70 50 61 72 73 65 2c 20 70 43 68 65 63  se(pParse, pChec
cea0: 6b 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 61  k->a[k].pExpr, a
ceb0: 64 64 72 43 6b 46 61 75 6c 74 2c 20 30 29 3b 0a  ddrCkFault, 0);.
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
ced0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cee0: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
cef0: 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b 30 5d  se, pCheck->a[0]
cf00: 2e 70 45 78 70 72 2c 20 61 64 64 72 43 6b 4f 6b  .pExpr, addrCkOk
cf10: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
cf20: 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46     SQLITE_JUMPIF
cf30: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
cf40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
cf50: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
cf60: 64 72 43 6b 46 61 75 6c 74 29 3b 0a 20 20 20 20  drCkFault);.    
cf70: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
cf80: 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20  iSelfTab = 0;.  
cf90: 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d            zErr =
cfa0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
cfb0: 64 62 2c 20 22 43 48 45 43 4b 20 63 6f 6e 73 74  db, "CHECK const
cfc0: 72 61 69 6e 74 20 66 61 69 6c 65 64 20 69 6e 20  raint failed in 
cfd0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
cfe0: 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
cff0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
d010: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
d020: 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50  0, 3, 0, zErr, P
d030: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
d040: 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74          integrit
d050: 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28  yCheckResultRow(
d060: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
d070: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d080: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
d090: 6b 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  kOk);.          
d0a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
d0b0: 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
d0c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d0e0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
d0f0: 43 68 65 63 6b 29 3b 0a 20 20 20 20 20 20 20 20  Check);.        
d100: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  }.        if( !i
d110: 73 51 75 69 63 6b 20 29 7b 20 2f 2a 20 4f 6d 69  sQuick ){ /* Omi
d120: 74 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20  t the remaining 
d130: 74 65 73 74 73 20 66 6f 72 20 71 75 69 63 6b 5f  tests for quick_
d140: 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20  check */.       
d150: 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65     /* Sanity che
d160: 63 6b 20 6f 6e 20 72 65 63 6f 72 64 20 68 65 61  ck on record hea
d170: 64 65 72 20 64 65 63 6f 64 69 6e 67 20 2a 2f 0a  der decoding */.
d180: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d190: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d1a0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 44 61 74 61 43  P_Column, iDataC
d1b0: 75 72 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  ur, pTab->nCol-1
d1c0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
d1d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d1e0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
d1f0: 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
d200: 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20      /* Validate 
d210: 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 66 6f  index entries fo
d220: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
d230: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  w */.          f
d240: 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61  or(j=0, pIdx=pTa
d250: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
d260: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
d270: 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t, j++){.       
d280: 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 2c 20 6a       int jmp2, j
d290: 6d 70 33 2c 20 6a 6d 70 34 2c 20 6a 6d 70 35 3b  mp3, jmp4, jmp5;
d2a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d2b0: 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c 69 74 65   ckUniq = sqlite
d2c0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
d2d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
d2e0: 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20 63  f( pPk==pIdx ) c
d2f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d300: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
d310: 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
d320: 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20  y(pParse, pIdx, 
d330: 69 44 61 74 61 43 75 72 2c 20 30 2c 20 30 2c 20  iDataCur, 0, 0, 
d340: 26 6a 6d 70 33 2c 0a 20 20 20 20 20 20 20 20 20  &jmp3,.         
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20 20 20  pPrior, r1);.   
d380: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20           pPrior 
d390: 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
d3a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d3b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
d3c0: 6d 6d 2c 20 38 2b 6a 2c 20 31 29 3b 2f 2a 20 69  mm, 8+j, 1);/* i
d3d0: 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72 79 20 63  ncrement entry c
d3e0: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ount */.        
d3f0: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
d400: 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
d410: 79 20 65 78 69 73 74 73 20 66 6f 72 20 74 68 65  y exists for the
d420: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 72   current table r
d430: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ow */.          
d440: 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33    jmp2 = sqlite3
d450: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
d460: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 49 64 78 43   OP_Found, iIdxC
d470: 75 72 2b 6a 2c 20 63 6b 55 6e 69 71 2c 20 72 31  ur+j, ckUniq, r1
d480: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
d4b0: 6e 43 6f 6c 75 6d 6e 29 3b 20 56 64 62 65 43 6f  nColumn); VdbeCo
d4c0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
d4d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d4e0: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
d4f0: 33 2c 20 22 72 6f 77 20 22 29 3b 0a 20 20 20 20  3, "row ");.    
d500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d510: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d520: 43 6f 6e 63 61 74 2c 20 37 2c 20 33 2c 20 33 29  Concat, 7, 3, 3)
d530: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d540: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
d550: 69 6e 67 28 76 2c 20 34 2c 20 22 20 6d 69 73 73  ing(v, 4, " miss
d560: 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78 20 22  ing from index "
d570: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d590: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34  (v, OP_Concat, 4
d5a0: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 3, 3);.       
d5b0: 20 20 20 20 20 6a 6d 70 35 20 3d 20 73 71 6c 69       jmp5 = sqli
d5c0: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
d5d0: 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e  g(v, 4, pIdx->zN
d5e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
d5f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d600: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
d610: 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20  , 4, 3, 3);.    
d620: 20 20 20 20 20 20 20 20 6a 6d 70 34 20 3d 20 69          jmp4 = i
d630: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73  ntegrityCheckRes
d640: 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20  ultRow(v);.     
d650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d660: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
d670: 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p2);.           
d680: 20 2f 2a 20 46 6f 72 20 55 4e 49 51 55 45 20 69   /* For UNIQUE i
d690: 6e 64 65 78 65 73 2c 20 76 65 72 69 66 79 20 74  ndexes, verify t
d6a0: 68 61 74 20 6f 6e 6c 79 20 6f 6e 65 20 65 6e 74  hat only one ent
d6b0: 72 79 20 65 78 69 73 74 73 20 77 69 74 68 20 74  ry exists with t
d6c0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
d6d0: 2a 20 63 75 72 72 65 6e 74 20 6b 65 79 2e 20 20  * current key.  
d6e0: 54 68 65 20 65 6e 74 72 79 20 69 73 20 75 6e 69  The entry is uni
d6f0: 71 75 65 20 69 66 20 28 31 29 20 61 6e 79 20 63  que if (1) any c
d700: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 0a 20 20  olumn is NULL.  
d710: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
d720: 28 32 29 20 74 68 65 20 6e 65 78 74 20 65 6e 74  (2) the next ent
d730: 72 79 20 68 61 73 20 61 20 64 69 66 66 65 72 65  ry has a differe
d740: 6e 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20  nt key */.      
d750: 20 20 20 20 20 20 69 66 28 20 49 73 55 6e 69 71        if( IsUniq
d760: 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b  ueIndex(pIdx) ){
d770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
d780: 6e 74 20 75 6e 69 71 4f 6b 20 3d 20 73 71 6c 69  nt uniqOk = sqli
d790: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d7a0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d7b0: 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20 20 20     int jmp6;.   
d7c0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
d7d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
d7e0: 20 66 6f 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49   for(kk=0; kk<pI
d7f0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b  dx->nKeyCol; kk+
d800: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
d810: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
d820: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 6b  Idx->aiColumn[kk
d830: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
d840: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 21     assert( iCol!
d850: 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20 69 43 6f  =XN_ROWID && iCo
d860: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  l<pTab->nCol );.
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70  if( iCol>=0 && p
d890: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
d8a0: 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f 6e 74 69 6e  notNull ) contin
d8b0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
d8c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d8d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
d8e0: 6c 6c 2c 20 72 31 2b 6b 6b 2c 20 75 6e 69 71 4f  ll, r1+kk, uniqO
d8f0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
d900: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
d910: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d920: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
d930: 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69 74 65     jmp6 = sqlite
d940: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
d950: 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2b  P_Next, iIdxCur+
d960: 6a 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  j); VdbeCoverage
d970: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
d990: 74 6f 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20  to(v, uniqOk);. 
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
d9b0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
d9c0: 28 76 2c 20 6a 6d 70 36 29 3b 0a 20 20 20 20 20  (v, jmp6);.     
d9d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d9e0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
d9f0: 20 4f 50 5f 49 64 78 47 54 2c 20 69 49 64 78 43   OP_IdxGT, iIdxC
da00: 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b 2c 20 72 31  ur+j, uniqOk, r1
da10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 20 20 70 49 64 78 2d 3e 6e 4b 65 79 43       pIdx->nKeyC
da40: 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
da50: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
da60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
da70: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20  oadString(v, 3, 
da80: 22 6e 6f 6e 2d 75 6e 69 71 75 65 20 65 6e 74 72  "non-unique entr
da90: 79 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20  y in index ");. 
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
dab0: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
dac0: 6a 6d 70 35 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp5);.         
dad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dae0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
daf0: 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20  uniqOk);.       
db00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
db10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
db20: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b  mpHere(v, jmp4);
db30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
db40: 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49  ite3ResolvePartI
db50: 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20  dxLabel(pParse, 
db60: 6a 6d 70 33 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp3);.         
db70: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
db80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
db90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
dba0: 74 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 6f 6f  t, iDataCur, loo
dbb0: 70 54 6f 70 29 3b 20 56 64 62 65 43 6f 76 65 72  pTop); VdbeCover
dbc0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
dbd0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
dbe0: 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31  ere(v, loopTop-1
dbf0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
dc00: 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
dc10: 54 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  T.        if( !i
dc20: 73 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20 20  sQuick ){.      
dc30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
dc40: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 32 2c 20  oadString(v, 2, 
dc50: 22 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72  "wrong # of entr
dc60: 69 65 73 20 69 6e 20 69 6e 64 65 78 20 22 29 3b  ies in index ");
dc70: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
dc80: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
dc90: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
dca0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
dcb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
dcc0: 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29   if( pPk==pIdx )
dcd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
dce0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dcf0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
dd00: 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2b 6a 2c  ount, iIdxCur+j,
dd10: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   3);.           
dd20: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
dd30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
dd40: 45 71 2c 20 38 2b 6a 2c 20 30 2c 20 33 29 3b 20  Eq, 8+j, 0, 3); 
dd50: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
dd60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
dd70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
dd80: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55  (v, SQLITE_NOTNU
dd90: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  LL);.           
dda0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
ddb0: 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 70 49 64  String(v, 4, pId
ddc0: 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
ddd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dde0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
ddf0: 6f 6e 63 61 74 2c 20 34 2c 20 32 2c 20 33 29 3b  oncat, 4, 2, 3);
de00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
de10: 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c  egrityCheckResul
de20: 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20 20  tRow(v);.       
de30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
de40: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
de50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
de60: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20         }.#endif 
de70: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
de80: 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20  TREECOUNT */.   
de90: 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 20 20     } .    }.    
dea0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
deb0: 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56  onst int iLn = V
dec0: 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e  DBE_OFFSET_LINEN
ded0: 4f 28 32 29 3b 0a 20 20 20 20 20 20 73 74 61 74  O(2);.      stat
dee0: 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c  ic const VdbeOpL
def0: 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20 3d 20  ist endCode[] = 
df00: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 41  {.        { OP_A
df10: 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30  ddImm,      1, 0
df20: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
df30: 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 0 */.        
df40: 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  { OP_IfNotZero, 
df50: 20 20 31 2c 20 34 2c 20 20 20 20 20 20 20 20 30    1, 4,        0
df60: 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  },    /* 1 */.  
df70: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
df80: 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20 20 20  g8,     0, 3,   
df90: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32       0},    /* 2
dfa0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
dfb0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 33 2c  _ResultRow,   3,
dfc0: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   1,        0},  
dfd0: 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20    /* 3 */.      
dfe0: 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20    { OP_Halt,    
dff0: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
e000: 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a   0},    /* 4 */.
e010: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72          { OP_Str
e020: 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20  ing8,     0, 3, 
e030: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
e040: 20 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   5 */.        { 
e050: 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 20  OP_Goto,        
e060: 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 3,        0},
e070: 20 20 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20      /* 6 */.    
e080: 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f    };.      VdbeO
e090: 70 20 2a 61 4f 70 3b 0a 0a 20 20 20 20 20 20 61  p *aOp;..      a
e0a0: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
e0b0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
e0c0: 61 79 53 69 7a 65 28 65 6e 64 43 6f 64 65 29 2c  aySize(endCode),
e0d0: 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a   endCode, iLn);.
e0e0: 20 20 20 20 20 20 69 66 28 20 61 4f 70 20 29 7b        if( aOp ){
e0f0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  .        aOp[0].
e100: 70 32 20 3d 20 31 2d 6d 78 45 72 72 3b 0a 20 20  p2 = 1-mxErr;.  
e110: 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 74        aOp[2].p4t
e120: 79 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b  ype = P4_STATIC;
e130: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e  .        aOp[2].
e140: 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a 20 20 20  p4.z = "ok";.   
e150: 20 20 20 20 20 61 4f 70 5b 35 5d 2e 70 34 74 79       aOp[5].p4ty
e160: 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b 0a  pe = P4_STATIC;.
e170: 20 20 20 20 20 20 20 20 61 4f 70 5b 35 5d 2e 70          aOp[5].p
e180: 34 2e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  4.z = (char*)sql
e190: 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
e1a0: 45 5f 43 4f 52 52 55 50 54 29 3b 0a 20 20 20 20  E_CORRUPT);.    
e1b0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
e1c0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
e1d0: 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
e1e0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
e1f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
e200: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  eak;.#endif /* S
e210: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
e220: 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
e230: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e240: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 0a 20 20  IT_UTF16.  /*.  
e250: 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f  **   PRAGMA enco
e260: 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41 47  ding.  **   PRAG
e270: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75  MA encoding = "u
e280: 74 66 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c 22  tf-8"|"utf-16"|"
e290: 75 74 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31  utf-16le"|"utf-1
e2a0: 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  6be".  **.  ** I
e2b0: 6e 20 69 74 73 20 66 69 72 73 74 20 66 6f 72 6d  n its first form
e2c0: 2c 20 74 68 69 73 20 70 72 61 67 6d 61 20 72 65  , this pragma re
e2d0: 74 75 72 6e 73 20 74 68 65 20 65 6e 63 6f 64 69  turns the encodi
e2e0: 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 20  ng of the main. 
e2f0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49 66   ** database. If
e300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
e310: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   not initialized
e320: 2c 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  , it is initiali
e330: 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20  zed now..  **.  
e340: 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
e350: 72 6d 20 6f 66 20 74 68 69 73 20 70 72 61 67 6d  rm of this pragm
e360: 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  a is a no-op if 
e370: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
e380: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73 20  e file.  ** has 
e390: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
e3a0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 6e   initialized. In
e3b0: 20 74 68 69 73 20 63 61 73 65 20 69 74 20 73 65   this case it se
e3c0: 74 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20  ts the default. 
e3d0: 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68 61   ** encoding tha
e3e0: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  t will be used f
e3f0: 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
e400: 62 61 73 65 20 66 69 6c 65 20 69 66 20 61 20 6e  base file if a n
e410: 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20  ew file.  ** is 
e420: 63 72 65 61 74 65 64 2e 20 49 66 20 61 6e 20 65  created. If an e
e430: 78 69 73 74 69 6e 67 20 6d 61 69 6e 20 64 61 74  xisting main dat
e440: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
e450: 65 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20  ened, then the. 
e460: 20 2a 2a 20 64 65 66 61 75 6c 74 20 74 65 78 74   ** default text
e470: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
e480: 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e existing datab
e490: 61 73 65 20 69 73 20 75 73 65 64 2e 0a 20 20 2a  ase is used..  *
e4a0: 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20 63  * .  ** In all c
e4b0: 61 73 65 73 20 6e 65 77 20 64 61 74 61 62 61 73  ases new databas
e4c0: 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  es created using
e4d0: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
e4e0: 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63 72 65  and are.  ** cre
e4f0: 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  ated to use the 
e500: 73 61 6d 65 20 64 65 66 61 75 6c 74 20 74 65 78  same default tex
e510: 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 74 68  t encoding as th
e520: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e  e main database.
e530: 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61 69   If.  ** the mai
e540: 6e 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e  n database has n
e550: 6f 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  ot been initiali
e560: 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72 65 61 74  zed and/or creat
e570: 65 64 20 77 68 65 6e 20 41 54 54 41 43 48 0a 20  ed when ATTACH. 
e580: 20 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64 2c   ** is executed,
e590: 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   this is done be
e5a0: 66 6f 72 65 20 74 68 65 20 41 54 54 41 43 48 20  fore the ATTACH 
e5b0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a  operation..  **.
e5c0: 20 20 2a 2a 20 49 6e 20 74 68 65 20 73 65 63 6f    ** In the seco
e5d0: 6e 64 20 66 6f 72 6d 20 74 68 69 73 20 70 72 61  nd form this pra
e5e0: 67 6d 61 20 73 65 74 73 20 74 68 65 20 74 65 78  gma sets the tex
e5f0: 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65  t encoding to be
e600: 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e 65   used in.  ** ne
e610: 77 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  w database files
e620: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
e630: 68 69 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  his database han
e640: 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a  dle. It is only.
e650: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 66 20 69    ** useful if i
e660: 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74 65  nvoked immediate
e670: 6c 79 20 61 66 74 65 72 20 74 68 65 20 6d 61 69  ly after the mai
e680: 6e 20 64 61 74 61 62 61 73 65 20 69 0a 20 20 2a  n database i.  *
e690: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
e6a0: 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20 20 20  _ENCODING: {.   
e6b0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
e6c0: 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 7b 0a 20  ruct EncName {. 
e6d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
e6e0: 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63 3b 0a  ;.      u8 enc;.
e6f0: 20 20 20 20 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d      } encnames[]
e700: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 55 54   = {.      { "UT
e710: 46 38 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  F8",     SQLITE_
e720: 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c 0a 20  UTF8        },. 
e730: 20 20 20 20 20 7b 20 22 55 54 46 2d 38 22 2c 20       { "UTF-8", 
e740: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20     SQLITE_UTF8  
e750: 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73        },  /* Mus
e760: 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 31 5d  t be element [1]
e770: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46   */.      { "UTF
e780: 2d 31 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55  -16le", SQLITE_U
e790: 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 20 20 2f  TF16LE     },  /
e7a0: 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e  * Must be elemen
e7b0: 74 20 5b 32 5d 20 2a 2f 0a 20 20 20 20 20 20 7b  t [2] */.      {
e7c0: 20 22 55 54 46 2d 31 36 62 65 22 2c 20 53 51 4c   "UTF-16be", SQL
e7d0: 49 54 45 5f 55 54 46 31 36 42 45 20 20 20 20 20  ITE_UTF16BE     
e7e0: 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65  },  /* Must be e
e7f0: 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a 20 20  lement [3] */.  
e800: 20 20 20 20 7b 20 22 55 54 46 31 36 6c 65 22 2c      { "UTF16le",
e810: 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45    SQLITE_UTF16LE
e820: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
e830: 22 55 54 46 31 36 62 65 22 2c 20 20 53 51 4c 49  "UTF16be",  SQLI
e840: 54 45 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d  TE_UTF16BE     }
e850: 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31  ,.      { "UTF-1
e860: 36 22 2c 20 20 20 30 20 20 20 20 20 20 20 20 20  6",   0         
e870: 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53           }, /* S
e880: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
e890: 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54  E */.      { "UT
e8a0: 46 31 36 22 2c 20 20 20 20 30 20 20 20 20 20 20  F16",    0      
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f              }, /
e8c0: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
e8d0: 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20  TIVE */.      { 
e8e0: 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20  0, 0 }.    };.  
e8f0: 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45    const struct E
e900: 6e 63 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a 20 20  ncName *pEnc;.  
e910: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
e920: 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65      /* "PRAGMA e
e930: 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20 20  ncoding" */.    
e940: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
e950: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
e960: 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75  ) goto pragma_ou
e970: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
e980: 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45   encnames[SQLITE
e990: 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49  _UTF8].enc==SQLI
e9a0: 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20  TE_UTF8 );.     
e9b0: 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65   assert( encname
e9c0: 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  s[SQLITE_UTF16LE
e9d0: 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ].enc==SQLITE_UT
e9e0: 46 31 36 4c 45 20 29 3b 0a 20 20 20 20 20 20 61  F16LE );.      a
e9f0: 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b  ssert( encnames[
ea00: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 5d 2e  SQLITE_UTF16BE].
ea10: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
ea20: 36 42 45 20 29 3b 0a 20 20 20 20 20 20 72 65 74  6BE );.      ret
ea30: 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c  urnSingleText(v,
ea40: 20 65 6e 63 6e 61 6d 65 73 5b 45 4e 43 28 70 50   encnames[ENC(pP
ea50: 61 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61 6d 65  arse->db)].zName
ea60: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20  );.    }else{   
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20       /* "PRAGMA 
ea90: 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58 58 22 20  encoding = XXX" 
eaa0: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79  */.      /* Only
eab0: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
eac0: 65 20 6f 66 20 73 71 6c 69 74 65 2e 65 6e 63 20  e of sqlite.enc 
ead0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
eae0: 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 0a 20 20  handle is not.  
eaf0: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
eb00: 65 64 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20  ed. If the main 
eb10: 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2c  database exists,
eb20: 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 2e   the new sqlite.
eb30: 65 6e 63 20 76 61 6c 75 65 0a 20 20 20 20 20 20  enc value.      
eb40: 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  ** will be overw
eb50: 72 69 74 74 65 6e 20 77 68 65 6e 20 74 68 65 20  ritten when the 
eb60: 73 63 68 65 6d 61 20 69 73 20 6e 65 78 74 20 6c  schema is next l
eb70: 6f 61 64 65 64 2e 20 49 66 20 69 74 20 64 6f 65  oaded. If it doe
eb80: 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61  s not.      ** a
eb90: 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c 20 69  lready exists, i
eba0: 74 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  t will be create
ebb0: 64 20 74 6f 20 75 73 65 20 74 68 65 20 6e 65 77  d to use the new
ebc0: 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c 75 65 2e   encoding value.
ebd0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ebe0: 69 66 28 20 0a 20 20 20 20 20 20 20 20 21 28 44  if( .        !(D
ebf0: 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
ec00: 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61   0, DB_SchemaLoa
ec10: 64 65 64 29 29 20 7c 7c 20 0a 20 20 20 20 20 20  ded)) || .      
ec20: 20 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28    DbHasProperty(
ec30: 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70 74 79 29  db, 0, DB_Empty)
ec40: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
ec50: 20 20 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e 63     for(pEnc=&enc
ec60: 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e  names[0]; pEnc->
ec70: 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a  zName; pEnc++){.
ec80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d            if( 0=
ec90: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
eca0: 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e 7a 4e  zRight, pEnc->zN
ecb0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
ecc0: 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 64      SCHEMA_ENC(d
ecd0: 62 29 20 3d 20 45 4e 43 28 64 62 29 20 3d 0a 20  b) = ENC(db) =. 
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
ecf0: 45 6e 63 2d 3e 65 6e 63 20 3f 20 70 45 6e 63 2d  Enc->enc ? pEnc-
ed00: 3e 65 6e 63 20 3a 20 53 51 4c 49 54 45 5f 55 54  >enc : SQLITE_UT
ed10: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 20  F16NATIVE;.     
ed20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ed30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ed40: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
ed50: 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b 0a  !pEnc->zName ){.
ed60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ed70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ed80: 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 65  , "unsupported e
ed90: 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c 20 7a 52  ncoding: %s", zR
eda0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  ight);.        }
edb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
edc0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
edd0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ede0: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
edf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ee00: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50  SCHEMA_VERSION_P
ee10: 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a  RAGMAS.  /*.  **
ee20: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
ee30: 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  a.]schema_versio
ee40: 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  n.  **   PRAGMA 
ee50: 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f  [schema.]schema_
ee60: 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67  version = <integ
ee70: 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  er>.  **.  **   
ee80: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
ee90: 75 73 65 72 5f 76 65 72 73 69 6f 6e 0a 20 20 2a  user_version.  *
eea0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
eeb0: 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e  ma.]user_version
eec0: 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a   = <integer>.  *
eed0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
eee0: 5b 73 63 68 65 6d 61 2e 5d 66 72 65 65 6c 69 73  [schema.]freelis
eef0: 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a  t_count.  **.  *
ef00: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
ef10: 6d 61 2e 5d 64 61 74 61 5f 76 65 72 73 69 6f 6e  ma.]data_version
ef20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  **.  **   PRA
ef30: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70  GMA [schema.]app
ef40: 6c 69 63 61 74 69 6f 6e 5f 69 64 0a 20 20 2a 2a  lication_id.  **
ef50: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
ef60: 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69  a.]application_i
ef70: 64 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20  d = <integer>.  
ef80: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70 72 61 67  **.  ** The prag
ef90: 6d 61 27 73 20 73 63 68 65 6d 61 5f 76 65 72 73  ma's schema_vers
efa0: 69 6f 6e 20 61 6e 64 20 75 73 65 72 5f 76 65 72  ion and user_ver
efb0: 73 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  sion are used to
efc0: 20 73 65 74 20 6f 72 20 67 65 74 0a 20 20 2a 2a   set or get.  **
efd0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
efe0: 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e  e schema-version
eff0: 20 61 6e 64 20 75 73 65 72 2d 76 65 72 73 69 6f   and user-versio
f000: 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  n, respectively.
f010: 20 42 6f 74 68 0a 20 20 2a 2a 20 74 68 65 20 73   Both.  ** the s
f020: 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e  chema-version an
f030: 64 20 74 68 65 20 75 73 65 72 2d 76 65 72 73 69  d the user-versi
f040: 6f 6e 20 61 72 65 20 33 32 2d 62 69 74 20 73 69  on are 32-bit si
f050: 67 6e 65 64 20 69 6e 74 65 67 65 72 73 0a 20 20  gned integers.  
f060: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
f070: 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
f080: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
f090: 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 69 73  schema-cookie is
f0a0: 20 75 73 75 61 6c 6c 79 20 6f 6e 6c 79 20 6d 61   usually only ma
f0b0: 6e 69 70 75 6c 61 74 65 64 20 69 6e 74 65 72 6e  nipulated intern
f0c0: 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20  ally by SQLite. 
f0d0: 49 74 0a 20 20 2a 2a 20 69 73 20 69 6e 63 72 65  It.  ** is incre
f0e0: 6d 65 6e 74 65 64 20 62 79 20 53 51 4c 69 74 65  mented by SQLite
f0f0: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 64 61   whenever the da
f100: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
f110: 20 6d 6f 64 69 66 69 65 64 20 28 62 79 0a 20 20   modified (by.  
f120: 2a 2a 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  ** creating or d
f130: 72 6f 70 70 69 6e 67 20 61 20 74 61 62 6c 65 20  ropping a table 
f140: 6f 72 20 69 6e 64 65 78 29 2e 20 54 68 65 20 73  or index). The s
f150: 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 69 73  chema version is
f160: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 53 51   used by.  ** SQ
f170: 4c 69 74 65 20 65 61 63 68 20 74 69 6d 65 20 61  Lite each time a
f180: 20 71 75 65 72 79 20 69 73 20 65 78 65 63 75 74   query is execut
f190: 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
f1a0: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  t the internal c
f1b0: 61 63 68 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ache.  ** of the
f1c0: 20 73 63 68 65 6d 61 20 75 73 65 64 20 77 68 65   schema used whe
f1d0: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20  n compiling the 
f1e0: 53 51 4c 20 71 75 65 72 79 20 6d 61 74 63 68 65  SQL query matche
f1f0: 73 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 0a  s the schema of.
f200: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
f210: 65 20 61 67 61 69 6e 73 74 20 77 68 69 63 68 20  e against which 
f220: 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 71 75 65  the compiled que
f230: 72 79 20 69 73 20 61 63 74 75 61 6c 6c 79 20 65  ry is actually e
f240: 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 53 75  xecuted..  ** Su
f250: 62 76 65 72 74 69 6e 67 20 74 68 69 73 20 6d 65  bverting this me
f260: 63 68 61 6e 69 73 6d 20 62 79 20 75 73 69 6e 67  chanism by using
f270: 20 22 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f   "PRAGMA schema_
f280: 76 65 72 73 69 6f 6e 22 20 74 6f 20 6d 6f 64 69  version" to modi
f290: 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  fy.  ** the sche
f2a0: 6d 61 2d 76 65 72 73 69 6f 6e 20 69 73 20 70 6f  ma-version is po
f2b0: 74 65 6e 74 69 61 6c 6c 79 20 64 61 6e 67 65 72  tentially danger
f2c0: 6f 75 73 20 61 6e 64 20 6d 61 79 20 6c 65 61 64  ous and may lead
f2d0: 20 74 6f 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2a   to program.  **
f2e0: 20 63 72 61 73 68 65 73 20 6f 72 20 64 61 74 61   crashes or data
f2f0: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
f300: 20 55 73 65 20 77 69 74 68 20 63 61 75 74 69 6f   Use with cautio
f310: 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n!.  **.  ** The
f320: 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 69 73   user-version is
f330: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
f340: 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20  ally by SQLite. 
f350: 49 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 62  It may be used b
f360: 79 0a 20 20 2a 2a 20 61 70 70 6c 69 63 61 74 69  y.  ** applicati
f370: 6f 6e 73 20 66 6f 72 20 61 6e 79 20 70 75 72 70  ons for any purp
f380: 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ose..  */.  case
f390: 20 50 72 61 67 54 79 70 5f 48 45 41 44 45 52 5f   PragTyp_HEADER_
f3a0: 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 6e 74  VALUE: {.    int
f3b0: 20 69 43 6f 6f 6b 69 65 20 3d 20 70 50 72 61 67   iCookie = pPrag
f3c0: 6d 61 2d 3e 69 41 72 67 3b 20 20 2f 2a 20 57 68  ma->iArg;  /* Wh
f3d0: 69 63 68 20 63 6f 6f 6b 69 65 20 74 6f 20 72 65  ich cookie to re
f3e0: 61 64 20 6f 72 20 77 72 69 74 65 20 2a 2f 0a 20  ad or write */. 
f3f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
f400: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
f410: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
f420: 26 26 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72  && (pPragma->mPr
f430: 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
f440: 52 65 61 64 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a  ReadOnly)==0 ){.
f450: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
f460: 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f  he specified coo
f470: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  kie value */.   
f480: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f490: 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74 43 6f  VdbeOpList setCo
f4a0: 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  okie[] = {.     
f4b0: 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74     { OP_Transact
f4c0: 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31 2c 20 20  ion,    0,  1,  
f4d0: 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20  0},    /* 0 */. 
f4e0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43         { OP_SetC
f4f0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20  ookie,      0,  
f500: 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20  0,  0},    /* 1 
f510: 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  */.      };.    
f520: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
f530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f540: 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65  VerifyNoMallocRe
f550: 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79 53  quired(v, ArrayS
f560: 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 29 3b  ize(setCookie));
f570: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c  .      aOp = sql
f580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
f590: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  t(v, ArraySize(s
f5a0: 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43 6f  etCookie), setCo
f5b0: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  okie, 0);.      
f5c0: 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c  if( ONLY_IF_REAL
f5d0: 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d  LOC_STRESS(aOp==
f5e0: 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  0) ) break;.    
f5f0: 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44    aOp[0].p1 = iD
f600: 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e  b;.      aOp[1].
f610: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
f620: 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69 43 6f 6f  aOp[1].p2 = iCoo
f630: 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  kie;.      aOp[1
f640: 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65 33 41 74  ].p3 = sqlite3At
f650: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
f660: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
f670: 52 65 61 64 20 74 68 65 20 73 70 65 63 69 66 69  Read the specifi
f680: 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  ed cookie value 
f690: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
f6a0: 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
f6b0: 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d 20 3d 20   readCookie[] = 
f6c0: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54  {.        { OP_T
f6d0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20  ransaction,     
f6e0: 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f  0,  0,  0},    /
f6f0: 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 0 */.        {
f700: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
f710: 20 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c       0,  1,  0},
f720: 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20      /* 1 */.    
f730: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
f740: 6f 77 2c 20 20 20 20 20 20 20 31 2c 20 20 31 2c  ow,       1,  1,
f750: 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b 0a 20 20    0}.      };.  
f760: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
f770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f780: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
f790: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
f7a0: 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65  ySize(readCookie
f7b0: 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  ));.      aOp = 
f7c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f7d0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
f7e0: 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 2c 72 65  e(readCookie),re
f7f0: 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20 20 20  adCookie,0);.   
f800: 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52     if( ONLY_IF_R
f810: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f  EALLOC_STRESS(aO
f820: 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20  p==0) ) break;. 
f830: 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d       aOp[0].p1 =
f840: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
f850: 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20  1].p1 = iDb;.   
f860: 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 69     aOp[1].p3 = i
f870: 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 73 71  Cookie;.      sq
f880: 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62 6c  lite3VdbeReusabl
f890: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(v);.    }.  }.
f8a0: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
f8b0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
f8c0: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52  CHEMA_VERSION_PR
f8d0: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
f8e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
f8f0: 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
f900: 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  S.  /*.  **   PR
f910: 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f 70 74  AGMA compile_opt
f920: 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ions.  **.  ** R
f930: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 73 20  eturn the names 
f940: 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 2d 74  of all compile-t
f950: 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75 73 65 64  ime options used
f960: 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 0a   in this build,.
f970: 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f 6e 20    ** one option 
f980: 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20  per row..  */.  
f990: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4d  case PragTyp_COM
f9a0: 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20 7b 0a  PILE_OPTIONS: {.
f9b0: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
f9c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f9d0: 4f 70 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Opt;.    pParse-
f9e0: 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20 20 77  >nMem = 1;.    w
f9f0: 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20 73 71  hile( (zOpt = sq
fa00: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
fa10: 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21 3d 30  ion_get(i++))!=0
fa20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fa30: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
fa40: 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20 20 20  v, 1, zOpt);.   
fa50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fa60: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
fa70: 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20  tRow, 1, 1);.   
fa80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
fa90: 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20  beReusable(v);. 
faa0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
fab0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
fac0: 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f  T_COMPILEOPTION_
fad0: 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  DIAGS */..#ifnde
fae0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
faf0: 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  L.  /*.  **   PR
fb00: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 77 61  AGMA [schema.]wa
fb10: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 70  l_checkpoint = p
fb20: 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72 65 73 74  assive|full|rest
fb30: 61 72 74 7c 74 72 75 6e 63 61 74 65 0a 20 20 2a  art|truncate.  *
fb40: 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  *.  ** Checkpoin
fb50: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  t the database..
fb60: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
fb70: 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b 50 4f 49  Typ_WAL_CHECKPOI
fb80: 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 42  NT: {.    int iB
fb90: 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69 44 62  t = (pId2->z?iDb
fba0: 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  :SQLITE_MAX_ATTA
fbb0: 43 48 45 44 29 3b 0a 20 20 20 20 69 6e 74 20 65  CHED);.    int e
fbc0: 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48  Mode = SQLITE_CH
fbd0: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
fbe0: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
fbf0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
fc00: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69  lite3StrICmp(zRi
fc10: 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d 30 20  ght, "full")==0 
fc20: 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
fc30: 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50   = SQLITE_CHECKP
fc40: 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  OINT_FULL;.     
fc50: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
fc60: 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74  e3StrICmp(zRight
fc70: 2c 20 22 72 65 73 74 61 72 74 22 29 3d 3d 30 20  , "restart")==0 
fc80: 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
fc90: 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50   = SQLITE_CHECKP
fca0: 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a 20 20  OINT_RESTART;.  
fcb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
fcc0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69  lite3StrICmp(zRi
fcd0: 67 68 74 2c 20 22 74 72 75 6e 63 61 74 65 22 29  ght, "truncate")
fce0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
fcf0: 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48  Mode = SQLITE_CH
fd00: 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
fd10: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
fd20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
fd30: 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71 6c 69 74  m = 3;.    sqlit
fd40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fd50: 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69  OP_Checkpoint, i
fd60: 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a 20  Bt, eMode, 1);. 
fd70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fd80: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
fd90: 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 7d  tRow, 1, 3);.  }
fda0: 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a 0a  .  break;..  /*.
fdb0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61    **   PRAGMA wa
fdc0: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
fdd0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77  .  **   PRAGMA w
fde0: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
fdf0: 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t = N.  **.  ** 
fe00: 43 6f 6e 66 69 67 75 72 65 20 61 20 64 61 74 61  Configure a data
fe10: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
fe20: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
fe30: 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 20 64 61   checkpoint a da
fe40: 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 66 74 65  tabase.  ** afte
fe50: 72 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 4e  r accumulating N
fe60: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
fe70: 6f 67 2e 20 4f 72 20 71 75 65 72 79 20 66 6f 72  og. Or query for
fe80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
fe90: 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20 20  ue.  ** of N..  
fea0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
feb0: 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50  p_WAL_AUTOCHECKP
fec0: 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 66 28 20  OINT: {.    if( 
fed0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
fee0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
fef0: 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 73  checkpoint(db, s
ff00: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
ff10: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  t));.    }.    r
ff20: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
ff30: 2c 20 0a 20 20 20 20 20 20 20 64 62 2d 3e 78 57  , .       db->xW
ff40: 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73 71 6c 69  alCallback==sqli
ff50: 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
ff60: 6b 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20  k ? .           
ff70: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
ff80: 54 28 64 62 2d 3e 70 57 61 6c 41 72 67 29 20 3a  T(db->pWalArg) :
ff90: 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b   0);.  }.  break
ffa0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  ;.#endif..  /*. 
ffb0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 68 72 69   **  PRAGMA shri
ffc0: 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a 0a 20  nk_memory.  **. 
ffd0: 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
ffe0: 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34 35 2d 34  ON-OF: R-23445-4
fff0: 36 31 30 39 20 54 68 69 73 20 70 72 61 67 6d 61  6109 This pragma
10000 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
10010 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63  base.  ** connec
10020 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68 20 69 74  tion on which it
10030 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 66   is invoked to f
10040 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
10050 65 6d 6f 72 79 20 61 73 20 69 74 0a 20 20 2a 2a  emory as it.  **
10060 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c 69 6e 67   can, by calling
10070 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65   sqlite3_db_rele
10080 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 20 20  ase_memory()..  
10090 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
100a0 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52 59 3a  p_SHRINK_MEMORY:
100b0 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64   {.    sqlite3_d
100c0 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
100d0 28 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  (db);.    break;
100e0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
100f0 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a 65   PRAGMA optimize
10100 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70  .  **  PRAGMA op
10110 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20 2a  timize(MASK).  *
10120 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61  *  PRAGMA schema
10130 2e 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20 20  .optimize.  **  
10140 50 52 41 47 4d 41 20 73 63 68 65 6d 61 2e 6f 70  PRAGMA schema.op
10150 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20 2a  timize(MASK).  *
10160 2a 0a 20 20 2a 2a 20 41 74 74 65 6d 70 74 20 74  *.  ** Attempt t
10170 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 64  o optimize the d
10180 61 74 61 62 61 73 65 2e 20 20 41 6c 6c 20 73 63  atabase.  All sc
10190 68 65 6d 61 73 20 61 72 65 20 6f 70 74 69 6d 69  hemas are optimi
101a0 7a 65 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  zed in the first
101b0 0a 20 20 2a 2a 20 74 77 6f 20 66 6f 72 6d 73 2c  .  ** two forms,
101c0 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 20 73 70   and only the sp
101d0 65 63 69 66 69 65 64 20 73 63 68 65 6d 61 20 69  ecified schema i
101e0 73 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e 20 74  s optimized in t
101f0 68 65 20 6c 61 74 74 65 72 20 74 77 6f 2e 0a 20  he latter two.. 
10200 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 74   **.  ** The det
10210 61 69 6c 73 20 6f 66 20 6f 70 74 69 6d 69 7a 61  ails of optimiza
10220 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
10230 62 79 20 74 68 69 73 20 70 72 61 67 6d 61 20 61  by this pragma a
10240 72 65 20 65 78 70 65 63 74 65 64 0a 20 20 2a 2a  re expected.  **
10250 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 64 20 69   to change and i
10260 6d 70 72 6f 76 65 20 6f 76 65 72 20 74 69 6d 65  mprove over time
10270 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20  .  Applications 
10280 73 68 6f 75 6c 64 20 61 6e 74 69 63 69 70 61 74  should anticipat
10290 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 69 73  e that.  ** this
102a0 20 70 72 61 67 6d 61 20 77 69 6c 6c 20 70 65 72   pragma will per
102b0 66 6f 72 6d 20 6e 65 77 20 6f 70 74 69 6d 69 7a  form new optimiz
102c0 61 74 69 6f 6e 73 20 69 6e 20 66 75 74 75 72 65  ations in future
102d0 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a 2a 0a   releases..  **.
102e0 20 20 2a 2a 20 54 68 65 20 6f 70 74 69 6f 6e 61    ** The optiona
102f0 6c 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  l argument is a 
10300 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
10310 69 7a 61 74 69 6f 6e 73 20 74 6f 20 70 65 72 66  izations to perf
10320 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
10330 20 20 30 78 30 30 30 31 20 20 20 20 44 65 62 75    0x0001    Debu
10340 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 44 6f 20  gging mode.  Do 
10350 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 70 65 72  not actually per
10360 66 6f 72 6d 20 61 6e 79 20 6f 70 74 69 6d 69 7a  form any optimiz
10370 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 20 20 20 20  ations.  **     
10380 20 20 20 20 20 20 20 20 20 62 75 74 20 69 6e 73           but ins
10390 74 65 61 64 20 72 65 74 75 72 6e 20 6f 6e 65 20  tead return one 
103a0 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 6f 72  line of text for
103b0 20 65 61 63 68 20 6f 70 74 69 6d 69 7a 61 74 69   each optimizati
103c0 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  on.  **         
103d0 20 20 20 20 20 74 68 61 74 20 77 6f 75 6c 64 20       that would 
103e0 68 61 76 65 20 62 65 65 6e 20 64 6f 6e 65 2e 20  have been done. 
103f0 20 4f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   Off by default.
10400 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78  .  **.  **    0x
10410 30 30 30 32 20 20 20 20 52 75 6e 20 41 4e 41 4c  0002    Run ANAL
10420 59 5a 45 20 6f 6e 20 74 61 62 6c 65 73 20 74 68  YZE on tables th
10430 61 74 20 6d 69 67 68 74 20 62 65 6e 65 66 69 74  at might benefit
10440 2e 20 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74  .  On by default
10450 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  ..  **          
10460 20 20 20 20 53 65 65 20 62 65 6c 6f 77 20 66 6f      See below fo
10470 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
10480 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20  ormation..  **. 
10490 20 2a 2a 20 20 20 20 30 78 30 30 30 34 20 20 20   **    0x0004   
104a0 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d   (Not yet implem
104b0 65 6e 74 65 64 29 20 52 65 63 6f 72 64 20 75 73  ented) Record us
104c0 61 67 65 20 61 6e 64 20 70 65 72 66 6f 72 6d 61  age and performa
104d0 6e 63 65 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  nce .  **       
104e0 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69         informati
104f0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  on from the curr
10500 65 6e 74 20 73 65 73 73 69 6f 6e 20 69 6e 20 74  ent session in t
10510 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  he.  **         
10520 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
10530 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  le so that it wi
10540 6c 6c 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20  ll be available 
10550 74 6f 20 22 6f 70 74 69 6d 69 7a 65 22 0a 20 20  to "optimize".  
10560 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10570 70 72 61 67 6d 61 73 20 72 75 6e 20 62 79 20 66  pragmas run by f
10580 75 74 75 72 65 20 64 61 74 61 62 61 73 65 20 63  uture database c
10590 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  onnections..  **
105a0 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 38 20  .  **    0x0008 
105b0 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c     (Not yet impl
105c0 65 6d 65 6e 74 65 64 29 20 43 72 65 61 74 65 20  emented) Create 
105d0 69 6e 64 65 78 65 73 20 74 68 61 74 20 6d 69 67  indexes that mig
105e0 68 74 20 68 61 76 65 0a 20 20 2a 2a 20 20 20 20  ht have.  **    
105f0 20 20 20 20 20 20 20 20 20 20 62 65 65 6e 20 68            been h
10600 65 6c 70 66 75 6c 20 74 6f 20 72 65 63 65 6e 74  elpful to recent
10610 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 0a 20 20   queries.  **.  
10620 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 4d  ** The default M
10630 41 53 4b 20 69 73 20 61 6e 64 20 61 6c 77 61 79  ASK is and alway
10640 73 20 73 68 61 6c 6c 20 62 65 20 30 78 66 66 66  s shall be 0xfff
10650 65 2e 20 20 30 78 66 66 66 65 20 6d 65 61 6e 73  e.  0xfffe means
10660 20 70 65 72 66 6f 72 6d 20 61 6c 6c 0a 20 20 2a   perform all.  *
10670 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * of the optimiz
10680 61 74 69 6f 6e 73 20 6c 69 73 74 65 64 20 61 62  ations listed ab
10690 6f 76 65 20 65 78 63 65 70 74 20 44 65 62 75 67  ove except Debug
106a0 20 4d 6f 64 65 2c 20 69 6e 63 6c 75 64 69 6e 67   Mode, including
106b0 20 6e 65 77 0a 20 20 2a 2a 20 6f 70 74 69 6d 69   new.  ** optimi
106c0 7a 61 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76  zations that hav
106d0 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69  e not yet been i
106e0 6e 76 65 6e 74 65 64 2e 20 20 49 66 20 6e 65 77  nvented.  If new
106f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61   optimizations a
10700 72 65 0a 20 20 2a 2a 20 65 76 65 72 20 61 64 64  re.  ** ever add
10710 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ed that should b
10720 65 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  e off by default
10730 2c 20 74 68 6f 73 65 20 6f 66 66 2d 62 79 2d 64  , those off-by-d
10740 65 66 61 75 6c 74 20 0a 20 20 2a 2a 20 6f 70 74  efault .  ** opt
10750 69 6d 69 7a 61 74 69 6f 6e 73 20 77 69 6c 6c 20  imizations will 
10760 68 61 76 65 20 62 69 74 6d 61 73 6b 73 20 6f 66  have bitmasks of
10770 20 30 78 31 30 30 30 30 20 6f 72 20 6c 61 72 67   0x10000 or larg
10780 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 45  er..  **.  ** DE
10790 54 45 52 4d 49 4e 41 54 49 4f 4e 20 4f 46 20 57  TERMINATION OF W
107a0 48 45 4e 20 54 4f 20 52 55 4e 20 41 4e 41 4c 59  HEN TO RUN ANALY
107b0 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  ZE.  **.  ** In 
107c0 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
107d0 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20 74 61  ementation, a ta
107e0 62 6c 65 20 69 73 20 61 6e 61 6c 79 7a 65 64 20  ble is analyzed 
107f0 69 66 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 6f  if only if all o
10800 66 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  f.  ** the follo
10810 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
10820 20 2a 2a 0a 20 20 2a 2a 20 28 31 29 20 4d 41 53   **.  ** (1) MAS
10830 4b 20 62 69 74 20 30 78 30 32 20 69 73 20 73 65  K bit 0x02 is se
10840 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 32 29  t..  **.  ** (2)
10850 20 54 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   The query plann
10860 65 72 20 75 73 65 64 20 73 71 6c 69 74 65 5f 73  er used sqlite_s
10870 74 61 74 31 2d 73 74 79 6c 65 20 73 74 61 74 69  tat1-style stati
10880 73 74 69 63 73 20 66 6f 72 20 6f 6e 65 20 6f 72  stics for one or
10890 0a 20 20 2a 2a 20 20 20 20 20 6d 6f 72 65 20 69  .  **     more i
108a0 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20 74 61  ndexes of the ta
108b0 62 6c 65 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ble at some poin
108c0 74 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66  t during the lif
108d0 65 74 69 6d 65 20 6f 66 0a 20 20 2a 2a 20 20 20  etime of.  **   
108e0 20 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f    the current co
108f0 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20  nnection..  **. 
10900 20 2a 2a 20 28 33 29 20 4f 6e 65 20 6f 72 20 6d   ** (3) One or m
10910 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74  ore indexes of t
10920 68 65 20 74 61 62 6c 65 20 61 72 65 20 63 75 72  he table are cur
10930 72 65 6e 74 6c 79 20 75 6e 61 6e 61 6c 79 7a 65  rently unanalyze
10940 64 20 4f 52 0a 20 20 2a 2a 20 20 20 20 20 74 68  d OR.  **     th
10950 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
10960 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 68 61   in the table ha
10970 73 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 32  s increased by 2
10980 35 20 74 69 6d 65 73 20 6f 72 20 6d 6f 72 65 0a  5 times or more.
10990 20 20 2a 2a 20 20 20 20 20 73 69 6e 63 65 20 74    **     since t
109a0 68 65 20 6c 61 73 74 20 74 69 6d 65 20 41 4e 41  he last time ANA
109b0 4c 59 5a 45 20 77 61 73 20 72 75 6e 2e 0a 20 20  LYZE was run..  
109c0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c 65  **.  ** The rule
109d0 73 20 66 6f 72 20 77 68 65 6e 20 74 61 62 6c 65  s for when table
109e0 73 20 61 72 65 20 61 6e 61 6c 79 7a 65 64 20 61  s are analyzed a
109f0 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 68 61  re likely to cha
10a00 6e 67 65 20 69 6e 0a 20 20 2a 2a 20 66 75 74 75  nge in.  ** futu
10a10 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a  re releases..  *
10a20 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
10a30 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b 0a 20 20 20  _OPTIMIZE: {.   
10a40 20 69 6e 74 20 69 44 62 4c 61 73 74 3b 20 20 20   int iDbLast;   
10a50 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10a60 74 65 72 6d 69 6e 61 74 69 6f 6e 20 70 6f 69 6e  termination poin
10a70 74 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  t for the schema
10a80 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74   loop */.    int
10a90 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20   iTabCur;       
10aa0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f      /* Cursor fo
10ab0 72 20 61 20 74 61 62 6c 65 20 77 68 6f 73 65 20  r a table whose 
10ac0 73 69 7a 65 20 6e 65 65 64 73 20 63 68 65 63 6b  size needs check
10ad0 69 6e 67 20 2a 2f 0a 20 20 20 20 48 61 73 68 45  ing */.    HashE
10ae0 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
10af0 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74    /* Loop over t
10b00 61 62 6c 65 73 20 6f 66 20 61 20 73 63 68 65 6d  ables of a schem
10b10 61 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  a */.    Schema 
10b20 2a 70 53 63 68 65 6d 61 3b 20 20 20 20 20 20 20  *pSchema;       
10b30 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 73  /* The current s
10b40 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 54 61 62  chema */.    Tab
10b50 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
10b60 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
10b70 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  n the schema */.
10b80 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
10b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
10ba0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   index of the ta
10bb0 62 6c 65 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73  ble */.    LogEs
10bc0 74 20 73 7a 54 68 72 65 73 68 6f 6c 64 3b 20 20  t szThreshold;  
10bd0 20 20 2f 2a 20 53 69 7a 65 20 74 68 72 65 73 68    /* Size thresh
10be0 6f 6c 64 20 61 62 6f 76 65 20 77 68 69 63 68 20  old above which 
10bf0 72 65 61 6e 61 6c 79 73 69 73 20 69 73 20 6e 65  reanalysis is ne
10c00 65 64 64 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  edd */.    char 
10c10 2a 7a 53 75 62 53 71 6c 3b 20 20 20 20 20 20 20  *zSubSql;       
10c20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    /* SQL stateme
10c30 6e 74 20 66 6f 72 20 74 68 65 20 4f 50 5f 53 71  nt for the OP_Sq
10c40 6c 45 78 65 63 20 6f 70 63 6f 64 65 20 2a 2f 0a  lExec opcode */.
10c50 20 20 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20      u32 opMask; 
10c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
10c70 73 6b 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  sk of operations
10c80 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 0a   to perform */..
10c90 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
10ca0 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d  {.      opMask =
10cb0 20 28 75 33 32 29 73 71 6c 69 74 65 33 41 74 6f   (u32)sqlite3Ato
10cc0 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
10cd0 20 69 66 28 20 28 6f 70 4d 61 73 6b 20 26 20 30   if( (opMask & 0
10ce0 78 30 32 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  x02)==0 ) break;
10cf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10d00 20 20 6f 70 4d 61 73 6b 20 3d 20 30 78 66 66 66    opMask = 0xfff
10d10 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61  e;.    }.    iTa
10d20 62 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  bCur = pParse->n
10d30 54 61 62 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 69  Tab++;.    for(i
10d40 44 62 4c 61 73 74 20 3d 20 7a 44 62 3f 69 44 62  DbLast = zDb?iDb
10d50 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3c  :db->nDb-1; iDb<
10d60 3d 69 44 62 4c 61 73 74 3b 20 69 44 62 2b 2b 29  =iDbLast; iDb++)
10d70 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d  {.      if( iDb=
10d80 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =1 ) continue;. 
10d90 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
10da0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
10db0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
10dc0 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61   pSchema = db->a
10dd0 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
10de0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  .      for(k=sql
10df0 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
10e00 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
10e10 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
10e20 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
10e30 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
10e40 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
10e50 6b 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  k);..        /* 
10e60 49 66 20 74 61 62 6c 65 20 70 54 61 62 20 68 61  If table pTab ha
10e70 73 20 6e 6f 74 20 62 65 65 6e 20 75 73 65 64 20  s not been used 
10e80 69 6e 20 61 20 77 61 79 20 74 68 61 74 20 77 6f  in a way that wo
10e90 75 6c 64 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  uld benefit from
10ea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 69  .        ** havi
10eb0 6e 67 20 61 6e 61 6c 79 73 69 73 20 73 74 61 74  ng analysis stat
10ec0 69 73 74 69 63 73 20 64 75 72 69 6e 67 20 74 68  istics during th
10ed0 65 20 63 75 72 72 65 6e 74 20 73 65 73 73 69 6f  e current sessio
10ee0 6e 2c 20 74 68 65 6e 20 73 6b 69 70 20 69 74 2e  n, then skip it.
10ef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
10f00 20 61 6c 73 6f 20 68 61 73 20 74 68 65 20 65 66   also has the ef
10f10 66 65 63 74 20 6f 66 20 73 6b 69 70 70 69 6e 67  fect of skipping
10f20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
10f30 61 6e 64 20 76 69 65 77 73 20 2a 2f 0a 20 20 20  and views */.   
10f40 20 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e       if( (pTab->
10f50 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 53 74  tabFlags & TF_St
10f60 61 74 73 55 73 65 64 29 3d 3d 30 20 29 20 63 6f  atsUsed)==0 ) co
10f70 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20  ntinue;..       
10f80 20 2f 2a 20 52 65 61 6e 61 6c 79 7a 65 20 69 66   /* Reanalyze if
10f90 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 32 35   the table is 25
10fa0 20 74 69 6d 65 73 20 6c 61 72 67 65 72 20 74 68   times larger th
10fb0 61 6e 20 74 68 65 20 6c 61 73 74 20 61 6e 61 6c  an the last anal
10fc0 79 73 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ysis */.        
10fd0 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 70 54  szThreshold = pT
10fe0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 2b  ab->nRowLogEst +
10ff0 20 34 36 3b 20 61 73 73 65 72 74 28 20 73 71 6c   46; assert( sql
11000 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 3d 3d  ite3LogEst(25)==
11010 34 36 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  46 );.        fo
11020 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
11030 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
11040 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
11050 20 20 20 20 20 20 20 20 69 66 28 20 21 70 49 64          if( !pId
11060 78 2d 3e 68 61 73 53 74 61 74 31 20 29 7b 0a 20  x->hasStat1 ){. 
11070 20 20 20 20 20 20 20 20 20 20 20 73 7a 54 68 72             szThr
11080 65 73 68 6f 6c 64 20 3d 20 30 3b 20 2f 2a 20 41  eshold = 0; /* A
11090 6c 77 61 79 73 20 61 6e 61 6c 79 7a 65 20 69 66  lways analyze if
110a0 20 61 6e 79 20 69 6e 64 65 78 20 6c 61 63 6b 73   any index lacks
110b0 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   statistics */. 
110c0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
110d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
110e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
110f0 69 66 28 20 73 7a 54 68 72 65 73 68 6f 6c 64 20  if( szThreshold 
11100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
11110 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
11120 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c 20 69  arse, iTabCur, i
11130 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
11140 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20  nRead);.        
11150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11160 4f 70 33 28 76 2c 20 4f 50 5f 49 66 53 6d 61 6c  Op3(v, OP_IfSmal
11170 6c 65 72 2c 20 69 54 61 62 43 75 72 2c 20 0a 20  ler, iTabCur, . 
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
111a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
111b0 29 2b 32 2b 28 6f 70 4d 61 73 6b 26 31 29 2c 20  )+2+(opMask&1), 
111c0 73 7a 54 68 72 65 73 68 6f 6c 64 29 3b 0a 20 20  szThreshold);.  
111d0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
111e0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
111f0 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 75 62 53   }.        zSubS
11200 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ql = sqlite3MPri
11210 6e 74 66 28 64 62 2c 20 22 41 4e 41 4c 59 5a 45  ntf(db, "ANALYZE
11220 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22 22 2c   \"%w\".\"%w\"",
11230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11250 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
11260 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  DbSName, pTab->z
11270 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
11280 66 28 20 6f 70 4d 61 73 6b 20 26 20 30 78 30 31  f( opMask & 0x01
11290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
112a0 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
112b0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
112c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
112d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
112e0 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
112f0 72 31 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20  r1, 0, zSubSql, 
11300 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
11310 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11320 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
11330 65 73 75 6c 74 52 6f 77 2c 20 72 31 2c 20 31 29  esultRow, r1, 1)
11340 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11350 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11360 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
11370 4f 50 5f 53 71 6c 45 78 65 63 2c 20 30 2c 20 30  OP_SqlExec, 0, 0
11380 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20 50 34  , 0, zSubSql, P4
11390 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
113a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
113b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
113c0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45  beAddOp0(v, OP_E
113d0 78 70 69 72 65 29 3b 0a 20 20 20 20 62 72 65 61  xpire);.    brea
113e0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
113f0 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f  *   PRAGMA busy_
11400 74 69 6d 65 6f 75 74 0a 20 20 2a 2a 20 20 20 50  timeout.  **   P
11410 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f  RAGMA busy_timeo
11420 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  ut = N.  **.  **
11430 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 62 75   Call sqlite3_bu
11440 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 4e  sy_timeout(db, N
11450 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 63  ).  Return the c
11460 75 72 72 65 6e 74 20 74 69 6d 65 6f 75 74 20 76  urrent timeout v
11470 61 6c 75 65 0a 20 20 2a 2a 20 69 66 20 6f 6e 65  alue.  ** if one
11480 20 69 73 20 73 65 74 2e 20 20 49 66 20 6e 6f 20   is set.  If no 
11490 62 75 73 79 20 68 61 6e 64 6c 65 72 20 6f 72 20  busy handler or 
114a0 61 20 64 69 66 66 65 72 65 6e 74 20 62 75 73 79  a different busy
114b0 20 68 61 6e 64 6c 65 72 20 69 73 20 73 65 74 0a   handler is set.
114c0 20 20 2a 2a 20 74 68 65 6e 20 30 20 69 73 20 72    ** then 0 is r
114d0 65 74 75 72 6e 65 64 2e 20 20 53 65 74 74 69 6e  eturned.  Settin
114e0 67 20 74 68 65 20 62 75 73 79 5f 74 69 6d 65 6f  g the busy_timeo
114f0 75 74 20 74 6f 20 30 20 6f 72 20 6e 65 67 61 74  ut to 0 or negat
11500 69 76 65 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65  ive.  ** disable
11510 73 20 74 68 65 20 74 69 6d 65 6f 75 74 2e 0a 20  s the timeout.. 
11520 20 2a 2f 0a 20 20 2f 2a 63 61 73 65 20 50 72 61   */.  /*case Pra
11530 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55  gTyp_BUSY_TIMEOU
11540 54 2a 2f 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20  T*/ default: {. 
11550 20 20 20 61 73 73 65 72 74 28 20 70 50 72 61 67     assert( pPrag
11560 6d 61 2d 3e 65 50 72 61 67 54 79 70 3d 3d 50 72  ma->ePragTyp==Pr
11570 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f  agTyp_BUSY_TIMEO
11580 55 54 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  UT );.    if( zR
11590 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
115a0 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
115b0 75 74 28 64 62 2c 20 73 71 6c 69 74 65 33 41 74  ut(db, sqlite3At
115c0 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20  oi(zRight));.   
115d0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
115e0 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 62 75  gleInt(v, db->bu
115f0 73 79 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20  syTimeout);.    
11600 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
11610 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73  .  **   PRAGMA s
11620 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 0a 20  oft_heap_limit. 
11630 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f 66   **   PRAGMA sof
11640 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3d 20 4e  t_heap_limit = N
11650 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45  .  **.  ** IMPLE
11660 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
11670 32 36 33 34 33 2d 34 35 39 33 30 20 54 68 69 73  26343-45930 This
11680 20 70 72 61 67 6d 61 20 69 6e 76 6f 6b 65 73 20   pragma invokes 
11690 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
116a0 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
116b0 36 34 28 29 20 69 6e 74 65 72 66 61 63 65 20 77  64() interface w
116c0 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ith the argument
116d0 20 4e 2c 20 69 66 20 4e 20 69 73 0a 20 20 2a 2a   N, if N is.  **
116e0 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 20 69   specified and i
116f0 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  s a non-negative
11700 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 20 49   integer..  ** I
11710 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
11720 3a 20 52 2d 36 34 34 35 31 2d 30 37 31 36 33 20  : R-64451-07163 
11730 54 68 65 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69  The soft_heap_li
11740 6d 69 74 20 70 72 61 67 6d 61 20 61 6c 77 61 79  mit pragma alway
11750 73 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74  s.  ** returns t
11760 68 65 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20  he same integer 
11770 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 72 65  that would be re
11780 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20  turned by the.  
11790 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  ** sqlite3_soft_
117a0 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29  heap_limit64(-1)
117b0 20 43 2d 6c 61 6e 67 75 61 67 65 20 66 75 6e 63   C-language func
117c0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
117d0 65 20 50 72 61 67 54 79 70 5f 53 4f 46 54 5f 48  e PragTyp_SOFT_H
117e0 45 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20  EAP_LIMIT: {.   
117f0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e   sqlite3_int64 N
11800 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
11810 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72   && sqlite3DecOr
11820 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c  HexToI64(zRight,
11830 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   &N)==SQLITE_OK 
11840 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11850 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
11860 36 34 28 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  64(N);.    }.   
11870 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
11880 28 76 2c 20 73 71 6c 69 74 65 33 5f 73 6f 66 74  (v, sqlite3_soft
11890 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31  _heap_limit64(-1
118a0 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
118b0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
118c0 50 52 41 47 4d 41 20 74 68 72 65 61 64 73 0a 20  PRAGMA threads. 
118d0 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72   **   PRAGMA thr
118e0 65 61 64 73 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20  eads = N.  **.  
118f0 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65  ** Configure the
11900 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
11910 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64  of worker thread
11920 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  s.  Return the n
11930 65 77 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 2c  ew.  ** maximum,
11940 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
11950 6c 65 73 73 20 74 68 61 6e 20 72 65 71 75 65 73  less than reques
11960 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
11970 20 50 72 61 67 54 79 70 5f 54 48 52 45 41 44 53   PragTyp_THREADS
11980 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
11990 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28  int64 N;.    if(
119a0 20 7a 52 69 67 68 74 0a 20 20 20 20 20 26 26 20   zRight.     && 
119b0 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
119c0 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 4e 29  oI64(zRight, &N)
119d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
119e0 20 26 26 20 4e 3e 3d 30 0a 20 20 20 20 29 7b 0a   && N>=0.    ){.
119f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69        sqlite3_li
11a00 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c  mit(db, SQLITE_L
11a10 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
11a20 41 44 53 2c 20 28 69 6e 74 29 28 4e 26 30 78 37  ADS, (int)(N&0x7
11a30 66 66 66 66 66 66 66 29 29 3b 0a 20 20 20 20 7d  fffffff));.    }
11a40 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
11a50 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 5f  eInt(v, sqlite3_
11a60 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45  limit(db, SQLITE
11a70 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
11a80 52 45 41 44 53 2c 20 2d 31 29 29 3b 0a 20 20 20  READS, -1));.   
11a90 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66   break;.  }..#if
11aa0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
11ab0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
11ac0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
11ad0 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f 72 74 20   /*.  ** Report 
11ae0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
11af0 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67 73 20 66  e of file logs f
11b00 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  or all databases
11b10 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
11b20 67 54 79 70 5f 4c 4f 43 4b 5f 53 54 41 54 55 53  gTyp_LOCK_STATUS
11b30 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  : {.    static c
11b40 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
11b50 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20 3d 20   azLockName[] = 
11b60 7b 0a 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 65  {.      "unlocke
11b70 64 22 2c 20 22 73 68 61 72 65 64 22 2c 20 22 72  d", "shared", "r
11b80 65 73 65 72 76 65 64 22 2c 20 22 70 65 6e 64 69  eserved", "pendi
11b90 6e 67 22 2c 20 22 65 78 63 6c 75 73 69 76 65 22  ng", "exclusive"
11ba0 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
11bb0 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  i;.    pParse->n
11bc0 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72  Mem = 2;.    for
11bd0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
11be0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
11bf0 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 20 20 63  ee *pBt;.      c
11c00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74  onst char *zStat
11c10 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  e = "unknown";. 
11c20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
11c30 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
11c40 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30 20 29 20 63  .zDbSName==0 ) c
11c50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
11c60 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
11c70 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
11c80 42 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  Bt==0 || sqlite3
11c90 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3d  BtreePager(pBt)=
11ca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  =0 ){.        zS
11cb0 74 61 74 65 20 3d 20 22 63 6c 6f 73 65 64 22 3b  tate = "closed";
11cc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
11cd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
11ce0 6e 74 72 6f 6c 28 64 62 2c 20 69 20 3f 20 64 62  ntrol(db, i ? db
11cf0 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
11d00 65 20 3a 20 30 2c 20 0a 20 20 20 20 20 20 20 20  e : 0, .        
11d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
11d30 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
11d40 41 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49 54 45  ATE, &j)==SQLITE
11d50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11d60 7a 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63 6b 4e  zState = azLockN
11d70 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a  ame[j];.      }.
11d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11d90 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
11da0 20 22 73 73 22 2c 20 64 62 2d 3e 61 44 62 5b 69   "ss", db->aDb[i
11db0 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 53 74 61  ].zDbSName, zSta
11dc0 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  te);.    }.    b
11dd0 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
11de0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11df0 48 41 53 5f 43 4f 44 45 43 0a 20 20 63 61 73 65  HAS_CODEC.  case
11e00 20 50 72 61 67 54 79 70 5f 4b 45 59 3a 20 7b 0a   PragTyp_KEY: {.
11e10 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
11e20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28   sqlite3_key_v2(
11e30 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c  db, zDb, zRight,
11e40 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
11e50 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 62  (zRight));.    b
11e60 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65  reak;.  }.  case
11e70 20 50 72 61 67 54 79 70 5f 52 45 4b 45 59 3a 20   PragTyp_REKEY: 
11e80 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
11e90 20 29 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79   ) sqlite3_rekey
11ea0 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69  _v2(db, zDb, zRi
11eb0 67 68 74 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ght, sqlite3Strl
11ec0 65 6e 33 30 28 7a 52 69 67 68 74 29 29 3b 0a 20  en30(zRight));. 
11ed0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
11ee0 63 61 73 65 20 50 72 61 67 54 79 70 5f 48 45 58  case PragTyp_HEX
11ef0 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a  KEY: {.    if( z
11f00 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 75  Right ){.      u
11f10 38 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69  8 iByte;.      i
11f20 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72  nt i;.      char
11f30 20 7a 4b 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20   zKey[40];.     
11f40 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d   for(i=0, iByte=
11f50 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79  0; i<sizeof(zKey
11f60 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49 73  )*2 && sqlite3Is
11f70 78 64 69 67 69 74 28 7a 52 69 67 68 74 5b 69 5d  xdigit(zRight[i]
11f80 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
11f90 20 69 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c   iByte = (iByte<
11fa0 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78  <4) + sqlite3Hex
11fb0 54 6f 49 6e 74 28 7a 52 69 67 68 74 5b 69 5d 29  ToInt(zRight[i])
11fc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  ;.        if( (i
11fd0 26 31 29 21 3d 30 20 29 20 7a 4b 65 79 5b 69 2f  &1)!=0 ) zKey[i/
11fe0 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20  2] = iByte;.    
11ff0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 7a    }.      if( (z
12000 4c 65 66 74 5b 33 5d 20 26 20 30 78 66 29 3d 3d  Left[3] & 0xf)==
12010 30 78 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0xb ){.        s
12020 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62  qlite3_key_v2(db
12030 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32  , zDb, zKey, i/2
12040 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12050 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12060 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62  rekey_v2(db, zDb
12070 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20  , zKey, i/2);.  
12080 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12090 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
120a0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
120b0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
120c0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
120d0 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 29 0a  E_ENABLE_CEROD).
120e0 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
120f0 43 54 49 56 41 54 45 5f 45 58 54 45 4e 53 49 4f  CTIVATE_EXTENSIO
12100 4e 53 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29  NS: if( zRight )
12110 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
12120 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66  HAS_CODEC.    if
12130 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
12140 70 28 7a 52 69 67 68 74 2c 20 22 73 65 65 2d 22  p(zRight, "see-"
12150 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)==0 ){.     
12160 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74   sqlite3_activat
12170 65 5f 73 65 65 28 26 7a 52 69 67 68 74 5b 34 5d  e_see(&zRight[4]
12180 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
12190 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
121a0 41 42 4c 45 5f 43 45 52 4f 44 0a 20 20 20 20 69  ABLE_CEROD.    i
121b0 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
121c0 6d 70 28 7a 52 69 67 68 74 2c 20 22 63 65 72 6f  mp(zRight, "cero
121d0 64 2d 22 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20  d-", 6)==0 ){.  
121e0 20 20 20 20 73 71 6c 69 74 65 33 5f 61 63 74 69      sqlite3_acti
121f0 76 61 74 65 5f 63 65 72 6f 64 28 26 7a 52 69 67  vate_cerod(&zRig
12200 68 74 5b 36 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  ht[6]);.    }.#e
12210 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b  ndif.  }.  break
12220 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a  ;.#endif..  } /*
12230 20 45 6e 64 20 6f 66 20 74 68 65 20 50 52 41 47   End of the PRAG
12240 4d 41 20 73 77 69 74 63 68 20 2a 2f 0a 0a 20 20  MA switch */..  
12250 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
12260 20 62 6c 6f 63 6b 20 69 73 20 61 20 6e 6f 2d 6f   block is a no-o
12270 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f  p unless SQLITE_
12280 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
12290 2e 20 49 74 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20  . Its only.  ** 
122a0 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20 65 78  purpose is to ex
122b0 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
122c0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 76 65 72  tatements to ver
122d0 69 66 79 20 74 68 61 74 20 69 66 20 74 68 65 0a  ify that if the.
122e0 20 20 2a 2a 20 50 72 61 67 46 6c 67 5f 4e 6f 43    ** PragFlg_NoC
122f0 6f 6c 75 6d 6e 73 31 20 66 6c 61 67 20 69 73 20  olumns1 flag is 
12300 73 65 74 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  set and the call
12310 65 72 20 73 70 65 63 69 66 69 65 64 20 61 6e 20  er specified an 
12320 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f  argument.  ** to
12330 20 74 68 65 20 50 52 41 47 4d 41 2c 20 74 68 65   the PRAGMA, the
12340 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12350 68 61 73 20 6e 6f 74 20 61 64 64 65 64 20 61 6e  has not added an
12360 79 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 0a  y OP_ResultRow .
12370 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
12380 73 20 74 6f 20 74 68 65 20 56 4d 2e 20 20 2a 2f  s to the VM.  */
12390 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d  .  if( (pPragma-
123a0 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
123b0 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 20  Flg_NoColumns1) 
123c0 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  && zRight ){.   
123d0 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
123e0 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28 76 29  fyNoResultRow(v)
123f0 3b 0a 20 20 7d 0a 0a 70 72 61 67 6d 61 5f 6f 75  ;.  }..pragma_ou
12400 74 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  t:.  sqlite3DbFr
12410 65 65 28 64 62 2c 20 7a 4c 65 66 74 29 3b 0a 20  ee(db, zLeft);. 
12420 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12430 62 2c 20 7a 52 69 67 68 74 29 3b 0a 7d 0a 23 69  b, zRight);.}.#i
12440 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12450 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
12460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
124b0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
124c0 6f 66 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  of an eponymous 
124d0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
124e0 61 74 20 72 75 6e 73 20 61 20 70 72 61 67 6d 61  at runs a pragma
124f0 2e 0a 2a 2a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ..**.*/.typedef 
12500 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61  struct PragmaVta
12510 62 20 50 72 61 67 6d 61 56 74 61 62 3b 0a 74 79  b PragmaVtab;.ty
12520 70 65 64 65 66 20 73 74 72 75 63 74 20 50 72 61  pedef struct Pra
12530 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 50 72  gmaVtabCursor Pr
12540 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 3b 0a  agmaVtabCursor;.
12550 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61  struct PragmaVta
12560 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  b {.  sqlite3_vt
12570 61 62 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  ab base;        
12580 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20 20  /* Base class.  
12590 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f  Must be first */
125a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
125c0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
125d0 6e 65 63 74 69 6f 6e 20 74 6f 20 77 68 69 63 68  nection to which
125e0 20 69 74 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20   it belongs */. 
125f0 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d   const PragmaNam
12600 65 20 2a 70 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61  e *pName;  /* Na
12610 6d 65 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61  me of the pragma
12620 20 2a 2f 0a 20 20 75 38 20 6e 48 69 64 64 65 6e   */.  u8 nHidden
12630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12640 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68 69 64  /* Number of hid
12650 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  den columns */. 
12660 20 75 38 20 69 48 69 64 64 65 6e 3b 20 20 20 20   u8 iHidden;    
12670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12680 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
12690 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a   hidden column *
126a0 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 50 72 61 67  /.};.struct Prag
126b0 6d 61 56 74 61 62 43 75 72 73 6f 72 20 7b 0a 20  maVtabCursor {. 
126c0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
126d0 72 73 6f 72 20 62 61 73 65 3b 20 2f 2a 20 42 61  rsor base; /* Ba
126e0 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20  se class.  Must 
126f0 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71  be first */.  sq
12700 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 72 61  lite3_stmt *pPra
12710 67 6d 61 3b 20 20 20 20 2f 2a 20 54 68 65 20 70  gma;    /* The p
12720 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 20  ragma statement 
12730 74 6f 20 72 75 6e 20 2a 2f 0a 20 20 73 71 6c 69  to run */.  sqli
12740 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 3b  te_int64 iRowid;
12750 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
12760 20 72 6f 77 69 64 20 2a 2f 0a 20 20 63 68 61 72   rowid */.  char
12770 20 2a 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20 20   *azArg[2];     
12780 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
12790 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 61  f the argument a
127a0 6e 64 20 73 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a  nd schema */.};.
127b0 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ./* .** Pragma v
127c0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
127d0 75 6c 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74  ule xConnect met
127e0 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
127f0 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e  nt pragmaVtabCon
12800 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  nect(.  sqlite3 
12810 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75  *db,.  void *pAu
12820 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63  x,.  int argc, c
12830 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
12840 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33  *argv,.  sqlite3
12850 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a  _vtab **ppVtab,.
12860 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
12870 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61  {.  const Pragma
12880 4e 61 6d 65 20 2a 70 50 72 61 67 6d 61 20 3d 20  Name *pPragma = 
12890 28 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d  (const PragmaNam
128a0 65 2a 29 70 41 75 78 3b 0a 20 20 50 72 61 67 6d  e*)pAux;.  Pragm
128b0 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 30 3b  aVtab *pTab = 0;
128c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
128d0 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 53   i, j;.  char cS
128e0 65 70 20 3d 20 27 28 27 3b 0a 20 20 53 74 72 41  ep = '(';.  StrA
128f0 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72  ccum acc;.  char
12900 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 0a 20 20 55   zBuf[200];..  U
12910 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12920 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  argc);.  UNUSED_
12930 50 41 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b  PARAMETER(argv);
12940 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
12950 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c 20  umInit(&acc, 0, 
12960 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75  zBuf, sizeof(zBu
12970 66 29 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  f), 0);.  sqlite
12980 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
12990 6c 6c 28 26 61 63 63 2c 20 22 43 52 45 41 54 45  ll(&acc, "CREATE
129a0 20 54 41 42 4c 45 20 78 22 29 3b 0a 20 20 66 6f   TABLE x");.  fo
129b0 72 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61  r(i=0, j=pPragma
129c0 2d 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c  ->iPragCName; i<
129d0 70 50 72 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e  pPragma->nPragCN
129e0 61 6d 65 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  ame; i++, j++){.
129f0 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
12a00 74 66 28 26 61 63 63 2c 20 22 25 63 5c 22 25 73  tf(&acc, "%c\"%s
12a10 5c 22 22 2c 20 63 53 65 70 2c 20 70 72 61 67 43  \"", cSep, pragC
12a20 4e 61 6d 65 5b 6a 5d 29 3b 0a 20 20 20 20 63 53  Name[j]);.    cS
12a30 65 70 20 3d 20 27 2c 27 3b 0a 20 20 7d 0a 20 20  ep = ',';.  }.  
12a40 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
12a50 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
12a60 61 63 63 2c 20 22 28 5c 22 25 73 5c 22 22 2c 20  acc, "(\"%s\"", 
12a70 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b  pPragma->zName);
12a80 0a 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27 3b  .    cSep = ',';
12a90 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20  .    i++;.  }.  
12aa0 6a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 72  j = 0;.  if( pPr
12ab0 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26  agma->mPragFlg &
12ac0 20 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31   PragFlg_Result1
12ad0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
12ae0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c  trAccumAppendAll
12af0 28 26 61 63 63 2c 20 22 2c 61 72 67 20 48 49 44  (&acc, ",arg HID
12b00 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  DEN");.    j++;.
12b10 20 20 7d 0a 20 20 69 66 28 20 70 50 72 61 67 6d    }.  if( pPragm
12b20 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 28 50  a->mPragFlg & (P
12b30 72 61 67 46 6c 67 5f 53 63 68 65 6d 61 4f 70 74  ragFlg_SchemaOpt
12b40 7c 50 72 61 67 46 6c 67 5f 53 63 68 65 6d 61 52  |PragFlg_SchemaR
12b50 65 71 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eq) ){.    sqlit
12b60 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
12b70 41 6c 6c 28 26 61 63 63 2c 20 22 2c 73 63 68 65  All(&acc, ",sche
12b80 6d 61 20 48 49 44 44 45 4e 22 29 3b 0a 20 20 20  ma HIDDEN");.   
12b90 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   j++;.  }.  sqli
12ba0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
12bb0 64 28 26 61 63 63 2c 20 22 29 22 2c 20 31 29 3b  d(&acc, ")", 1);
12bc0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
12bd0 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a  umFinish(&acc);.
12be0 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e    assert( strlen
12bf0 28 7a 42 75 66 29 20 3c 20 73 69 7a 65 6f 66 28  (zBuf) < sizeof(
12c00 7a 42 75 66 29 2d 31 20 29 3b 0a 20 20 72 63 20  zBuf)-1 );.  rc 
12c10 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  = sqlite3_declar
12c20 65 5f 76 74 61 62 28 64 62 2c 20 7a 42 75 66 29  e_vtab(db, zBuf)
12c30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
12c40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61  TE_OK ){.    pTa
12c50 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a  b = (PragmaVtab*
12c60 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
12c70 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61  sizeof(PragmaVta
12c80 62 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  b));.    if( pTa
12c90 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  b==0 ){.      rc
12ca0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
12cb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12cc0 20 20 6d 65 6d 73 65 74 28 70 54 61 62 2c 20 30    memset(pTab, 0
12cd0 2c 20 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56  , sizeof(PragmaV
12ce0 74 61 62 29 29 3b 0a 20 20 20 20 20 20 70 54 61  tab));.      pTa
12cf0 62 2d 3e 70 4e 61 6d 65 20 3d 20 70 50 72 61 67  b->pName = pPrag
12d00 6d 61 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ma;.      pTab->
12d10 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 70  db = db;.      p
12d20 54 61 62 2d 3e 69 48 69 64 64 65 6e 20 3d 20 69  Tab->iHidden = i
12d30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 48  ;.      pTab->nH
12d40 69 64 64 65 6e 20 3d 20 6a 3b 0a 20 20 20 20 7d  idden = j;.    }
12d50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
12d60 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
12d70 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
12d80 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
12d90 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 74 61 62  ;.  }..  *ppVtab
12da0 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62   = (sqlite3_vtab
12db0 2a 29 70 54 61 62 3b 0a 20 20 72 65 74 75 72 6e  *)pTab;.  return
12dc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50   rc;.}../* .** P
12dd0 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
12de0 62 6c 65 20 6d 6f 64 75 6c 65 20 78 44 69 73 63  ble module xDisc
12df0 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a  onnect method..*
12e00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
12e10 67 6d 61 56 74 61 62 44 69 73 63 6f 6e 6e 65 63  gmaVtabDisconnec
12e20 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  t(sqlite3_vtab *
12e30 70 56 74 61 62 29 7b 0a 20 20 50 72 61 67 6d 61  pVtab){.  Pragma
12e40 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72  Vtab *pTab = (Pr
12e50 61 67 6d 61 56 74 61 62 2a 29 70 56 74 61 62 3b  agmaVtab*)pVtab;
12e60 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12e70 70 54 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  pTab);.  return 
12e80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12e90 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
12ea0 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73  best index to us
12eb0 65 20 74 6f 20 73 65 61 72 63 68 20 61 20 70 72  e to search a pr
12ec0 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
12ed0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  le..**.** There 
12ee0 61 72 65 20 6e 6f 74 20 72 65 61 6c 6c 79 20 61  are not really a
12ef0 6e 79 20 69 6e 64 65 78 20 63 68 6f 69 63 65 73  ny index choices
12f00 2e 20 20 42 75 74 20 77 65 20 77 61 6e 74 20 74  .  But we want t
12f10 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65 0a  o encourage the.
12f20 2a 2a 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  ** query planner
12f30 20 74 6f 20 67 69 76 65 20 3d 3d 20 63 6f 6e 73   to give == cons
12f40 74 72 61 69 6e 74 73 20 6f 6e 20 61 73 20 6d 61  traints on as ma
12f50 6e 79 20 68 69 64 64 65 6e 20 70 61 72 61 6d 65  ny hidden parame
12f60 74 65 72 73 20 61 73 0a 2a 2a 20 70 6f 73 73 69  ters as.** possi
12f70 62 6c 65 2c 20 61 6e 64 20 65 73 70 65 63 69 61  ble, and especia
12f80 6c 6c 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74  lly on the first
12f90 20 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65   hidden paramete
12fa0 72 2e 20 20 53 6f 20 72 65 74 75 72 6e 20 61 0a  r.  So return a.
12fb0 2a 2a 20 68 69 67 68 20 63 6f 73 74 20 69 66 20  ** high cost if 
12fc0 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72  hidden parameter
12fd0 73 20 61 72 65 20 75 6e 63 6f 6e 73 74 72 61 69  s are unconstrai
12fe0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
12ff0 6e 74 20 70 72 61 67 6d 61 56 74 61 62 42 65 73  nt pragmaVtabBes
13000 74 49 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76  tIndex(sqlite3_v
13010 74 61 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65  tab *tab, sqlite
13020 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
13030 64 78 49 6e 66 6f 29 7b 0a 20 20 50 72 61 67 6d  dxInfo){.  Pragm
13040 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50  aVtab *pTab = (P
13050 72 61 67 6d 61 56 74 61 62 2a 29 74 61 62 3b 0a  ragmaVtab*)tab;.
13060 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
13070 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
13080 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72  straint *pConstr
13090 61 69 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  aint;.  int i, j
130a0 3b 0a 20 20 69 6e 74 20 73 65 65 6e 5b 32 5d 3b  ;.  int seen[2];
130b0 0a 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ..  pIdxInfo->es
130c0 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64  timatedCost = (d
130d0 6f 75 62 6c 65 29 31 3b 0a 20 20 69 66 28 20 70  ouble)1;.  if( p
130e0 54 61 62 2d 3e 6e 48 69 64 64 65 6e 3d 3d 30 20  Tab->nHidden==0 
130f0 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
13100 5f 4f 4b 3b 20 7d 0a 20 20 70 43 6f 6e 73 74 72  _OK; }.  pConstr
13110 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d  aint = pIdxInfo-
13120 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
13130 73 65 65 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 73  seen[0] = 0;.  s
13140 65 65 6e 5b 31 5d 20 3d 20 30 3b 0a 20 20 66 6f  een[1] = 0;.  fo
13150 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
13160 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
13170 69 2b 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74  i++, pConstraint
13180 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f  ++){.    if( pCo
13190 6e 73 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65  nstraint->usable
131a0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
131b0 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61      if( pConstra
131c0 69 6e 74 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f  int->op!=SQLITE_
131d0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
131e0 5f 45 51 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  _EQ ) continue;.
131f0 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61      if( pConstra
13200 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3c 20 70  int->iColumn < p
13210 54 61 62 2d 3e 69 48 69 64 64 65 6e 20 29 20 63  Tab->iHidden ) c
13220 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6a 20 3d  ontinue;.    j =
13230 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43   pConstraint->iC
13240 6f 6c 75 6d 6e 20 2d 20 70 54 61 62 2d 3e 69 48  olumn - pTab->iH
13250 69 64 64 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  idden;.    asser
13260 74 28 20 6a 20 3c 20 32 20 29 3b 0a 20 20 20 20  t( j < 2 );.    
13270 73 65 65 6e 5b 6a 5d 20 3d 20 69 2b 31 3b 0a 20  seen[j] = i+1;. 
13280 20 7d 0a 20 20 69 66 28 20 73 65 65 6e 5b 30 5d   }.  if( seen[0]
13290 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49  ==0 ){.    pIdxI
132a0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
132b0 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 31 34  st = (double)214
132c0 37 34 38 33 36 34 37 3b 0a 20 20 20 20 70 49 64  7483647;.    pId
132d0 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
132e0 52 6f 77 73 20 3d 20 32 31 34 37 34 38 33 36 34  Rows = 214748364
132f0 37 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  7;.    return SQ
13300 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6a  LITE_OK;.  }.  j
13310 20 3d 20 73 65 65 6e 5b 30 5d 2d 31 3b 0a 20 20   = seen[0]-1;.  
13320 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
13330 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72  raintUsage[j].ar
13340 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 70  gvIndex = 1;.  p
13350 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
13360 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69  aintUsage[j].omi
13370 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 73 65 65  t = 1;.  if( see
13380 6e 5b 31 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  n[1]==0 ) return
13390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 49   SQLITE_OK;.  pI
133a0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
133b0 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29  dCost = (double)
133c0 32 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  20;.  pIdxInfo->
133d0 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20  estimatedRows = 
133e0 32 30 3b 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 31  20;.  j = seen[1
133f0 5d 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  ]-1;.  pIdxInfo-
13400 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
13410 65 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  e[j].argvIndex =
13420 20 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   2;.  pIdxInfo->
13430 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
13440 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  [j].omit = 1;.  
13450 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13460 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20 61  ;.}../* Create a
13470 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
13480 74 68 65 20 70 72 61 67 6d 61 20 76 69 72 74 75  the pragma virtu
13490 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74  al table */.stat
134a0 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
134b0 62 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74  bOpen(sqlite3_vt
134c0 61 62 20 2a 70 56 74 61 62 2c 20 73 71 6c 69 74  ab *pVtab, sqlit
134d0 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
134e0 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 50 72  *ppCursor){.  Pr
134f0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a  agmaVtabCursor *
13500 70 43 73 72 3b 0a 20 20 70 43 73 72 20 3d 20 28  pCsr;.  pCsr = (
13510 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13520 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
13530 28 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b  (sizeof(*pCsr));
13540 0a 20 20 69 66 28 20 70 43 73 72 3d 3d 30 20 29  .  if( pCsr==0 )
13550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13560 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
13570 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  Csr, 0, sizeof(P
13580 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 29  ragmaVtabCursor)
13590 29 3b 0a 20 20 70 43 73 72 2d 3e 62 61 73 65 2e  );.  pCsr->base.
135a0 70 56 74 61 62 20 3d 20 70 56 74 61 62 3b 0a 20  pVtab = pVtab;. 
135b0 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 26 70 43   *ppCursor = &pC
135c0 73 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 75  sr->base;.  retu
135d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
135e0 0a 2f 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f  ./* Clear all co
135f0 6e 74 65 6e 74 20 66 72 6f 6d 20 70 72 61 67 6d  ntent from pragm
13600 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
13610 63 75 72 73 6f 72 2e 20 2a 2f 0a 73 74 61 74 69  cursor. */.stati
13620 63 20 76 6f 69 64 20 70 72 61 67 6d 61 56 74 61  c void pragmaVta
13630 62 43 75 72 73 6f 72 43 6c 65 61 72 28 50 72 61  bCursorClear(Pra
13640 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
13650 43 73 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Csr){.  int i;. 
13660 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
13670 65 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29  e(pCsr->pPragma)
13680 3b 0a 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d  ;.  pCsr->pPragm
13690 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  a = 0;.  for(i=0
136a0 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 43  ; i<ArraySize(pC
136b0 73 72 2d 3e 61 7a 41 72 67 29 3b 20 69 2b 2b 29  sr->azArg); i++)
136c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
136d0 65 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69  ee(pCsr->azArg[i
136e0 5d 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a  ]);.    pCsr->az
136f0 41 72 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a  Arg[i] = 0;.  }.
13700 7d 0a 0a 2f 2a 20 43 6c 6f 73 65 20 61 20 70 72  }../* Close a pr
13710 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
13720 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 73 74 61  le cursor */.sta
13730 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
13740 61 62 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  abClose(sqlite3_
13750 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
13760 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
13770 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
13780 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
13790 29 63 75 72 3b 0a 20 20 70 72 61 67 6d 61 56 74  )cur;.  pragmaVt
137a0 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28 70 43  abCursorClear(pC
137b0 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  sr);.  sqlite3_f
137c0 72 65 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74  ree(pCsr);.  ret
137d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
137e0 0a 0a 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65  ../* Advance the
137f0 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   pragma virtual 
13800 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20  table cursor to 
13810 74 68 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  the next row */.
13820 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
13830 61 56 74 61 62 4e 65 78 74 28 73 71 6c 69 74 65  aVtabNext(sqlite
13840 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
13850 56 74 61 62 43 75 72 73 6f 72 29 7b 0a 20 20 50  VtabCursor){.  P
13860 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20  ragmaVtabCursor 
13870 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56  *pCsr = (PragmaV
13880 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62  tabCursor*)pVtab
13890 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63  Cursor;.  int rc
138a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
138b0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
138c0 65 20 78 52 6f 77 69 64 20 76 61 6c 75 65 20 2a  e xRowid value *
138d0 2f 0a 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64  /.  pCsr->iRowid
138e0 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ++;.  assert( pC
138f0 73 72 2d 3e 70 50 72 61 67 6d 61 20 29 3b 0a 20  sr->pPragma );. 
13900 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 21   if( SQLITE_ROW!
13910 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43  =sqlite3_step(pC
13920 73 72 2d 3e 70 50 72 61 67 6d 61 29 20 29 7b 0a  sr->pPragma) ){.
13930 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13940 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e  _finalize(pCsr->
13950 70 50 72 61 67 6d 61 29 3b 0a 20 20 20 20 70 43  pPragma);.    pC
13960 73 72 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b  sr->pPragma = 0;
13970 0a 20 20 20 20 70 72 61 67 6d 61 56 74 61 62 43  .    pragmaVtabC
13980 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29  ursorClear(pCsr)
13990 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
139a0 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61  c;.}../* .** Pra
139b0 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
139c0 65 20 6d 6f 64 75 6c 65 20 78 46 69 6c 74 65 72  e module xFilter
139d0 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
139e0 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
139f0 62 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74  bFilter(.  sqlit
13a00 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
13a10 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20  pVtabCursor, .  
13a20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73  int idxNum, cons
13a30 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a  t char *idxStr,.
13a40 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69    int argc, sqli
13a50 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
13a60 0a 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  .){.  PragmaVtab
13a70 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
13a80 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13a90 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
13aa0 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61   PragmaVtab *pTa
13ab0 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a  b = (PragmaVtab*
13ac0 29 28 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70  )(pVtabCursor->p
13ad0 56 74 61 62 29 3b 0a 20 20 69 6e 74 20 72 63 3b  Vtab);.  int rc;
13ae0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 53  .  int i, j;.  S
13af0 74 72 41 63 63 75 6d 20 61 63 63 3b 0a 20 20 63  trAccum acc;.  c
13b00 68 61 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20 55 4e  har *zSql;..  UN
13b10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
13b20 64 78 4e 75 6d 29 3b 0a 20 20 55 4e 55 53 45 44  dxNum);.  UNUSED
13b30 5f 50 41 52 41 4d 45 54 45 52 28 69 64 78 53 74  _PARAMETER(idxSt
13b40 72 29 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62  r);.  pragmaVtab
13b50 43 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72  CursorClear(pCsr
13b60 29 3b 0a 20 20 6a 20 3d 20 28 70 54 61 62 2d 3e  );.  j = (pTab->
13b70 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20  pName->mPragFlg 
13b80 26 20 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74  & PragFlg_Result
13b90 31 29 21 3d 30 20 3f 20 30 20 3a 20 31 3b 0a 20  1)!=0 ? 0 : 1;. 
13ba0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
13bb0 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
13bc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
13bd0 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  xt = (const char
13be0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
13bf0 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20  text(argv[i]);. 
13c00 20 20 20 61 73 73 65 72 74 28 20 6a 3c 41 72 72     assert( j<Arr
13c10 61 79 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41  aySize(pCsr->azA
13c20 72 67 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  rg) );.    asser
13c30 74 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a  t( pCsr->azArg[j
13c40 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ]==0 );.    if( 
13c50 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  zText ){.      p
13c60 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 20 3d 20  Csr->azArg[j] = 
13c70 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
13c80 22 25 73 22 2c 20 7a 54 65 78 74 29 3b 0a 20 20  "%s", zText);.  
13c90 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a      if( pCsr->az
13ca0 41 72 67 5b 6a 5d 3d 3d 30 20 29 7b 0a 20 20 20  Arg[j]==0 ){.   
13cb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13cc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
13cd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
13ce0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
13cf0 74 28 26 61 63 63 2c 20 30 2c 20 30 2c 20 30 2c  t(&acc, 0, 0, 0,
13d00 20 70 54 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d 69   pTab->db->aLimi
13d10 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53  t[SQLITE_LIMIT_S
13d20 51 4c 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 73  QL_LENGTH]);.  s
13d30 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
13d40 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 50  pendAll(&acc, "P
13d50 52 41 47 4d 41 20 22 29 3b 0a 20 20 69 66 28 20  RAGMA ");.  if( 
13d60 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 20 29  pCsr->azArg[1] )
13d70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  {.    sqlite3XPr
13d80 69 6e 74 66 28 26 61 63 63 2c 20 22 25 51 2e 22  intf(&acc, "%Q."
13d90 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d  , pCsr->azArg[1]
13da0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
13db0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
13dc0 6c 28 26 61 63 63 2c 20 70 54 61 62 2d 3e 70 4e  l(&acc, pTab->pN
13dd0 61 6d 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  ame->zName);.  i
13de0 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30  f( pCsr->azArg[0
13df0 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
13e00 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22 3d  XPrintf(&acc, "=
13e10 25 51 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67  %Q", pCsr->azArg
13e20 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c  [0]);.  }.  zSql
13e30 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   = sqlite3StrAcc
13e40 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a  umFinish(&acc);.
13e50 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
13e60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
13e70 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  MEM;.  rc = sqli
13e80 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
13e90 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  Tab->db, zSql, -
13ea0 31 2c 20 26 70 43 73 72 2d 3e 70 50 72 61 67 6d  1, &pCsr->pPragm
13eb0 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  a, 0);.  sqlite3
13ec0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69  _free(zSql);.  i
13ed0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13ee0 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 62 61   ){.    pTab->ba
13ef0 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  se.zErrMsg = sql
13f00 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
13f10 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
13f20 67 28 70 54 61 62 2d 3e 64 62 29 29 3b 0a 20 20  g(pTab->db));.  
13f30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
13f40 0a 20 20 72 65 74 75 72 6e 20 70 72 61 67 6d 61  .  return pragma
13f50 56 74 61 62 4e 65 78 74 28 70 56 74 61 62 43 75  VtabNext(pVtabCu
13f60 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rsor);.}../*.** 
13f70 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  Pragma virtual t
13f80 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 45 6f 66  able module xEof
13f90 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
13fa0 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
13fb0 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61  bEof(sqlite3_vta
13fc0 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
13fd0 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61  ursor){.  Pragma
13fe0 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
13ff0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
14000 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
14010 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 43 73  r;.  return (pCs
14020 72 2d 3e 70 50 72 61 67 6d 61 3d 3d 30 29 3b 0a  r->pPragma==0);.
14030 7d 0a 0a 2f 2a 20 54 68 65 20 78 43 6f 6c 75 6d  }../* The xColum
14040 6e 20 6d 65 74 68 6f 64 20 73 69 6d 70 6c 79 20  n method simply 
14050 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 72 72  returns the corr
14060 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
14070 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 50 52 41   from.** the PRA
14080 47 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  GMA.  .*/.static
14090 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43   int pragmaVtabC
140a0 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33  olumn(.  sqlite3
140b0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
140c0 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 73 71  tabCursor, .  sq
140d0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
140e0 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b 0a  tx, .  int i.){.
140f0 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
14100 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67  or *pCsr = (Prag
14110 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56  maVtabCursor*)pV
14120 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72 61  tabCursor;.  Pra
14130 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20  gmaVtab *pTab = 
14140 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70 56  (PragmaVtab*)(pV
14150 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
14160 29 3b 0a 20 20 69 66 28 20 69 3c 70 54 61 62 2d  );.  if( i<pTab-
14170 3e 69 48 69 64 64 65 6e 20 29 7b 0a 20 20 20 20  >iHidden ){.    
14180 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
14190 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65  alue(ctx, sqlite
141a0 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
141b0 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 69 29  Csr->pPragma, i)
141c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
141d0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
141e0 65 78 74 28 63 74 78 2c 20 70 43 73 72 2d 3e 61  ext(ctx, pCsr->a
141f0 7a 41 72 67 5b 69 2d 70 54 61 62 2d 3e 69 48 69  zArg[i-pTab->iHi
14200 64 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54 45 5f  dden],-1,SQLITE_
14210 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
14220 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14230 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72  OK;.}../* .** Pr
14240 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
14250 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69 64  le module xRowid
14260 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
14270 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
14280 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76  bRowid(sqlite3_v
14290 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
142a0 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f  bCursor, sqlite_
142b0 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 50 72 61  int64 *p){.  Pra
142c0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
142d0 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
142e0 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
142f0 72 73 6f 72 3b 0a 20 20 2a 70 20 3d 20 70 43 73  rsor;.  *p = pCs
14300 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74  r->iRowid;.  ret
14310 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14320 0a 0a 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20  ../* The pragma 
14330 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  virtual table ob
14340 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 63  ject */.static c
14350 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
14360 75 6c 65 20 70 72 61 67 6d 61 56 74 61 62 4d 6f  ule pragmaVtabMo
14370 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20  dule = {.  0,   
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14390 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
143a0 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ion */.  0,     
143b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143c0 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65        /* xCreate
143d0 20 2d 20 63 72 65 61 74 65 20 61 20 74 61 62 6c   - create a tabl
143e0 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61  e */.  pragmaVta
143f0 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  bConnect,       
14400 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20      /* xConnect 
14410 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e 20  - connect to an 
14420 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 2a  existing table *
14430 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 42 65  /.  pragmaVtabBe
14440 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20  stIndex,        
14450 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d   /* xBestIndex -
14460 20 44 65 74 65 72 6d 69 6e 65 20 73 65 61 72 63   Determine searc
14470 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20  h strategy */.  
14480 70 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f 6e  pragmaVtabDiscon
14490 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  nect,        /* 
144a0 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44 69  xDisconnect - Di
144b0 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61 20  sconnect from a 
144c0 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20  table */.  0,   
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144e0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74          /* xDest
144f0 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74 61 62  roy - Drop a tab
14500 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  le */.  pragmaVt
14510 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  abOpen,         
14520 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
14530 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
14540 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6c 6f  .  pragmaVtabClo
14550 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
14560 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73  /* xClose - clos
14570 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
14580 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72  pragmaVtabFilter
14590 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
145a0 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67  xFilter - config
145b0 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61  ure scan constra
145c0 69 6e 74 73 20 2a 2f 0a 20 20 70 72 61 67 6d 61  ints */.  pragma
145d0 56 74 61 62 4e 65 78 74 2c 20 20 20 20 20 20 20  VtabNext,       
145e0 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20         /* xNext 
145f0 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73  - advance a curs
14600 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  or */.  pragmaVt
14610 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20  abEof,          
14620 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a       /* xEof */.
14630 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c 75    pragmaVtabColu
14640 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
14650 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64  * xColumn - read
14660 20 64 61 74 61 20 2a 2f 0a 20 20 70 72 61 67 6d   data */.  pragm
14670 61 56 74 61 62 52 6f 77 69 64 2c 20 20 20 20 20  aVtabRowid,     
14680 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69          /* xRowi
14690 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  d - read data */
146a0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146c0 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77 72 69  /* xUpdate - wri
146d0 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20  te data */.  0, 
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65            /* xBe
14700 67 69 6e 20 2d 20 62 65 67 69 6e 20 74 72 61 6e  gin - begin tran
14710 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
14740 6e 63 20 2d 20 73 79 6e 63 20 74 72 61 6e 73 61  nc - sync transa
14750 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
14760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14770 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d          /* xComm
14780 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61 6e  it - commit tran
14790 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
147c0 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61 63  llback - rollbac
147d0 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  k transaction */
147e0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14800 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e  /* xFindFunction
14810 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72   - function over
14820 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 30 2c 20  loading */.  0, 
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
14850 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74 68  name - rename th
14860 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20  e table */.  0, 
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61            /* xSa
14890 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20  vepoint */.  0, 
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
148c0 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20 20 20 20  lease */.  0    
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
148f0 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  backTo */.};../*
14900 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
14910 20 69 66 20 7a 54 61 62 4e 61 6d 65 20 69 73 20   if zTabName is 
14920 72 65 61 6c 6c 79 20 74 68 65 20 6e 61 6d 65 20  really the name 
14930 6f 66 20 61 20 70 72 61 67 6d 61 2e 20 20 49 66  of a pragma.  If
14940 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 65 6e 20   it is,.** then 
14950 72 65 67 69 73 74 65 72 20 61 6e 20 65 70 6f 6e  register an epon
14960 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
14970 62 6c 65 20 66 6f 72 20 74 68 61 74 20 70 72 61  ble for that pra
14980 67 6d 61 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  gma and return.*
14990 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
149a0 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a 65 63 74  he Module object
149b0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 72   for the new vir
149c0 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 4d  tual table..*/.M
149d0 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65 33 50 72  odule *sqlite3Pr
149e0 61 67 6d 61 56 74 61 62 52 65 67 69 73 74 65 72  agmaVtabRegister
149f0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
14a00 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
14a10 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61  {.  const Pragma
14a20 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a 20 20 61  Name *pName;.  a
14a30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 73  ssert( sqlite3_s
14a40 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22  trnicmp(zName, "
14a50 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20  pragma_", 7)==0 
14a60 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 70 72 61  );.  pName = pra
14a70 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61 6d 65 2b  gmaLocate(zName+
14a80 37 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d  7);.  if( pName=
14a90 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
14aa0 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e 6d 50 72   if( (pName->mPr
14ab0 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c 67  agFlg & (PragFlg
14ac0 5f 52 65 73 75 6c 74 30 7c 50 72 61 67 46 6c 67  _Result0|PragFlg
14ad0 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30 20 29 20  _Result1))==0 ) 
14ae0 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
14af0 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46  rt( sqlite3HashF
14b00 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ind(&db->aModule
14b10 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a 20  , zName)==0 );. 
14b20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
14b30 74 61 62 43 72 65 61 74 65 4d 6f 64 75 6c 65 28  tabCreateModule(
14b40 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 72 61 67  db, zName, &prag
14b50 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c 20 28 76  maVtabModule, (v
14b60 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30 29 3b 0a  oid*)pName, 0);.
14b70 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
14b80 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
14b90 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66  TABLE */..#endif
14ba0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
14bb0 50 52 41 47 4d 41 20 2a 2f 0a                    PRAGMA */.