/ Hex Artifact Content
Login

Artifact 220474f113cade6a6b5bacd3e3a65eca339acbee804128bc5db13a9cad55fba5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 74  esult row with t
2400: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 68 65 6c  he result.** hel
2410: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 65  d in register re
2420: 67 52 65 73 75 6c 74 2e 20 20 44 65 63 72 65 6d  gResult.  Decrem
2430: 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74 20 63  ent the result c
2440: 6f 75 6e 74 20 61 6e 64 20 68 61 6c 74 20 69 66  ount and halt if
2450: 0a 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  .** the maximum 
2460: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
2470: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
2480: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
2490: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
24a0: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24b0: 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 52 65  be *v, int regRe
24c0: 73 75 6c 74 29 7b 0a 20 20 69 6e 74 20 61 64 64  sult){.  int add
24d0: 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  r;.  sqlite3Vdbe
24e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
24f0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
2500: 74 2c 20 31 29 3b 0a 20 20 61 64 64 72 20 3d 20  t, 1);.  addr = 
2510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2520: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  3(v, OP_IfPos, 1
2530: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
2540: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 31  rentAddr(v)+2, 1
2550: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
2560: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
2570: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2580: 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 72  Halt, 0, 0);.  r
2590: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
25a0: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70  *.** Process a p
25b0: 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  ragma statement.
25c0: 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73    .**.** Pragmas
25d0: 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72   are of this for
25e0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52  m:.**.**      PR
25f0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 64  AGMA [schema.]id
2600: 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a   [= value].**.**
2610: 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   The identifier 
2620: 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
2630: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c  string.  The val
2640: 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  ue is a string, 
2650: 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  and.** identifie
2660: 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20  r, or a number. 
2670: 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73   If minusFlag is
2680: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
2690: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75  value is.** a nu
26a0: 6d 62 65 72 20 74 68 61 74 20 77 61 73 20 70 72  mber that was pr
26b0: 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75  eceded by a minu
26c0: 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  s sign..**.** If
26d0: 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 20 69   the left side i
26e0: 73 20 22 64 61 74 61 62 61 73 65 2e 69 64 22 20  s "database.id" 
26f0: 74 68 65 6e 20 70 49 64 31 20 69 73 20 74 68 65  then pId1 is the
2700: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
2710: 2a 20 61 6e 64 20 70 49 64 32 20 69 73 20 74 68  * and pId2 is th
2720: 65 20 69 64 2e 20 20 49 66 20 74 68 65 20 6c 65  e id.  If the le
2730: 66 74 20 73 69 64 65 20 69 73 20 6a 75 73 74 20  ft side is just 
2740: 22 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69  "id" then pId1 i
2750: 73 20 74 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20  s the.** id and 
2760: 70 49 64 32 20 69 73 20 61 6e 79 20 65 6d 70 74  pId2 is any empt
2770: 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  y string..*/.voi
2780: 64 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28  d sqlite3Pragma(
2790: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27a0: 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31  , .  Token *pId1
27b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ,        /* Firs
27c0: 74 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  t part of [schem
27d0: 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20  a.]id field */. 
27e0: 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c 20 20 20   Token *pId2,   
27f0: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
2800: 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d  art of [schema.]
2810: 69 64 20 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c  id field, or NUL
2820: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56  L */.  Token *pV
2830: 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f  alue,      /* To
2840: 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c  ken for <value>,
2850: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
2860: 74 20 6d 69 6e 75 73 46 6c 61 67 20 20 20 20 20  t minusFlag     
2870: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 27    /* True if a '
2880: 2d 27 20 73 69 67 6e 20 70 72 65 63 65 64 65 64  -' sign preceded
2890: 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20   <value> */.){. 
28a0: 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30   char *zLeft = 0
28b0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  ;       /* Nul-t
28c0: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
28d0: 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20  string <id> */. 
28e0: 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20   char *zRight = 
28f0: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  0;      /* Nul-t
2900: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
2910: 73 74 72 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20  string <value>, 
2920: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
2930: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
2940: 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
2950: 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f  ase name */.  To
2960: 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20 20 20 20  ken *pId;       
2970: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2980: 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f  to <id> token */
2990: 0a 20 20 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b  .  char *aFcntl[
29a0: 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 67  4];       /* Arg
29b0: 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f  ument to SQLITE_
29c0: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a  FCNTL_PRAGMA */.
29d0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
29e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
29f0: 62 61 73 65 20 69 6e 64 65 78 20 66 6f 72 20 3c  base index for <
2a00: 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a 20 20 69  database> */.  i
2a10: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
2a30: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 6d  eturn value form
2a40: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
2a50: 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c 69 74 65  AGMA */.  sqlite
2a60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2a70: 64 62 3b 20 20 20 20 2f 2a 20 54 68 65 20 64 61  db;    /* The da
2a80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a90: 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20  n */.  Db *pDb; 
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
2ac0: 66 69 63 20 64 61 74 61 62 61 73 65 20 62 65 69  fic database bei
2ad0: 6e 67 20 70 72 61 67 6d 61 65 64 20 2a 2f 0a 20  ng pragmaed */. 
2ae0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
2af0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2b00: 29 3b 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20  );  /* Prepared 
2b10: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
2b20: 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
2b30: 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f 2a 20 54  *pPragma;   /* T
2b40: 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 0a 20 20  he pragma */..  
2b50: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
2b60: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
2b70: 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76 29 3b 0a  RunOnlyOnce(v);.
2b80: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
2b90: 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 70   2;..  /* Interp
2ba0: 72 65 74 20 74 68 65 20 5b 73 63 68 65 6d 61 2e  ret the [schema.
2bb0: 5d 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72  ] part of the pr
2bc0: 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20  agma statement. 
2bd0: 69 44 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20  iDb is the.  ** 
2be0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
2bf0: 61 62 61 73 65 20 74 68 69 73 20 70 72 61 67 6d  abase this pragm
2c00: 61 20 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69  a is being appli
2c10: 65 64 20 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b  ed to in db.aDb[
2c20: 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  ]. */.  iDb = sq
2c30: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
2c40: 28 70 50 61 72 73 65 2c 20 70 49 64 31 2c 20 70  (pParse, pId1, p
2c50: 49 64 32 2c 20 26 70 49 64 29 3b 0a 20 20 69 66  Id2, &pId);.  if
2c60: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
2c70: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
2c80: 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 49  Db[iDb];..  /* I
2c90: 66 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  f the temp datab
2ca0: 61 73 65 20 68 61 73 20 62 65 65 6e 20 65 78 70  ase has been exp
2cb0: 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64 20 61 73  licitly named as
2cc0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 0a 20 20   part of the .  
2cd0: 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61 6b 65 20  ** pragma, make 
2ce0: 73 75 72 65 20 69 74 20 69 73 20 6f 70 65 6e 2e  sure it is open.
2cf0: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62   .  */.  if( iDb
2d00: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 4f 70  ==1 && sqlite3Op
2d10: 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
2d20: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
2d30: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 4c 65  turn;.  }..  zLe
2d40: 66 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ft = sqlite3Name
2d50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 49  FromToken(db, pI
2d60: 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c 65 66 74  d);.  if( !zLeft
2d70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2d80: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
2d90: 20 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74    zRight = sqlit
2da0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d  e3MPrintf(db, "-
2db0: 25 54 22 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  %T", pValue);.  
2dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68  }else{.    zRigh
2dd0: 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  t = sqlite3NameF
2de0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 56 61  romToken(db, pVa
2df0: 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  lue);.  }..  ass
2e00: 65 72 74 28 20 70 49 64 32 20 29 3b 0a 20 20 7a  ert( pId2 );.  z
2e10: 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e 30 20 3f  Db = pId2->n>0 ?
2e20: 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a   pDb->zDbSName :
2e30: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
2e40: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
2e50: 65 2c 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e, SQLITE_PRAGMA
2e60: 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 2c  , zLeft, zRight,
2e70: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 67 6f 74   zDb) ){.    got
2e80: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
2e90: 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20 61 6e 20  }..  /* Send an 
2ea0: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
2eb0: 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GMA file-control
2ec0: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
2ed0: 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e  ng VFS.  ** conn
2ee0: 65 63 74 69 6f 6e 2e 20 20 49 66 20 69 74 20 72  ection.  If it r
2ef0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2f00: 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68  , then assume th
2f10: 61 74 20 74 68 65 20 56 46 53 0a 20 20 2a 2a 20  at the VFS.  ** 
2f20: 68 61 6e 64 6c 65 64 20 74 68 65 20 70 72 61 67  handled the prag
2f30: 6d 61 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ma and generate 
2f40: 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61 72 65 64  a no-op prepared
2f50: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a   statement..  **
2f60: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
2f70: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32 32 33 38  TION-OF: R-12238
2f80: 2d 35 35 31 32 30 20 57 68 65 6e 65 76 65 72 20  -55120 Whenever 
2f90: 61 20 50 52 41 47 4d 41 20 73 74 61 74 65 6d 65  a PRAGMA stateme
2fa0: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 0a 20 20  nt is parsed,.  
2fb0: 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e  ** an SQLITE_FCN
2fc0: 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c 65 20 63  TL_PRAGMA file c
2fd0: 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e 74 20 74  ontrol is sent t
2fe0: 6f 20 74 68 65 20 6f 70 65 6e 20 73 71 6c 69 74  o the open sqlit
2ff0: 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a  e3_file.  ** obj
3000: 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
3010: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
3020: 65 20 66 69 6c 65 20 74 6f 20 77 68 69 63 68 20  e file to which 
3030: 74 68 65 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20  the pragma.  ** 
3040: 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 73  statement refers
3050: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
3060: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
3070: 2d 32 39 38 37 35 2d 33 31 36 37 38 20 54 68 65  -29875-31678 The
3080: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3090: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
30a0: 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c 65 20 63  AGMA.  ** file c
30b0: 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20 61 72 72  ontrol is an arr
30c0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
30d0: 6f 20 73 74 72 69 6e 67 73 20 28 63 68 61 72 2a  o strings (char*
30e0: 2a 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a  *) in which the.
30f0: 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d    ** second elem
3100: 65 6e 74 20 6f 66 20 74 68 65 20 61 72 72 61 79  ent of the array
3110: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
3120: 74 68 65 20 70 72 61 67 6d 61 20 61 6e 64 20 74  the pragma and t
3130: 68 65 20 74 68 69 72 64 0a 20 20 2a 2a 20 65 6c  he third.  ** el
3140: 65 6d 65 6e 74 20 69 73 20 74 68 65 20 61 72 67  ement is the arg
3150: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 61  ument to the pra
3160: 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  gma or NULL if t
3170: 68 65 20 70 72 61 67 6d 61 20 68 61 73 20 6e 6f  he pragma has no
3180: 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  .  ** argument..
3190: 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d    */.  aFcntl[0]
31a0: 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31   = 0;.  aFcntl[1
31b0: 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63  ] = zLeft;.  aFc
31c0: 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b  ntl[2] = zRight;
31d0: 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30  .  aFcntl[3] = 0
31e0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
31f0: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
3200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
3210: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
3220: 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
3230: 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29  _PRAGMA, (void*)
3240: 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72  aFcntl);.  if( r
3250: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3270: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b  etNumCols(v, 1);
3280: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3290: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c  SetColName(v, 0,
32a0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61   COLNAME_NAME, a
32b0: 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c 49 54 45  Fcntl[0], SQLITE
32c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
32d0: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
32e0: 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b  t(v, aFcntl[0]);
32f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
3300: 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20  e(aFcntl[0]);.  
3310: 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75    goto pragma_ou
3320: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  t;.  }.  if( rc!
3330: 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
3340: 20 29 7b 0a 20 20 20 20 69 66 28 20 61 46 63 6e   ){.    if( aFcn
3350: 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  tl[0] ){.      s
3360: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3370: 50 61 72 73 65 2c 20 22 25 73 22 2c 20 61 46 63  Parse, "%s", aFc
3380: 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73  ntl[0]);.      s
3390: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e  qlite3_free(aFcn
33a0: 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  tl[0]);.    }.  
33b0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
33c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
33d0: 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20   = rc;.    goto 
33e0: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a  pragma_out;.  }.
33f0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
3400: 20 70 72 61 67 6d 61 20 69 6e 20 74 68 65 20 6c   pragma in the l
3410: 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a 2f 0a 20  ookup table */. 
3420: 20 70 50 72 61 67 6d 61 20 3d 20 70 72 61 67 6d   pPragma = pragm
3430: 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74 29 3b 0a  aLocate(zLeft);.
3440: 20 20 69 66 28 20 70 50 72 61 67 6d 61 3d 3d 30    if( pPragma==0
3450: 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f   ) goto pragma_o
3460: 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ut;..  /* Make s
3470: 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
3480: 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65   schema is loade
3490: 64 20 69 66 20 74 68 65 20 70 72 61 67 6d 61 20  d if the pragma 
34a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 2a 2f  requires that */
34b0: 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d  .  if( (pPragma-
34c0: 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
34d0: 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d 61 29 21  Flg_NeedSchema)!
34e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
34f0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
3500: 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70  pParse) ) goto p
3510: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  ragma_out;.  }..
3520: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
3530: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
3540: 6e 61 6d 65 73 20 66 6f 72 20 70 72 61 67 6d 61  names for pragma
3550: 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 72 65  s that return re
3560: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66 28 20 28  sults */.  if( (
3570: 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
3580: 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f  g & PragFlg_NoCo
3590: 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20 20 26 26  lumns)==0 .   &&
35a0: 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61   ((pPragma->mPra
35b0: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
35c0: 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c  oColumns1)==0 ||
35d0: 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20 20 29 7b   zRight==0).  ){
35e0: 0a 20 20 20 20 73 65 74 50 72 61 67 6d 61 52 65  .    setPragmaRe
35f0: 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  sultColumnNames(
3600: 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d  v, pPragma);.  }
3610: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
3620: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
3630: 72 61 67 6d 61 20 68 61 6e 64 6c 65 72 20 2a 2f  ragma handler */
3640: 0a 20 20 73 77 69 74 63 68 28 20 70 50 72 61 67  .  switch( pPrag
3650: 6d 61 2d 3e 65 50 72 61 67 54 79 70 20 29 7b 0a  ma->ePragTyp ){.
3660: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
3670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
3680: 52 5f 50 52 41 47 4d 41 53 29 20 26 26 20 21 64  R_PRAGMAS) && !d
3690: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
36a0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20  IT_DEPRECATED). 
36b0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
36c0: 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c   [schema.]defaul
36d0: 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a  t_cache_size.  *
36e0: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
36f0: 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65  a.]default_cache
3700: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
3710: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
3720: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
3730: 72 65 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20  rent persistent 
3740: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
3750: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
3760: 73 69 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65  size.  The value
3770: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
3780: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
3790: 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e  of.  ** pages in
37a0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
37b0: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
37c0: 6d 20 73 65 74 73 20 62 6f 74 68 20 74 68 65 20  m sets both the 
37d0: 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67  current.  ** pag
37e0: 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
37f0: 75 65 20 61 6e 64 20 74 68 65 20 70 65 72 73 69  ue and the persi
3800: 73 74 65 6e 74 20 70 61 67 65 20 63 61 63 68 65  stent page cache
3810: 20 73 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a   size value.  **
3820: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
3830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
3840: 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65  **.  ** Older ve
3850: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
3860: 20 77 6f 75 6c 64 20 73 65 74 20 74 68 65 20 64   would set the d
3870: 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a  efault cache siz
3880: 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61  e to a.  ** nega
3890: 74 69 76 65 20 6e 75 6d 62 65 72 20 74 6f 20 69  tive number to i
38a0: 6e 64 69 63 61 74 65 20 73 79 6e 63 68 72 6f 6e  ndicate synchron
38b0: 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65 73 65 20  ous=OFF.  These 
38c0: 64 61 79 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75  days, synchronou
38d0: 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  s.  ** is always
38e0: 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 72   on by default r
38f0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
3900: 20 73 69 67 6e 20 6f 66 20 74 68 65 20 64 65 66   sign of the def
3910: 61 75 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20  ault cache.  ** 
3920: 73 69 7a 65 2e 20 20 42 75 74 20 63 6f 6e 74 69  size.  But conti
3930: 6e 75 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  nue to take the 
3940: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
3950: 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61  f the default ca
3960: 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  che.  ** size of
3970: 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
3980: 61 74 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a  atibility..  */.
3990: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44    case PragTyp_D
39a0: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
39b0: 45 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  E: {.    static 
39c0: 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20  const int iLn = 
39d0: 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45  VDBE_OFFSET_LINE
39e0: 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69  NO(2);.    stati
39f0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
3a00: 73 74 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  st getCacheSize[
3a10: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
3a20: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c  _Transaction, 0,
3a30: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20         /* 0 */. 
3a60: 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f       { OP_ReadCo
3a70: 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20 20 20 20  okie,  0, 1,    
3a80: 20 20 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c      BTREE_DEFAUL
3a90: 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20  T_CACHE_SIZE},  
3aa0: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
3ab0: 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20  OP_IfPos,       
3ac0: 31 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 8,        0},
3ad0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
3ae0: 67 65 72 2c 20 20 20 20 20 30 2c 20 32 2c 20 20  ger,     0, 2,  
3af0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3b00: 7b 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 20  { OP_Subtract,  
3b10: 20 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20 31    1, 2,        1
3b20: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66  },.      { OP_If
3b30: 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c  Pos,       1, 8,
3b40: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
3b50: 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
3b60: 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20      0, 1,       
3b70: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20   0},            
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b90: 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  6 */.      { OP_
3ba0: 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 30 2c 20  Noop,        0, 
3bb0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
3bc0: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
3bd0: 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  ow,   1, 1,     
3be0: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
3bf0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
3c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
3c10: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
3c20: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
3c30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
3c40: 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20  ->nMem += 2;.   
3c50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
3c60: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
3c70: 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a  ired(v, ArraySiz
3c80: 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 29  e(getCacheSize))
3c90: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
3ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
3cb0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
3cc0: 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67  getCacheSize), g
3cd0: 65 74 43 61 63 68 65 53 69 7a 65 2c 20 69 4c 6e  etCacheSize, iLn
3ce0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c  );.      if( ONL
3cf0: 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  Y_IF_REALLOC_STR
3d00: 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72  ESS(aOp==0) ) br
3d10: 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30  eak;.      aOp[0
3d20: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
3d30: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
3d40: 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 36 5d 2e  b;.      aOp[6].
3d50: 70 31 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  p1 = SQLITE_DEFA
3d60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a  ULT_CACHE_SIZE;.
3d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3d80: 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69   int size = sqli
3d90: 74 65 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69  te3AbsInt32(sqli
3da0: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29  te3Atoi(zRight))
3db0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3dc0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
3dd0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
3de0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
3df0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3e00: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
3e10: 2c 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f  , BTREE_DEFAULT_
3e20: 43 41 43 48 45 5f 53 49 5a 45 2c 20 73 69 7a 65  CACHE_SIZE, size
3e30: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3e40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3e50: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3e60: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 44 62   0) );.      pDb
3e70: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
3e80: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
3e90: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
3ea0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62  SetCacheSize(pDb
3eb0: 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68  ->pBt, pDb->pSch
3ec0: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29  ema->cache_size)
3ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
3ee0: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
3ef0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41   !SQLITE_OMIT_PA
3f00: 47 45 52 5f 50 52 41 47 4d 41 53 20 26 26 20 21  GER_PRAGMAS && !
3f10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
3f20: 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69 66 20 21  ECATED */..#if !
3f30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3f40: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
3f50: 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  S).  /*.  **  PR
3f60: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f70: 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  ge_size.  **  PR
3f80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f90: 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  ge_size=N.  **. 
3fa0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
3fb0: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
3fc0: 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66  urrent setting f
3fd0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  or the.  ** data
3fe0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 69  base page size i
3ff0: 6e 20 62 79 74 65 73 2e 20 20 54 68 65 20 73 65  n bytes.  The se
4000: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
4010: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
4020: 20 70 61 67 65 20 73 69 7a 65 20 76 61 6c 75 65   page size value
4030: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 63 61 6e  .  The value can
4040: 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 0a   only be set if.
4050: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
4060: 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
4070: 65 6e 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  en created..  */
4080: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4090: 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  PAGE_SIZE: {.   
40a0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
40b0: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  b->pBt;.    asse
40c0: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
40d0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
40e0: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
40f0: 3d 20 41 4c 57 41 59 53 28 70 42 74 29 20 3f 20  = ALWAYS(pBt) ? 
4100: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
4110: 61 67 65 53 69 7a 65 28 70 42 74 29 20 3a 20 30  ageSize(pBt) : 0
4120: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
4130: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69 7a 65 29  ngleInt(v, size)
4140: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4150: 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79     /* Malloc may
4160: 20 66 61 69 6c 20 77 68 65 6e 20 73 65 74 74 69   fail when setti
4170: 6e 67 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  ng the page-size
4180: 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 61 6e  , as there is an
4190: 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20   internal.      
41a0: 2a 2a 20 62 75 66 66 65 72 20 74 68 61 74 20 74  ** buffer that t
41b0: 68 65 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20  he pager module 
41c0: 72 65 73 69 7a 65 73 20 75 73 69 6e 67 20 73 71  resizes using sq
41d0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e  lite3_realloc().
41e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
41f0: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4200: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
4210: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66  Right);.      if
4220: 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
4230: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
4240: 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
4250: 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 2d 31  >nextPagesize,-1
4260: 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ,0) ){.        s
4270: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
4280: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
4290: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
42a0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
42b0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63  GMA [schema.]sec
42c0: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
42d0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
42e0: 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f  ]secure_delete=O
42f0: 4e 2f 4f 46 46 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N/OFF.  **.  ** 
4300: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
4310: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
4320: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
4330: 68 65 0a 20 20 2a 2a 20 73 65 63 75 72 65 5f 64  he.  ** secure_d
4340: 65 6c 65 74 65 20 66 6c 61 67 2e 20 20 54 68 65  elete flag.  The
4350: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 68 61   second form cha
4360: 6e 67 65 73 20 74 68 65 20 73 65 63 75 72 65 5f  nges the secure_
4370: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 66 6c 61 67  delete.  ** flag
4380: 20 73 65 74 74 69 6e 67 20 61 6e 64 20 72 65 70   setting and rep
4390: 6f 72 74 73 20 74 68 65 6e 65 77 20 76 61 6c 75  orts thenew valu
43a0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  e..  */.  case P
43b0: 72 61 67 54 79 70 5f 53 45 43 55 52 45 5f 44 45  ragTyp_SECURE_DE
43c0: 4c 45 54 45 3a 20 7b 0a 20 20 20 20 42 74 72 65  LETE: {.    Btre
43d0: 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42  e *pBt = pDb->pB
43e0: 74 3b 0a 20 20 20 20 69 6e 74 20 62 20 3d 20 2d  t;.    int b = -
43f0: 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
4400: 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  Bt!=0 );.    if(
4410: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
4420: 20 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 42   b = sqlite3GetB
4430: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
4440: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4450: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62   pId2->n==0 && b
4460: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
4470: 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
4480: 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
4490: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
44a0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
44b0: 72 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62  reDelete(db->aDb
44c0: 5b 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20  [ii].pBt, b);.  
44d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
44e0: 62 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  b = sqlite3Btree
44f0: 53 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74  SecureDelete(pBt
4500: 2c 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , b);.    return
4510: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b  SingleInt(v, b);
4520: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4530: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4540: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f  MA [schema.]max_
4550: 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20  page_count.  ** 
4560: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4570: 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d  ]max_page_count=
4580: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
4590: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
45a0: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
45b0: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
45c0: 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62   ** maximum numb
45d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
45e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
45f0: 2e 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63  .  The .  ** sec
4600: 6f 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74  ond form attempt
4610: 73 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73  s to change this
4620: 20 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a   setting.  Both.
4630: 20 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72    ** forms retur
4640: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  n the current se
4650: 74 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tting..  **.  **
4660: 20 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   The absolute va
4670: 6c 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64  lue of N is used
4680: 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
4690: 75 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68  umented and migh
46a0: 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20  t.  ** change.  
46b0: 54 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65  The only purpose
46c0: 20 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61   is to provide a
46d0: 6e 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65  n easy way to te
46e0: 73 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  st.  ** the sqli
46f0: 74 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75  te3AbsInt32() fu
4700: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  nction..  **.  *
4710: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4720: 61 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20  a.]page_count.  
4730: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
4740: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
4750: 65 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  es in the specif
4760: 69 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ied database..  
4770: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
4780: 70 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a  p_PAGE_COUNT: {.
4790: 20 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20      int iReg;.  
47a0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
47b0: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
47c0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67  , iDb);.    iReg
47d0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
47e0: 6d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  m;.    if( sqlit
47f0: 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b  e3Tolower(zLeft[
4800: 30 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20  0])=='p' ){.    
4810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4820: 4f 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f  Op2(v, OP_Pageco
4830: 75 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b  unt, iDb, iReg);
4840: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4860: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63  Op3(v, OP_MaxPgc
4870: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a  nt, iDb, iReg, .
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
48a0: 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41  bsInt32(sqlite3A
48b0: 74 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20  toi(zRight)));. 
48c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
48d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
48e0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67  _ResultRow, iReg
48f0: 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 1);.    break;
4900: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4910: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4920: 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20  ]locking_mode.  
4930: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4940: 6d 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ma.]locking_mode
4950: 20 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75   = (normal|exclu
4960: 73 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73  sive).  */.  cas
4970: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e  e PragTyp_LOCKIN
4980: 47 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f  G_MODE: {.    co
4990: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  nst char *zRet =
49a0: 20 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69   "normal";.    i
49b0: 6e 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f  nt eMode = getLo
49c0: 63 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74  ckingMode(zRight
49d0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32  );..    if( pId2
49e0: 2d 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d  ->n==0 && eMode=
49f0: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4a00: 44 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20  DE_QUERY ){.    
4a10: 20 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41    /* Simple "PRA
4a20: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
4a30: 3b 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ;" statement. Th
4a40: 69 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f  is is a query fo
4a50: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
4a60: 75 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c  urrent default l
4a70: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69  ocking mode (whi
4a80: 63 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  ch may be differ
4a90: 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ent to.      ** 
4aa0: 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
4ab0: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
4ac0: 61 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f  abase)..      */
4ad0: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64  .      eMode = d
4ae0: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b  b->dfltLockMode;
4af0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b00: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
4b10: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d  .      if( pId2-
4b20: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >n==0 ){.       
4b30: 20 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   /* This indicat
4b40: 65 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62  es that no datab
4b50: 61 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65  ase name was spe
4b60: 63 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20  cified as part. 
4b70: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
4b80: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e   PRAGMA command.
4b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
4ba0: 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d  e locking-mode m
4bb0: 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
4bc0: 2a 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74  * set on all att
4bd0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c  ached databases,
4be0: 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
4bf0: 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20  main db file..  
4c00: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
4c10: 20 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71   ** Also, the sq
4c20: 6c 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f  lite3.dfltLockMo
4c30: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  de variable is s
4c40: 65 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20  et so that.     
4c50: 20 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71     ** any subseq
4c60: 75 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20  uently attached 
4c70: 64 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75  databases also u
4c80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
4c90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
4ca0: 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20  ing mode..      
4cb0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
4cc0: 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
4cd0: 65 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44  ert(pDb==&db->aD
4ce0: 62 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  b[0]);.        f
4cf0: 6f 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e  or(ii=2; ii<db->
4d00: 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
4d10: 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
4d20: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4d30: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4d40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4d50: 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
4d60: 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f  Mode(pPager, eMo
4d70: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  de);.        }. 
4d80: 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c         db->dfltL
4d90: 6f 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  ockMode = (u8)eM
4da0: 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
4db0: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
4dc0: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
4dd0: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65  b->pBt);.      e
4de0: 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Mode = sqlite3Pa
4df0: 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  gerLockingMode(p
4e00: 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  Pager, eMode);. 
4e10: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
4e20: 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
4e30: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
4e40: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
4e50: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4e60: 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
4e70: 49 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65  IVE );.    if( e
4e80: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4e90: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
4ea0: 45 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20  E ){.      zRet 
4eb0: 3d 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20  = "exclusive";. 
4ec0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
4ed0: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65  ingleText(v, zRe
4ee0: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
4ef0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
4f00: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
4f10: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a  ournal_mode.  **
4f20: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4f30: 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  .]journal_mode =
4f40: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
4f50: 20 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65             (dele
4f60: 74 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74  te|persist|off|t
4f70: 72 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77  runcate|memory|w
4f80: 61 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63  al|off).  */.  c
4f90: 61 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52  ase PragTyp_JOUR
4fa0: 4e 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20  NAL_MODE: {.    
4fb0: 69 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20  int eMode;      
4fc0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
4fd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
4fe0: 45 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f  E_XXX symbols */
4ff0: 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
5000: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5010: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69  ounter */..    i
5020: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( zRight==0 ){.
5030: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
5040: 65 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20  e is no "=MODE" 
5050: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67  part of the prag
5060: 6d 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66  ma, do a query f
5070: 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
5080: 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a  current mode */.
5090: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41        eMode = PA
50a0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
50b0: 51 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65  QUERY;.    }else
50c0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
50d0: 61 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20  ar *zMode;.     
50e0: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
50f0: 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29  Strlen30(zRight)
5100: 3b 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64  ;.      for(eMod
5110: 65 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71  e=0; (zMode = sq
5120: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65  lite3JournalMode
5130: 6e 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b  name(eMode))!=0;
5140: 20 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20   eMode++){.     
5150: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
5160: 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a  rNICmp(zRight, z
5170: 4d 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72  Mode, n)==0 ) br
5180: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5190: 20 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b     if( !zMode ){
51a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
51b0: 68 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20  he "=MODE" part 
51c0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
51d0: 6e 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c  ny known journal
51e0: 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a   mode,.        *
51f0: 2a 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72  * then do a quer
5200: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f  y */.        eMo
5210: 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
5220: 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20  ALMODE_QUERY;.  
5230: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5240: 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  if( eMode==PAGER
5250: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
5260: 52 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30  RY && pId2->n==0
5270: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e   ){.      /* Con
5280: 76 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75  vert "PRAGMA jou
5290: 72 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20  rnal_mode" into 
52a0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
52b0: 72 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20  rnal_mode" */.  
52c0: 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20      iDb = 0;.   
52d0: 20 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a     pId2->n = 1;.
52e0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
52f0: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d  =db->nDb-1; ii>=
5300: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
5310: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  if( db->aDb[ii].
5320: 70 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20  pBt && (ii==iDb 
5330: 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29  || pId2->n==0) )
5340: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5350: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
5360: 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73  , ii);.        s
5370: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5380: 28 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  (v, OP_JournalMo
5390: 64 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65  de, ii, 1, eMode
53a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
53b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
53c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
53d0: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
53e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
53f0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
5400: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5410: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a  l_size_limit.  *
5420: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
5430: 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  a.]journal_size_
5440: 6c 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  limit=N.  **.  *
5450: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
5460: 20 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72   size limit on r
5470: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
5480: 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  files..  */.  ca
5490: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
54a0: 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b  AL_SIZE_LIMIT: {
54b0: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
54c0: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
54d0: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
54e0: 3b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74  ;.    i64 iLimit
54f0: 20 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a   = -2;.    if( z
5500: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
5510: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
5520: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69  I64(zRight, &iLi
5530: 6d 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mit);.      if( 
5540: 69 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d  iLimit<-1 ) iLim
5550: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  it = -1;.    }. 
5560: 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69     iLimit = sqli
5570: 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
5580: 69 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c  izeLimit(pPager,
5590: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65   iLimit);.    re
55a0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
55b0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72   iLimit);.    br
55c0: 65 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  eak;.  }..#endif
55d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
55e0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
55f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
5600: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74  GMA [schema.]aut
5610: 6f 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50  o_vacuum.  **  P
5620: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
5630: 75 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a  uto_vacuum=N.  *
5640: 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65  *.  ** Get or se
5650: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
5660: 68 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74  he database 'aut
5670: 6f 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65  o-vacuum' parame
5680: 74 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  ter..  ** The va
5690: 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20  lue is one of:  
56a0: 30 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20  0 NONE 1 FULL 2 
56b0: 49 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f  INCREMENTAL.  */
56c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
56d0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
56e0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
56f0: 55 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20  UTO_VACUUM: {.  
5700: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
5710: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  Db->pBt;.    ass
5720: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
5730: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
5740: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
5750: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74  ngleInt(v, sqlit
5760: 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
5770: 63 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20  cuum(pBt));.    
5780: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
5790: 20 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f   eAuto = getAuto
57a0: 56 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a  Vacuum(zRight);.
57b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41        assert( eA
57c0: 75 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c  uto>=0 && eAuto<
57d0: 3d 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  =2 );.      db->
57e0: 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75  nextAutovac = (u
57f0: 38 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f  8)eAuto;.      /
5800: 2a 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61  * Call SetAutoVa
5810: 63 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e  cuum() to set in
5820: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74  itialize the int
5830: 65 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20  ernal auto and. 
5840: 20 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63       ** incr-vac
5850: 75 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20  uum flags. This 
5860: 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
5870: 61 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ase this connect
5880: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65  ion.      ** cre
5890: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
58a0: 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d  e file. It is im
58b0: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20  portant that it 
58c0: 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  is created.     
58d0: 20 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76   ** as an auto-v
58e0: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62  acuum capable db
58f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5900: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5910: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
5920: 70 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20  pBt, eAuto);.   
5930: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5940: 45 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d  E_OK && (eAuto==
5950: 31 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29  1 || eAuto==2) )
5960: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  {.        /* Whe
5970: 6e 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75  n setting the au
5980: 74 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to_vacuum mode t
5990: 6f 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20  o either "full" 
59a0: 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  or .        ** "
59b0: 69 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72  incremental", wr
59c0: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ite the value of
59d0: 20 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20   meta[6] in the 
59e0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
59f0: 20 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65   ** file. Before
5a00: 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61   writing to meta
5a10: 5b 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20  [6], check that 
5a20: 6d 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65  meta[3] indicate
5a30: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
5a40: 74 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73  t this really is
5a50: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
5a60: 63 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65  capable database
5a70: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5a80: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
5a90: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
5aa0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
5ab0: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  );.        stati
5ac0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
5ad0: 73 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20  st setMeta6[] = 
5ae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50  {.          { OP
5af0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
5b00: 20 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20   0,         1,  
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b20: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
5b30: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61          { OP_Rea
5b40: 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20  dCookie,     0, 
5b50: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5b60: 20 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54     BTREE_LARGEST
5b70: 5f 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20  _ROOT_PAGE},.   
5b80: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20         { OP_If, 
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20              1,  
5ba0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
5bb0: 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20            0},   
5bc0: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20   /* 2 */.       
5bd0: 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20     { OP_Halt,   
5be0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
5bf0: 4b 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20  K, OE_Abort,    
5c00: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c10: 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  3 */.          {
5c20: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
5c30: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42      0,         B
5c40: 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d  TREE_INCR_VACUUM
5c50: 2c 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f  , 0},    /* 4 */
5c60: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
5c70: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
5c80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64  .        int iAd
5c90: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5ca0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
5cb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5cc0: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
5cd0: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
5ce0: 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29  aySize(setMeta6)
5cf0: 29 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d  );.        aOp =
5d00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d10: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
5d20: 7a 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65  ze(setMeta6), se
5d30: 74 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20  tMeta6, iLn);.  
5d40: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
5d50: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
5d60: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
5d70: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d  ;.        aOp[0]
5d80: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
5d90: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
5da0: 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  Db;.        aOp[
5db0: 32 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b  2].p2 = iAddr+4;
5dc0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e  .        aOp[4].
5dd0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5de0: 20 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41    aOp[4].p3 = eA
5df0: 75 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  uto - 1;.       
5e00: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
5e10: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
5e20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5e30: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
5e40: 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  if..  /*.  **  P
5e50: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69  RAGMA [schema.]i
5e60: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
5e70: 6d 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  m(N).  **.  ** D
5e80: 6f 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63  o N steps of inc
5e90: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69  remental vacuumi
5ea0: 6e 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ng on a database
5eb0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5ec0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5ed0: 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61  ACUUM.  case Pra
5ee0: 67 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c  gTyp_INCREMENTAL
5ef0: 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69  _VACUUM: {.    i
5f00: 6e 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b  nt iLimit, addr;
5f10: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
5f20: 3d 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65  =0 || !sqlite3Ge
5f30: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
5f40: 69 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69  iLimit) || iLimi
5f50: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  t<=0 ){.      iL
5f60: 69 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66  imit = 0x7ffffff
5f70: 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  f;.    }.    sql
5f80: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5f90: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5fa0: 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
5fb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5fc0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c  , OP_Integer, iL
5fd0: 69 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64  imit, 1);.    ad
5fe0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5ff0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63  AddOp1(v, OP_Inc
6000: 72 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56  rVacuum, iDb); V
6010: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6020: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6030: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp1(v, OP_Resu
6040: 6c 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73  ltRow, 1);.    s
6050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6060: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
6070: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
6080: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6090: 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64  OP_IfPos, 1, add
60a0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
60b0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
60c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
60d0: 61 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b  addr);.    break
60e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
60f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6100: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
6110: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6120: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6130: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
6140: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6150: 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20  e_size=N.  **.  
6160: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
6170: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
6180: 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74  rrent local sett
6190: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
61a0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
61b0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  . The second for
61c0: 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c  m sets the local
61d0: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
61e0: 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66   size value.  If
61f0: 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74   N is positive t
6200: 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a  hen that is the.
6210: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
6220: 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
6230: 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61  e.  If N is nega
6240: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  tive, then the. 
6250: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
6260: 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20  ges is adjusted 
6270: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
6280: 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79  e uses -N kibiby
6290: 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f  tes.  ** of memo
62a0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
62b0: 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49  PragTyp_CACHE_SI
62c0: 5a 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE: {.    assert
62d0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
62e0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
62f0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
6300: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6310: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6320: 28 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  (v, pDb->pSchema
6330: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
6340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6350: 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74  int size = sqlit
6360: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
6370: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
6380: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  ma->cache_size =
6390: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
63a0: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
63b0: 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20  eSize(pDb->pBt, 
63c0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
63d0: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
63e0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
63f0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
6400: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6410: 65 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52  e_spill.  **  PR
6420: 41 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c  AGMA cache_spill
6430: 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50  =BOOLEAN.  **  P
6440: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63  RAGMA [schema.]c
6450: 61 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a  ache_spill=N.  *
6460: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
6470: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
6480: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20  e current local 
6490: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
64a0: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
64b0: 73 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20  spill size. The 
64c0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e  second form turn
64d0: 73 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e  s cache spill on
64e0: 0a 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57  .  ** or off.  W
64f0: 68 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63  hen turnning cac
6500: 68 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65  he spill on, the
6510: 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
6520: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
6530: 20 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68   cache_size.  Th
6540: 65 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74  e third form set
6550: 73 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74  s a spill size t
6560: 68 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  hat.  ** may be 
6570: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74  different form t
6580: 68 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  he cache size.. 
6590: 20 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69   ** If N is posi
65a0: 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69  tive then that i
65b0: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
65c0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
65d0: 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69  e cache.  If N i
65e0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
65f0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
6600: 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a   of pages is adj
6610: 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  usted so that th
6620: 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20  e cache uses -N 
6630: 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f  kibibytes.  ** o
6640: 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20  f memory..  **. 
6650: 20 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   ** If the numbe
6660: 72 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c  r of cache_spill
6670: 20 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74   pages is less t
6680: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
6690: 66 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a  f.  ** cache_siz
66a0: 65 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c  e pages, no spil
66b0: 6c 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69  ling occurs unti
66c0: 6c 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  l the page count
66d0: 20 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68   exceeds.  ** th
66e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
66f0: 65 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20  e_size pages..  
6700: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68  **.  ** The cach
6710: 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20  e_spill=BOOLEAN 
6720: 73 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20  setting applies 
6730: 74 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  to all attached 
6740: 73 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f  schemas,.  ** no
6750: 74 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d  t just the schem
6760: 61 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a  a specified..  *
6770: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
6780: 5f 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a  _CACHE_SPILL: {.
6790: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
67a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
67b0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
67c0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
67d0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
67e0: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20  nSingleInt(v,.  
67f0: 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67         (db->flag
6800: 73 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65  s & SQLITE_Cache
6810: 53 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20  Spill)==0 ? 0 : 
6820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6830: 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
6840: 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30  lSize(pDb->pBt,0
6850: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
6860: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
6870: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  1;.      if( sql
6880: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
6890: 67 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20  ght, &size) ){. 
68a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
68b0: 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
68c0: 70 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b  pDb->pBt, size);
68d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
68e0: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
68f0: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a  lean(zRight, siz
6900: 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  e!=0) ){.       
6910: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
6920: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b  LITE_CacheSpill;
6930: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6940: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6950: 26 3d 20 7e 53 51 4c 49 54 45 5f 43 61 63 68 65  &= ~SQLITE_Cache
6960: 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  Spill;.      }. 
6970: 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72       setAllPager
6980: 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d  Flags(db);.    }
6990: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
69a0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
69b0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70  MA [schema.]mmap
69c0: 5f 73 69 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20  _size(N).  **.  
69d0: 2a 2a 20 55 73 65 64 20 74 6f 20 73 65 74 20 6d  ** Used to set m
69e0: 61 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69  apping size limi
69f0: 74 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 73  t. The mapping s
6a00: 69 7a 65 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a  ize limit is.  *
6a10: 2a 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  * used to limit 
6a20: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 73 69  the aggregate si
6a30: 7a 65 20 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79  ze of all memory
6a40: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20   mapped regions 
6a50: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  of the.  ** data
6a60: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
6a70: 69 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  is parameter is 
6a80: 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  set to zero, the
6a90: 6e 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  n memory mapping
6aa0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65  .  ** is not use
6ab0: 64 20 61 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20  d at all.  If N 
6ac0: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
6ad0: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 65  n the default me
6ae0: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69  mory map.  ** li
6af0: 6d 69 74 20 64 65 74 65 72 6d 69 6e 65 64 20 62  mit determined b
6b00: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
6b10: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
6b20: 4d 41 50 5f 53 49 5a 45 29 20 69 73 20 73 65 74  MAP_SIZE) is set
6b30: 2e 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 61 6d  ..  ** The param
6b40: 65 74 65 72 20 4e 20 69 73 20 6d 65 61 73 75 72  eter N is measur
6b50: 65 64 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a  ed in bytes..  *
6b60: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 76 61 6c 75  *.  ** This valu
6b70: 65 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20  e is advisory.  
6b80: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56  The underlying V
6b90: 46 53 20 69 73 20 66 72 65 65 20 74 6f 20 6d 65  FS is free to me
6ba0: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73  mory map.  ** as
6bb0: 20 6c 69 74 74 6c 65 20 6f 72 20 61 73 20 6d 75   little or as mu
6bc0: 63 68 20 61 73 20 69 74 20 77 61 6e 74 73 2e 20  ch as it wants. 
6bd0: 20 45 78 63 65 70 74 2c 20 69 66 20 4e 20 69 73   Except, if N is
6be0: 20 73 65 74 20 74 6f 20 30 20 74 68 65 6e 20 74   set to 0 then t
6bf0: 68 65 0a 20 20 2a 2a 20 75 70 70 65 72 20 6c 61  he.  ** upper la
6c00: 79 65 72 73 20 77 69 6c 6c 20 6e 65 76 65 72 20  yers will never 
6c10: 69 6e 76 6f 6b 65 20 74 68 65 20 78 46 65 74 63  invoke the xFetc
6c20: 68 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20  h interfaces to 
6c30: 74 68 65 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20  the VFS..  */.  
6c40: 63 61 73 65 20 50 72 61 67 54 79 70 5f 4d 4d 41  case PragTyp_MMA
6c50: 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71  P_SIZE: {.    sq
6c60: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
6c70: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
6c80: 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61  MAP_SIZE>0.    a
6c90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
6ca0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
6cb0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
6cc0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
6cd0: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
6ce0: 20 20 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48     sqlite3DecOrH
6cf0: 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20  exToI64(zRight, 
6d00: 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &sz);.      if( 
6d10: 73 7a 3c 30 20 29 20 73 7a 20 3d 20 73 71 6c 69  sz<0 ) sz = sqli
6d20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
6d30: 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 69 66  szMmap;.      if
6d40: 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64  ( pId2->n==0 ) d
6d50: 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a  b->szMmap = sz;.
6d60: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d        for(ii=db-
6d70: 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69  >nDb-1; ii>=0; i
6d80: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i--){.        if
6d90: 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  ( db->aDb[ii].pB
6da0: 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c  t && (ii==iDb ||
6db0: 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a   pId2->n==0) ){.
6dc0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6dd0: 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
6de0: 69 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  it(db->aDb[ii].p
6df0: 42 74 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  Bt, sz);.       
6e00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6e10: 0a 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20  .    sz = -1;.  
6e20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
6e30: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
6e40: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  zDb, SQLITE_FCNT
6e50: 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
6e60: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 7a 20  );.#else.    sz 
6e70: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 0;.    rc = SQ
6e80: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
6e90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6ea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6eb0: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
6ec0: 2c 20 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , sz);.    }else
6ed0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6ee0: 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
6ef0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6f00: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
6f10: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  rc = rc;.    }. 
6f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6f30: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
6f40: 41 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a  A temp_store.  *
6f50: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
6f60: 73 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74  store = "default
6f70: 22 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65  "|"memory"|"file
6f80: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
6f90: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
6fa0: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
6fb0: 20 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67   temp_store flag
6fc0: 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a  .  Changing.  **
6fd0: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
6fe0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63   does not make c
6ff0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69  hanges to the di
7000: 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  sk file and the 
7010: 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c  default.  ** val
7020: 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f  ue will be resto
7030: 72 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d  red the next tim
7040: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
7050: 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20  s opened..  **. 
7060: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74   ** Note that it
7070: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
7080: 20 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d   the library com
7090: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
70a0: 73 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69  s to.  ** overri
70b0: 64 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a  de this setting.
70c0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
70d0: 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20  Typ_TEMP_STORE: 
70e0: 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  {.    if( !zRigh
70f0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
7100: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62  nSingleInt(v, db
7110: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20  ->temp_store);. 
7120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7130: 63 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67  changeTempStorag
7140: 65 28 70 50 61 72 73 65 2c 20 7a 52 69 67 68 74  e(pParse, zRight
7150: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
7160: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
7170: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
7180: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
7190: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
71a0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
71b0: 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74  ory = ""|"direct
71c0: 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20  ory_name".  **. 
71d0: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
71e0: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
71f0: 65 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74  e of the temp_st
7200: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c  ore_directory fl
7210: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7220: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7230: 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72  s a specific dir
7240: 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65  ectory to be use
7250: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
7260: 66 69 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74  files..  ** Sett
7270: 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74  ing to a null st
7280: 72 69 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20  ring reverts to 
7290: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70  the default temp
72a0: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
72b0: 73 65 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20  search..  ** If 
72c0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
72d0: 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ory is changed, 
72e0: 74 68 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54  then invalidateT
72f0: 65 6d 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a  empStorage..  **
7300: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
7310: 67 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f  gTyp_TEMP_STORE_
7320: 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20  DIRECTORY: {.   
7330: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7340: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
7350: 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65  leText(v, sqlite
7360: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
7370: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
7380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7390: 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20  T_WSD.      if( 
73a0: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
73b0: 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
73c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
73d0: 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70  e3OsAccess(db->p
73e0: 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c  Vfs, zRight, SQL
73f0: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
7400: 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20  RITE, &res);.   
7410: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
7420: 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30  ITE_OK || res==0
7430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7440: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7450: 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69  arse, "not a wri
7460: 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22  table directory"
7470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
7480: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
7490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
74a0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
74b0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20  _TEMP_STORE==0. 
74c0: 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45        || (SQLITE
74d0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26  _TEMP_STORE==1 &
74e0: 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  & db->temp_store
74f0: 3c 3d 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  <=1).       || (
7500: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7510: 45 3d 3d 32 20 26 26 20 64 62 2d 3e 74 65 6d 70  E==2 && db->temp
7520: 5f 73 74 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20  _store==1).     
7530: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
7540: 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67  lidateTempStorag
7550: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
7560: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7570: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 74 65  _free(sqlite3_te
7580: 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
7590: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
75a0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
75b0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
75c0: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
75d0: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
75e0: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
75f0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7600: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7610: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7620: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7630: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7640: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7650: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7660: 57 49 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  WIN.  /*.  **   
7670: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
7680: 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a  e_directory.  **
7690: 20 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73     PRAGMA data_s
76a0: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d  tore_directory =
76b0: 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e   ""|"directory_n
76c0: 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ame".  **.  ** R
76d0: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
76e0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20   local value of 
76f0: 74 68 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  the data_store_d
7700: 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20  irectory flag.  
7710: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
7720: 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73  e value sets a s
7730: 70 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72  pecific director
7740: 79 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  y to be used for
7750: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
7760: 74 68 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73  that.  ** were s
7770: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 20  pecified with a 
7780: 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
7790: 65 2e 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61  e.  Setting to a
77a0: 20 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76   null string rev
77b0: 65 72 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  erts.  ** to the
77c0: 20 64 65 66 61 75 6c 74 20 64 61 74 61 62 61 73   default databas
77d0: 65 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69  e directory, whi
77e0: 63 68 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ch for database 
77f0: 66 69 6c 65 73 20 73 70 65 63 69 66 69 65 64 20  files specified 
7800: 77 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61  with.  ** a rela
7810: 74 69 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70  tive path will p
7820: 72 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65 64  robably be based
7830: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
7840: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
7850: 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20  e.  ** process. 
7860: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   Database file s
7870: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 6e  pecified with an
7880: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61   absolute path a
7890: 72 65 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a  re not impacted.
78a0: 20 20 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74    ** by this set
78b0: 74 69 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73  ting, regardless
78c0: 20 6f 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20   of its value.. 
78d0: 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
78e0: 50 72 61 67 54 79 70 5f 44 41 54 41 5f 53 54 4f  PragTyp_DATA_STO
78f0: 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a  RE_DIRECTORY: {.
7900: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
7910: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
7920: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 73 71 6c  ingleText(v, sql
7930: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
7940: 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ory);.    }else{
7950: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7960: 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 69  OMIT_WSD.      i
7970: 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a  f( zRight[0] ){.
7980: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
7990: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
79a0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 64 62  lite3OsAccess(db
79b0: 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68 74 2c 20  ->pVfs, zRight, 
79c0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
79d0: 41 44 57 52 49 54 45 2c 20 26 72 65 73 29 3b 0a  ADWRITE, &res);.
79e0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
79f0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73  SQLITE_OK || res
7a00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7a10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7a20: 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 20  (pParse, "not a 
7a30: 77 72 69 74 61 62 6c 65 20 64 69 72 65 63 74 6f  writable directo
7a40: 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ry");.          
7a50: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
7a60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7a70: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7a80: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 64 61  _free(sqlite3_da
7a90: 74 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  ta_directory);. 
7aa0: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
7ab0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
7ac0: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
7ad0: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
7ae0: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
7af0: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
7b00: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7b10: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7b20: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7b30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7b40: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7b50: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7b60: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
7b70: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
7b80: 4e 47 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20  NG_STYLE.  /*.  
7b90: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
7ba0: 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ema.]lock_proxy_
7bb0: 66 69 6c 65 0a 20 20 2a 2a 20 20 20 50 52 41 47  file.  **   PRAG
7bc0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b  MA [schema.]lock
7bd0: 5f 70 72 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a  _proxy_file = ":
7be0: 61 75 74 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c  auto:"|"lock_fil
7bf0: 65 5f 70 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a  e_path".  **.  *
7c00: 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
7c10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
7c20: 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
7c30: 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
7c40: 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
7c50: 73 65 74 73 20 61 20 73 70 65 63 69 66 69 63 20  sets a specific 
7c60: 66 69 6c 65 20 74 6f 20 62 65 20 75 73 65 64 20  file to be used 
7c70: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 63 63  for database acc
7c80: 65 73 73 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a  ess locks..  **.
7c90: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7ca0: 54 79 70 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46  Typ_LOCK_PROXY_F
7cb0: 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21  ILE: {.    if( !
7cc0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
7cd0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
7ce0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
7cf0: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  r(pDb->pBt);.   
7d00: 20 20 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66     char *proxy_f
7d10: 69 6c 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b  ile_path = NULL;
7d20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7d30: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c  ile *pFile = sql
7d40: 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
7d50: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
7d60: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
7d70: 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c  lHint(pFile, SQL
7d80: 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
7d90: 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  YFILE, .        
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7db0: 20 20 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70     &proxy_file_p
7dc0: 61 74 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ath);.      retu
7dd0: 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20  rnSingleText(v, 
7de0: 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29  proxy_file_path)
7df0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e00: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
7e10: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7e20: 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  ager(pDb->pBt);.
7e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
7e40: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
7e50: 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
7e60: 67 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ger);.      int 
7e70: 72 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  res;.      if( z
7e80: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7e90: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7ea0: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7eb0: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7ec0: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 20 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20      zRight);.   
7f00: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
7f10: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7f20: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7f30: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7f40: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f70: 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20      NULL);.     
7f80: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73   }.      if( res
7f90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7fa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7fb0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7fc0: 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f  failed to set lo
7fd0: 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b  ck proxy file");
7fe0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72  .        goto pr
7ff0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
8000: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
8010: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
8020: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
8030: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20  OCKING_STYLE */ 
8040: 20 20 20 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a       .    .  /*.
8050: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
8060: 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f  chema.]synchrono
8070: 75 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  us.  **   PRAGMA
8080: 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72   [schema.]synchr
8090: 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52  onous=OFF|ON|NOR
80a0: 4d 41 4c 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20  MAL|FULL|EXTRA. 
80b0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
80c0: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
80d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
80e0: 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20  nchronous flag. 
80f0: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
8100: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64  he local value d
8110: 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61  oes not make cha
8120: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b  nges to the disk
8130: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20   file and the.  
8140: 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
8150: 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65   will be restore
8160: 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  d the next time 
8170: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
8180: 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a    ** opened..  *
8190: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
81a0: 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a  _SYNCHRONOUS: {.
81b0: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
81c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
81d0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d  ingleInt(v, pDb-
81e0: 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29  >safety_level-1)
81f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8200: 20 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f     if( !db->auto
8210: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
8220: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8230: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
8240: 20 20 20 20 20 20 20 22 53 61 66 65 74 79 20 6c         "Safety l
8250: 65 76 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20  evel may not be 
8260: 63 68 61 6e 67 65 64 20 69 6e 73 69 64 65 20 61  changed inside a
8270: 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a   transaction");.
8280: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8290: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
82a0: 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28    int iLevel = (
82b0: 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a  getSafetyLevel(z
82c0: 52 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26 20  Right,0,1)+1) & 
82d0: 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
82e0: 53 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20  S_MASK;.        
82f0: 69 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20  if( iLevel==0 ) 
8300: 69 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20  iLevel = 1;.    
8310: 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
8320: 6c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a  level = iLevel;.
8330: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53 79          pDb->bSy
8340: 6e 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  ncSet = 1;.     
8350: 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c     setAllPagerFl
8360: 61 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  ags(db);.      }
8370: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
8380: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
8390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
83a0: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  R_PRAGMAS */..#i
83b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
83c0: 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20  T_FLAG_PRAGMAS. 
83d0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4c   case PragTyp_FL
83e0: 41 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  AG: {.    if( zR
83f0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
8400: 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74   setPragmaResult
8410: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70  ColumnNames(v, p
8420: 50 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20 72  Pragma);.      r
8430: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
8440: 2c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 70  , (db->flags & p
8450: 50 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30  Pragma->iArg)!=0
8460: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
8470: 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
8480: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20  pPragma->iArg;  
8490: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
84a0: 73 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65 61  s to set or clea
84b0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
84c0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
84d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
84e0: 46 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70  Foreign key supp
84f0: 6f 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 65  ort may not be e
8500: 6e 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62 6c  nabled or disabl
8510: 65 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20  ed while not.   
8520: 20 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d       ** in auto-
8530: 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f  commit mode.  */
8540: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d  .        mask &=
8550: 20 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   ~(SQLITE_Foreig
8560: 6e 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a  nKeys);.      }.
8570: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
8580: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
8590: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
85a0: 68 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55  h.authLevel==UAU
85b0: 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20  TH_User ){.     
85c0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
85d0: 6f 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65  ow non-admin use
85e0: 72 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  rs to modify the
85f0: 20 73 63 68 65 6d 61 20 61 72 62 69 74 72 61 72   schema arbitrar
8600: 69 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ily */.        m
8610: 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ask &= ~(SQLITE_
8620: 57 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20 20  WriteSchema);.  
8630: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
8640: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
8650: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
8660: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
8670: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73  db->flags |= mas
8680: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
8690: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
86a0: 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  s &= ~mask;.    
86b0: 20 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51      if( mask==SQ
86c0: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 20  LITE_DeferFKs ) 
86d0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
86e0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
86f0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79  }..      /* Many
8700: 20 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72 61   of the flag-pra
8710: 67 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65 20  gmas modify the 
8720: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
8730: 79 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20 20  y the SQL .     
8740: 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65 67   ** compiler (eg
8750: 2e 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29  . count_changes)
8760: 2e 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f  . So add an opco
8770: 64 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c 6c  de to expire all
8780: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
8790: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
87a0: 73 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69 6e  s after modifyin
87b0: 67 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75 65  g a pragma value
87c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
87d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
87e0: 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29  p0(v, OP_Expire)
87f0: 3b 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61  ;.      setAllPa
8800: 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20  gerFlags(db);.  
8810: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8820: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8830: 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52  ITE_OMIT_FLAG_PR
8840: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
8850: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  f SQLITE_OMIT_SC
8860: 48 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f  HEMA_PRAGMAS.  /
8870: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
8880: 74 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c  table_info(<tabl
8890: 65 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  e>).  **.  ** Re
88a0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
88b0: 77 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  w for each colum
88c0: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74  n of the named t
88d0: 61 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e  able. The column
88e0: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65  s of.  ** the re
88f0: 74 75 72 6e 65 64 20 64 61 74 61 20 73 65 74 20  turned data set 
8900: 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  are:.  **.  ** c
8910: 69 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  id:        Colum
8920: 6e 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20 66  n id (numbered f
8930: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
8940: 74 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20 30  t, starting at 0
8950: 29 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20  ).  ** name:    
8960: 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20     Column name. 
8970: 20 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20 20   ** type:       
8980: 43 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  Column declarati
8990: 6f 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f  on type..  ** no
89a0: 74 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20 69  tnull:    True i
89b0: 66 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20  f 'NOT NULL' is 
89c0: 70 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64  part of column d
89d0: 65 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  eclaration.  ** 
89e0: 64 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65 20  dflt_value: The 
89f0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
8a00: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66  r the column, if
8a10: 20 61 6e 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   any..  */.  cas
8a20: 65 20 50 72 61 67 54 79 70 5f 54 41 42 4c 45 5f  e PragTyp_TABLE_
8a30: 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74  INFO: if( zRight
8a40: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
8a50: 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  Tab;.    pTab = 
8a60: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
8a70: 6c 65 28 70 50 61 72 73 65 2c 20 4c 4f 43 41 54  le(pParse, LOCAT
8a80: 45 5f 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c  E_NOERR, zRight,
8a90: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
8aa0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Tab ){.      int
8ab0: 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69 6e 74   i, k;.      int
8ac0: 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a 20 20   nHidden = 0;.  
8ad0: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
8ae0: 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
8af0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
8b00: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
8b10: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
8b20: 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20  >nMem = 6;.     
8b30: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
8b40: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
8b50: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
8b60: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
8b70: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
8b80: 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Tab);.      for(
8b90: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
8ba0: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
8bb0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
8bc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
8bd0: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f  HiddenColumn(pCo
8be0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
8bf0: 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20  nHidden++;.     
8c00: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8c10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8c20: 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46   if( (pCol->colF
8c30: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
8c40: 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20 20  RIMKEY)==0 ){.  
8c50: 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20          k = 0;. 
8c60: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8c70: 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPk==0 ){.     
8c80: 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20       k = 1;.    
8c90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ca0: 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
8cb0: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70  =pTab->nCol && p
8cc0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31  Pk->aiColumn[k-1
8cd0: 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20  ]!=i; k++){}.   
8ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
8cf0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70 44 66  ssert( pCol->pDf
8d00: 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70  lt==0 || pCol->p
8d10: 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41  Dflt->op==TK_SPA
8d20: 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
8d30: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
8d40: 64 28 76 2c 20 31 2c 20 22 69 73 73 69 73 69 22  d(v, 1, "issisi"
8d50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8d60: 20 69 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20   i-nHidden,.    
8d70: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
8d80: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
8d90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
8da0: 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22  lumnType(pCol,""
8db0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
8dc0: 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20    pCol->notNull 
8dd0: 3f 20 31 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  ? 1 : 0,.       
8de0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44          pCol->pD
8df0: 66 6c 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c  flt ? pCol->pDfl
8e00: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c  t->u.zToken : 0,
8e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e20: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
8e30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8e40: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
8e50: 2c 20 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 6);.      }.  
8e60: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
8e70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8e80: 44 45 42 55 47 0a 20 20 63 61 73 65 20 50 72 61  DEBUG.  case Pra
8e90: 67 54 79 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20  gTyp_STATS: {.  
8ea0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
8eb0: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a     HashElem *i;.
8ec0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8ed0: 20 3d 20 35 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 5;.    sqlite
8ee0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
8ef0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
8f00: 20 20 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65      for(i=sqlite
8f10: 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
8f20: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
8f30: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
8f40: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
8f50: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8f60: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
8f70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8f80: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
8f90: 20 31 2c 20 22 73 73 69 69 69 22 2c 0a 20 20 20   1, "ssiii",.   
8fa0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
8fb0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
8fc0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  0,.           pT
8fd0: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20  ab->szTabRow,.  
8fe0: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
8ff0: 52 6f 77 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20  RowLogEst,.     
9000: 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
9010: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  lags);.      sql
9020: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9030: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
9040: 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 66 6f 72  1, 5);.      for
9050: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
9060: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
9070: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9090: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20  MultiLoad(v, 2, 
90a0: 22 73 69 69 69 22 2c 0a 20 20 20 20 20 20 20 20  "siii",.        
90b0: 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a     pIdx->zName,.
90c0: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
90d0: 3e 73 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20  >szIdxRow,.     
90e0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f        pIdx->aiRo
90f0: 77 4c 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20 20  wLogEst[0],.    
9100: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 68 61 73         pIdx->has
9110: 53 74 61 74 31 29 3b 0a 20 20 20 20 20 20 20 20  Stat1);.        
9120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9130: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
9140: 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20  w, 1, 5);.      
9150: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
9160: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63  eak;.#endif..  c
9170: 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45  ase PragTyp_INDE
9180: 58 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67  X_INFO: if( zRig
9190: 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  ht ){.    Index 
91a0: 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65  *pIdx;.    Table
91b0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78   *pTab;.    pIdx
91c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
91d0: 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  dex(db, zRight, 
91e0: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49  zDb);.    if( pI
91f0: 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  dx ){.      int 
9200: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 3b  i;.      int mx;
9210: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 61 67  .      if( pPrag
9220: 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20 20  ma->iArg ){.    
9230: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
9240: 64 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77 65 72  dex_xinfo (newer
9250: 20 76 65 72 73 69 6f 6e 20 77 69 74 68 20 6d 6f   version with mo
9260: 72 65 20 72 6f 77 73 20 61 6e 64 20 63 6f 6c 75  re rows and colu
9270: 6d 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  mns) */.        
9280: 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  mx = pIdx->nColu
9290: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  mn;.        pPar
92a0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20  se->nMem = 6;.  
92b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
92c0: 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64     /* PRAGMA ind
92d0: 65 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63 79 20  ex_info (legacy 
92e0: 76 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  version) */.    
92f0: 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e      mx = pIdx->n
9300: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
9310: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33  pParse->nMem = 3
9320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9330: 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  pTab = pIdx->pTa
9340: 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ble;.      sqlit
9350: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
9360: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
9370: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9380: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72  Parse->nMem<=pPr
9390: 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65  agma->nPragCName
93a0: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
93b0: 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20  0; i<mx; i++){. 
93c0: 20 20 20 20 20 20 20 69 31 36 20 63 6e 75 6d 20         i16 cnum 
93d0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
93e0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  [i];.        sql
93f0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9400: 64 28 76 2c 20 31 2c 20 22 69 69 73 22 2c 20 69  d(v, 1, "iis", i
9410: 2c 20 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  , cnum,.        
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 20 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20       cnum<0 ? 0 
9440: 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75  : pTab->aCol[cnu
9450: 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m].zName);.     
9460: 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e     if( pPragma->
9470: 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iArg ){.        
9480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9490: 74 69 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73  tiLoad(v, 4, "is
94a0: 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i",.            
94b0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
94c0: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
94d0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
94e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 3c  ,.            i<
94f0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a  pIdx->nKeyCol);.
9500: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9520: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9530: 52 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  Row, 1, pParse->
9540: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  nMem);.      }. 
9550: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
9560: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
9570: 70 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66  p_INDEX_LIST: if
9580: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
9590: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
95a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
95b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54 61    int i;.    pTa
95c0: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
95d0: 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c  able(db, zRight,
95e0: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
95f0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Tab ){.      pPa
9600: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20  rse->nMem = 5;. 
9610: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
9620: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
9630: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
9640: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
9650: 70 49 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49 64  pIndex, i=0; pId
9660: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9670: 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ext, i++){.     
9680: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
9690: 7a 4f 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63  zOrigin[] = { "c
96a0: 22 2c 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a  ", "u", "pk" };.
96b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
96c0: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
96d0: 31 2c 20 22 69 73 69 73 69 22 2c 0a 20 20 20 20  1, "isisi",.    
96e0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
96f0: 20 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65       pIdx->zName
9700: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 49 73 55  ,.           IsU
9710: 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
9720: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 4f  ,.           azO
9730: 72 69 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54  rigin[pIdx->idxT
9740: 79 70 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  ype],.          
9750: 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
9760: 68 65 72 65 21 3d 30 29 3b 0a 20 20 20 20 20 20  here!=0);.      
9770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9780: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9790: 52 6f 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20  Row, 1, 5);.    
97a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
97b0: 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50  break;..  case P
97c0: 72 61 67 54 79 70 5f 44 41 54 41 42 41 53 45 5f  ragTyp_DATABASE_
97d0: 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  LIST: {.    int 
97e0: 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  i;.    pParse->n
97f0: 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 66 6f 72  Mem = 3;.    for
9800: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
9810: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
9820: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d   db->aDb[i].pBt=
9830: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
9840: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
9850: 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
9860: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
9870: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9880: 64 28 76 2c 20 31 2c 20 22 69 73 73 22 2c 0a 20  d(v, 1, "iss",. 
9890: 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20          i,.     
98a0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a      db->aDb[i].z
98b0: 44 62 53 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  DbSName,.       
98c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
98d0: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
98e0: 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20  b[i].pBt));.    
98f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9900: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9910: 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 20 20  Row, 1, 3);.    
9920: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
9930: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
9940: 4f 4c 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b  OLLATION_LIST: {
9950: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
9960: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
9970: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
9980: 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 70  m = 2;.    for(p
9990: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
99a0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
99b0: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
99c0: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20  Next(p)){.      
99d0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
99e0: 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69   (CollSeq *)sqli
99f0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
9a00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9a10: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
9a20: 22 69 73 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c  "is", i++, pColl
9a30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
9a40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9a50: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
9a60: 77 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a  w, 1, 2);.    }.
9a70: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
9a80: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9a90: 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d 41  IT_SCHEMA_PRAGMA
9aa0: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
9ab0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
9ac0: 4e 5f 4b 45 59 0a 20 20 63 61 73 65 20 50 72 61  N_KEY.  case Pra
9ad0: 67 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  gTyp_FOREIGN_KEY
9ae0: 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52 69 67 68  _LIST: if( zRigh
9af0: 74 20 29 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70  t ){.    FKey *p
9b00: 46 4b 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  FK;.    Table *p
9b10: 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  Tab;.    pTab = 
9b20: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
9b30: 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  (db, zRight, zDb
9b40: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
9b50: 29 7b 0a 20 20 20 20 20 20 70 46 4b 20 3d 20 70  ){.      pFK = p
9b60: 54 61 62 2d 3e 70 46 4b 65 79 3b 0a 20 20 20 20  Tab->pFKey;.    
9b70: 20 20 69 66 28 20 70 46 4b 20 29 7b 0a 20 20 20    if( pFK ){.   
9b80: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20       int i = 0; 
9b90: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
9ba0: 3e 6e 4d 65 6d 20 3d 20 38 3b 0a 20 20 20 20 20  >nMem = 8;.     
9bb0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
9bc0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
9bd0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
9be0: 20 77 68 69 6c 65 28 70 46 4b 29 7b 0a 20 20 20   while(pFK){.   
9bf0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
9c00: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
9c10: 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b   j<pFK->nCol; j+
9c20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
9c30: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9c40: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 69 73 73  Load(v, 1, "iiss
9c50: 73 73 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20  ssss",.         
9c60: 20 20 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20            i,.   
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
9c90: 20 20 20 20 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a        pFK->zTo,.
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 46     pTab->aCol[pF
9cc0: 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d  K->aCol[j].iFrom
9cd0: 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ].zName,.       
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d              pFK-
9cf0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20  >aCol[j].zCol,. 
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b    actionName(pFK
9d20: 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 29 2c 20 20  ->aAction[1]),  
9d30: 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 2a 2f 0a  /* ON UPDATE */.
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46     actionName(pF
9d60: 4b 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29 2c 20  K->aAction[0]), 
9d70: 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 2a 2f   /* ON DELETE */
9d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9d90: 20 20 20 20 22 4e 4f 4e 45 22 29 3b 0a 20 20 20      "NONE");.   
9da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9db0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9dc0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 38  _ResultRow, 1, 8
9dd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
9de0: 20 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20           ++i;.  
9df0: 20 20 20 20 20 20 20 20 70 46 4b 20 3d 20 70 46          pFK = pF
9e00: 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  K->pNextFrom;.  
9e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9e20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9e30: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  k;.#endif /* !de
9e40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9e50: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
9e60: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
9e70: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
9e80: 45 59 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  EY.#ifndef SQLIT
9e90: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
9ea0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f   case PragTyp_FO
9eb0: 52 45 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a  REIGN_KEY_CHECK:
9ec0: 20 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b   {.    FKey *pFK
9ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9ee0: 20 41 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63   A foreign key c
9ef0: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
9f00: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
9f10: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64          /* Child
9f20: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22   table contain "
9f30: 52 45 46 45 52 45 4e 43 45 53 22 20 6b 65 79 77  REFERENCES" keyw
9f40: 6f 72 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ord */.    Table
9f50: 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
9f60: 20 20 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c    /* Parent tabl
9f70: 65 20 74 68 61 74 20 63 68 69 6c 64 20 70 6f 69  e that child poi
9f80: 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e  nts to */.    In
9f90: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
9fa0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
9fb0: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
9fc0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20  e */.    int i; 
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a  /* Loop counter:
9ff0: 20 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75    Foreign key nu
a000: 6d 62 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f  mber for pTab */
a010: 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  .    int j;     
a020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a030: 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 69  oop counter:  Fi
a040: 65 6c 64 20 6f 66 20 74 68 65 20 66 6f 72 65 69  eld of the forei
a050: 67 6e 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61  gn key */.    Ha
a060: 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
a070: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
a080: 6e 74 65 72 3a 20 20 4e 65 78 74 20 74 61 62 6c  nter:  Next tabl
a090: 65 20 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20  e in schema */. 
a0a0: 20 20 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20     int x;       
a0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73            /* res
a0c0: 75 6c 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ult variable */.
a0d0: 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c      int regResul
a0e0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20  t;         /* 3 
a0f0: 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
a100: 64 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  d a result row *
a110: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79  /.    int regKey
a120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a130: 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64  Register to hold
a140: 20 6b 65 79 20 66 6f 72 20 63 68 65 63 6b 69 6e   key for checkin
a150: 67 20 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20  g the FK */.    
a160: 69 6e 74 20 72 65 67 52 6f 77 3b 20 20 20 20 20  int regRow;     
a170: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
a180: 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f  ers to hold a ro
a190: 77 20 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20  w from pTab */. 
a1a0: 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20     int addrTop; 
a1b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
a1c0: 20 6f 66 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b   of a loop check
a1d0: 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  ing foreign keys
a1e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
a1f0: 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Ok;            /
a200: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
a210: 68 65 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a  he key is OK */.
a220: 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b      int *aiCols;
a230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68             /* ch
a240: 69 6c 64 20 74 6f 20 70 61 72 65 6e 74 20 63 6f  ild to parent co
a250: 6c 75 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a  lumn mapping */.
a260: 0a 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 3d  .    regResult =
a270: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
a280: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
a290: 6d 20 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b  m += 4;.    regK
a2a0: 65 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ey = ++pParse->n
a2b0: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  Mem;.    regRow 
a2c0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
a2d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
a2e0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
a2f0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
a300: 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69  k = sqliteHashFi
a310: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62  rst(&db->aDb[iDb
a320: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
a330: 73 68 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  sh);.    while( 
a340: 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  k ){.      if( z
a350: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
a360: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
a370: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
a380: 65 2c 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44  e, 0, zRight, zD
a390: 62 29 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  b);.        k = 
a3a0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
a3b0: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 28          pTab = (
a3c0: 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
a3d0: 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
a3e0: 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68    k = sqliteHash
a3f0: 4e 65 78 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d  Next(k);.      }
a400: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
a410: 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65  =0 || pTab->pFKe
a420: 79 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  y==0 ) continue;
a430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
a440: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
a450: 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
a460: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
a470: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
a480: 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50  ->nCol+regRow>pP
a490: 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61  arse->nMem ) pPa
a4a0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62  rse->nMem = pTab
a4b0: 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b  ->nCol + regRow;
a4c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
a4d0: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
a4e0: 30 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  0, iDb, pTab, OP
a4f0: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
a500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
a510: 64 53 74 72 69 6e 67 28 76 2c 20 72 65 67 52 65  dString(v, regRe
a520: 73 75 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  sult, pTab->zNam
a530: 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  e);.      for(i=
a540: 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b  1, pFK=pTab->pFK
a550: 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46  ey; pFK; i++, pF
a560: 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d  K=pFK->pNextFrom
a570: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65  ){.        pPare
a580: 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nt = sqlite3Find
a590: 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a  Table(db, pFK->z
a5a0: 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  To, zDb);.      
a5b0: 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30    if( pParent==0
a5c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a5d0: 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20       pIdx = 0;. 
a5e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61         sqlite3Ta
a5f0: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
a600: 69 44 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e  iDb, pParent->tn
a610: 75 6d 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e  um, 0, pParent->
a620: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
a630: 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63  x = sqlite3FkLoc
a640: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
a650: 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26   pParent, pFK, &
a660: 70 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  pIdx, 0);.      
a670: 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20    if( x==0 ){.  
a680: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
a690: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a6a0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
a6b0: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  ble(pParse, i, i
a6c0: 44 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50 5f  Db, pParent, OP_
a6d0: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
a6e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a6f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a700: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a710: 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20 70 49 64  OpenRead, i, pId
a720: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
a730: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a740: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
a750: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
a760: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a770: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a780: 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20         k = 0;.  
a790: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a7a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a7b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a7c0: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c  Parse->nErr>0 ||
a7d0: 20 70 46 4b 3d 3d 30 20 29 3b 0a 20 20 20 20 20   pFK==0 );.     
a7e0: 20 69 66 28 20 70 46 4b 20 29 20 62 72 65 61 6b   if( pFK ) break
a7f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
a800: 73 65 2d 3e 6e 54 61 62 3c 69 20 29 20 70 50 61  se->nTab<i ) pPa
a810: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a 20  rse->nTab = i;. 
a820: 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73       addrTop = s
a830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
a840: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30  (v, OP_Rewind, 0
a850: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
a860: 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  v);.      for(i=
a870: 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b  1, pFK=pTab->pFK
a880: 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46  ey; pFK; i++, pF
a890: 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d  K=pFK->pNextFrom
a8a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65  ){.        pPare
a8b0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nt = sqlite3Find
a8c0: 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a  Table(db, pFK->z
a8d0: 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  To, zDb);.      
a8e0: 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20    pIdx = 0;.    
a8f0: 20 20 20 20 61 69 43 6f 6c 73 20 3d 20 30 3b 0a      aiCols = 0;.
a900: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
a910: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
a920: 20 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f   x = sqlite3FkLo
a930: 63 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  cateIndex(pParse
a940: 2c 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20  , pParent, pFK, 
a950: 26 70 49 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b  &pIdx, &aiCols);
a960: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
a970: 74 28 20 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( x==0 );.     
a980: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
a990: 72 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rOk = sqlite3Vdb
a9a0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
a9b0: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65         if( pPare
a9c0: 6e 74 20 26 26 20 70 49 64 78 3d 3d 30 20 29 7b  nt && pIdx==0 ){
a9d0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
a9e0: 4b 65 79 20 3d 20 70 46 4b 2d 3e 61 43 6f 6c 5b  Key = pFK->aCol[
a9f0: 30 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20  0].iFrom;.      
aa00: 20 20 20 20 61 73 73 65 72 74 28 20 69 4b 65 79      assert( iKey
aa10: 3e 3d 30 20 26 26 20 69 4b 65 79 3c 70 54 61 62  >=0 && iKey<pTab
aa20: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
aa30: 20 20 20 20 69 66 28 20 69 4b 65 79 21 3d 70 54      if( iKey!=pT
aa40: 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
aa50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
aa60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
aa70: 5f 43 6f 6c 75 6d 6e 2c 20 30 2c 20 69 4b 65 79  _Column, 0, iKey
aa80: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20  , regRow);.     
aa90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
aaa0: 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
aab0: 54 61 62 2c 20 69 4b 65 79 2c 20 72 65 67 52 6f  Tab, iKey, regRo
aac0: 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  w);.            
aad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aae0: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
aaf0: 72 65 67 52 6f 77 2c 20 61 64 64 72 4f 6b 29 3b  regRow, addrOk);
ab00: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ab10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
ab20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
ab30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ab40: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c  (v, OP_Rowid, 0,
ab50: 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20   regRow);.      
ab60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ab70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ab80: 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
ab90: 64 2c 20 69 2c 20 30 2c 20 72 65 67 52 6f 77 29  d, i, 0, regRow)
aba0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
abb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
abc0: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
abd0: 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20  addrOk);.       
abe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
abf0: 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65  mpHere(v, sqlite
ac00: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
ac10: 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 20 20  (v)-2);.        
ac20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ac30: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d   for(j=0; j<pFK-
ac40: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
ac50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ac60: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
ac70: 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
ac80: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aca0: 20 61 69 43 6f 6c 73 20 3f 20 61 69 43 6f 6c 73   aiCols ? aiCols
acb0: 5b 6a 5d 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b  [j] : pFK->aCol[
acc0: 6a 5d 2e 69 46 72 6f 6d 2c 20 72 65 67 52 6f 77  j].iFrom, regRow
acd0: 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +j);.           
ace0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
acf0: 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
ad00: 20 72 65 67 52 6f 77 2b 6a 2c 20 61 64 64 72 4f   regRow+j, addrO
ad10: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
ad20: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
ad30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
ad40: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
ad50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ad60: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
ad70: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
ad80: 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67  , pFK->nCol, reg
ad90: 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41     sqlite3IndexA
adc0: 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c 70 49  ffinityStr(db,pI
add0: 64 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b  dx), pFK->nCol);
ade0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
adf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
ae00: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
ae10: 2c 20 61 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79  , addrOk, regKey
ae20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
ae30: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
ae40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
ae50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ae60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ae70: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
ae80: 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b  0, regResult+1);
ae90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
aea0: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
aeb0: 20 72 65 67 52 65 73 75 6c 74 2b 32 2c 20 22 73   regResult+2, "s
aec0: 69 22 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d  i", pFK->zTo, i-
aed0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
aee0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
aef0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
af00: 65 67 52 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20  egResult, 4);.  
af10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
af20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
af30: 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20   addrOk);.      
af40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
af50: 64 62 2c 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20  db, aiCols);.   
af60: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
af70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
af80: 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64 72  OP_Next, 0, addr
af90: 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  Top+1); VdbeCove
afa0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
afb0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
afc0: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
afd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
afe0: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  k;.#endif /* !de
aff0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b000: 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 23 65  T_TRIGGER) */.#e
b010: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
b020: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
b030: 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69  EIGN_KEY) */..#i
b040: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 63  fndef NDEBUG.  c
b050: 61 73 65 20 50 72 61 67 54 79 70 5f 50 41 52 53  ase PragTyp_PARS
b060: 45 52 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20  ER_TRACE: {.    
b070: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
b080: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
b090: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
b0a0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
b0b0: 73 71 6c 69 74 65 33 50 61 72 73 65 72 54 72 61  sqlite3ParserTra
b0c0: 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73  ce(stdout, "pars
b0d0: 65 72 3a 20 22 29 3b 0a 20 20 20 20 20 20 7d 65  er: ");.      }e
b0e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
b0f0: 69 74 65 33 50 61 72 73 65 72 54 72 61 63 65 28  ite3ParserTrace(
b100: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
b110: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
b120: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
b130: 65 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b  einstall the LIK
b140: 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74  E and GLOB funct
b150: 69 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61  ions.  The varia
b160: 6e 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20  nt of LIKE.  ** 
b170: 75 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73  used will be cas
b180: 65 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e  e sensitive or n
b190: 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ot depending on 
b1a0: 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
b1b0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 53  case PragTyp_CAS
b1c0: 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45  E_SENSITIVE_LIKE
b1d0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
b1e0: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
b1f0: 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46  te3RegisterLikeF
b200: 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c  unctions(db, sql
b210: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
b220: 52 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20  Right, 0));.    
b230: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
b240: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49  #ifndef SQLITE_I
b250: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45  NTEGRITY_CHECK_E
b260: 52 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e  RROR_MAX.# defin
b270: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49  e SQLITE_INTEGRI
b280: 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d  TY_CHECK_ERROR_M
b290: 41 58 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23  AX 100.#endif..#
b2a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b2b0: 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
b2c0: 43 4b 0a 20 20 2f 2a 20 20 20 20 50 52 41 47 4d  CK.  /*    PRAGM
b2d0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
b2e0: 6b 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41  k.  **    PRAGMA
b2f0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
b300: 28 4e 29 0a 20 20 2a 2a 20 20 20 20 50 52 41 47  (N).  **    PRAG
b310: 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 0a 20  MA quick_check. 
b320: 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75   **    PRAGMA qu
b330: 69 63 6b 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a  ick_check(N).  *
b340: 2a 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  *.  ** Verify th
b350: 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
b360: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
b370: 2a 0a 20 20 2a 2a 20 54 68 65 20 22 71 75 69 63  *.  ** The "quic
b380: 6b 5f 63 68 65 63 6b 22 20 69 73 20 72 65 64 75  k_check" is redu
b390: 63 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a  ced version of .
b3a0: 20 20 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f 63    ** integrity_c
b3b0: 68 65 63 6b 20 64 65 73 69 67 6e 65 64 20 74 6f  heck designed to
b3c0: 20 64 65 74 65 63 74 20 6d 6f 73 74 20 64 61 74   detect most dat
b3d0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
b3e0: 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .  ** without th
b3f0: 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 63 72  e overhead of cr
b400: 6f 73 73 2d 63 68 65 63 6b 69 6e 67 20 69 6e 64  oss-checking ind
b410: 65 78 65 73 2e 20 20 51 75 69 63 6b 5f 63 68 65  exes.  Quick_che
b420: 63 6b 0a 20 20 2a 2a 20 69 73 20 6c 69 6e 65 61  ck.  ** is linea
b430: 72 20 74 69 6d 65 20 77 68 65 72 65 61 73 65 20  r time wherease 
b440: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
b450: 69 73 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a  is O(NlogN)..  *
b460: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
b470: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
b480: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a  : {.    int i, j
b490: 2c 20 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a 0a  , addr, mxErr;..
b4a0: 20 20 20 20 69 6e 74 20 69 73 51 75 69 63 6b 20      int isQuick 
b4b0: 3d 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65  = (sqlite3Tolowe
b4c0: 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71 27  r(zLeft[0])=='q'
b4d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
b4e0: 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64  e PRAGMA command
b4f0: 20 77 61 73 20 6f 66 20 74 68 65 20 66 6f 72 6d   was of the form
b500: 20 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69 6e   "PRAGMA <db>.in
b510: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 2c 0a  tegrity_check",.
b520: 20 20 20 20 2a 2a 20 74 68 65 6e 20 69 44 62 20      ** then iDb 
b530: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
b540: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
b550: 61 73 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ase identified b
b560: 79 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20 49  y <db>..    ** I
b570: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
b580: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 64 61   integrity of da
b590: 74 61 62 61 73 65 20 69 44 62 20 6f 6e 6c 79 20  tabase iDb only 
b5a0: 69 73 20 76 65 72 69 66 69 65 64 20 62 79 0a 20  is verified by. 
b5b0: 20 20 20 2a 2a 20 74 68 65 20 56 44 42 45 20 63     ** the VDBE c
b5c0: 72 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20 20  reated below..  
b5d0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65    **.    ** Othe
b5e0: 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f  rwise, if the co
b5f0: 6d 6d 61 6e 64 20 77 61 73 20 73 69 6d 70 6c 79  mmand was simply
b600: 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   "PRAGMA integri
b610: 74 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20 20  ty_check" (or.  
b620: 20 20 2a 2a 20 22 50 52 41 47 4d 41 20 71 75 69    ** "PRAGMA qui
b630: 63 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68 65 6e  ck_check"), then
b640: 20 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 30   iDb is set to 0
b650: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
b660: 73 65 74 20 69 44 62 0a 20 20 20 20 2a 2a 20 74  set iDb.    ** t
b670: 6f 20 2d 31 20 68 65 72 65 2c 20 74 6f 20 69 6e  o -1 here, to in
b680: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
b690: 56 44 42 45 20 73 68 6f 75 6c 64 20 76 65 72 69  VDBE should veri
b6a0: 66 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  fy the integrity
b6b0: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 61  .    ** of all a
b6c0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
b6d0: 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  s.  */.    asser
b6e0: 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20  t( iDb>=0 );.   
b6f0: 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20   assert( iDb==0 
b700: 7c 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20 20  || pId2->z );.  
b710: 20 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d 30    if( pId2->z==0
b720: 20 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20 20   ) iDb = -1;..  
b730: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
b740: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
b750: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
b760: 6e 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20 2f  nMem = 6;..    /
b770: 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
b780: 6d 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f  m error count */
b790: 0a 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c  .    mxErr = SQL
b7a0: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
b7b0: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20  ECK_ERROR_MAX;. 
b7c0: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
b7d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65  .      sqlite3Ge
b7e0: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
b7f0: 6d 78 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66  mxErr);.      if
b800: 28 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20  ( mxErr<=0 ){.  
b810: 20 20 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51        mxErr = SQ
b820: 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43  LITE_INTEGRITY_C
b830: 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a  HECK_ERROR_MAX;.
b840: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b860: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
b870: 72 2c 20 6d 78 45 72 72 2d 31 2c 20 31 29 3b 20  r, mxErr-1, 1); 
b880: 2f 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20  /* reg[1] holds 
b890: 65 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a  errors left */..
b8a0: 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74      /* Do an int
b8b0: 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6e 20  egrity check on 
b8c0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
b8d0: 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  le */.    for(i=
b8e0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
b8f0: 2b 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c  +){.      HashEl
b900: 65 6d 20 2a 78 3b 0a 20 20 20 20 20 20 48 61 73  em *x;.      Has
b910: 68 20 2a 70 54 62 6c 73 3b 0a 20 20 20 20 20 20  h *pTbls;.      
b920: 69 6e 74 20 2a 61 52 6f 6f 74 3b 0a 20 20 20 20  int *aRoot;.    
b930: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
b940: 20 20 20 20 20 69 6e 74 20 6d 78 49 64 78 20 3d       int mxIdx =
b950: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   0;.      int nI
b960: 64 78 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 4f  dx;..      if( O
b970: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 3d  MIT_TEMPDB && i=
b980: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =1 ) continue;. 
b990: 20 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20       if( iDb>=0 
b9a0: 26 26 20 69 21 3d 69 44 62 20 29 20 63 6f 6e 74  && i!=iDb ) cont
b9b0: 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c  inue;..      sql
b9c0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
b9d0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b  hema(pParse, i);
b9e0: 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e  ..      /* Do an
b9f0: 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
ba00: 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a 20   of the B-Tree. 
ba10: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
ba20: 20 42 65 67 69 6e 20 62 79 20 66 69 6e 64 69 6e   Begin by findin
ba30: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 73  g the root pages
ba40: 20 6e 75 6d 62 65 72 73 0a 20 20 20 20 20 20 2a   numbers.      *
ba50: 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  * for all tables
ba60: 20 61 6e 64 20 69 6e 64 69 63 65 73 20 69 6e 20   and indices in 
ba70: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
ba80: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
ba90: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
baa0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
bab0: 69 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70  i, 0) );.      p
bac0: 54 62 6c 73 20 3d 20 26 64 62 2d 3e 61 44 62 5b  Tbls = &db->aDb[
bad0: 69 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  i].pSchema->tblH
bae0: 61 73 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 63  ash;.      for(c
baf0: 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61  nt=0, x=sqliteHa
bb00: 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20  shFirst(pTbls); 
bb10: 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e  x; x=sqliteHashN
bb20: 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20  ext(x)){.       
bb30: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
bb40: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29  qliteHashData(x)
bb50: 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  ;.        Index 
bb60: 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69  *pIdx;.        i
bb70: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
bb80: 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  ) ) cnt++;.     
bb90: 20 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70     for(nIdx=0, p
bba0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
bbb0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
bbc0: 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b  x->pNext, nIdx++
bbd0: 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20  ){ cnt++; }.    
bbe0: 20 20 20 20 69 66 28 20 6e 49 64 78 3e 6d 78 49      if( nIdx>mxI
bbf0: 64 78 20 29 20 6d 78 49 64 78 20 3d 20 6e 49 64  dx ) mxIdx = nId
bc00: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
bc10: 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33   aRoot = sqlite3
bc20: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
bc30: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 63  , sizeof(int)*(c
bc40: 6e 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66  nt+1));.      if
bc50: 28 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72 65  ( aRoot==0 ) bre
bc60: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e  ak;.      for(cn
bc70: 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73  t=0, x=sqliteHas
bc80: 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78  hFirst(pTbls); x
bc90: 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; x=sqliteHashNe
bca0: 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(x)){.        
bcb0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
bcc0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b  liteHashData(x);
bcd0: 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
bce0: 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66  pIdx;.        if
bcf0: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
bd00: 20 29 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20   ) aRoot[cnt++] 
bd10: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20  = pTab->tnum;.  
bd20: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
bd30: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
bd40: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
bd50: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
bd60: 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70  aRoot[cnt++] = p
bd70: 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
bd80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
bd90: 20 20 20 61 52 6f 6f 74 5b 63 6e 74 5d 20 3d 20     aRoot[cnt] = 
bda0: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b  0;..      /* Mak
bdb0: 65 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  e sure sufficien
bdc0: 74 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  t number of regi
bdd0: 73 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  sters have been 
bde0: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20  allocated */.   
bdf0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
be00: 3d 20 4d 41 58 28 20 70 50 61 72 73 65 2d 3e 6e  = MAX( pParse->n
be10: 4d 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b 0a  Mem, 8+mxIdx );.
be20: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  .      /* Do the
be30: 20 62 2d 74 72 65 65 20 69 6e 74 65 67 72 69 74   b-tree integrit
be40: 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20 20 20 20  y checks */.    
be50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
be60: 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 65 67 72  Op4(v, OP_Integr
be70: 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74 2c 20 31  ityCk, 2, cnt, 1
be80: 2c 20 28 63 68 61 72 2a 29 61 52 6f 6f 74 2c 50  , (char*)aRoot,P
be90: 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 20  4_INTARRAY);.   
bea0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
beb0: 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 69 29  angeP5(v, (u8)i)
bec0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
bed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
bee0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32  (v, OP_IsNull, 2
bef0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
bf00: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
bf10: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
bf20: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c  P_String8, 0, 3,
bf30: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   0,.         sql
bf40: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
bf50: 22 2a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  "*** in database
bf60: 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e   %s ***\n", db->
bf70: 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[i].zDbSName)
bf80: 2c 0a 20 20 20 20 20 20 20 20 20 50 34 5f 44 59  ,.         P4_DY
bf90: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71  NAMIC);.      sq
bfa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
bfb0: 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 32 2c 20 34  v, OP_Move, 2, 4
bfc0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
bfd0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
bfe0: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33   OP_Concat, 4, 3
bff0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 69 6e 74 65  , 2);.      inte
c000: 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74  grityCheckResult
c010: 52 6f 77 28 76 2c 20 32 29 3b 0a 20 20 20 20 20  Row(v, 2);.     
c020: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c030: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a  Here(v, addr);..
c040: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
c050: 72 65 20 61 6c 6c 20 74 68 65 20 69 6e 64 69 63  re all the indic
c060: 65 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74  es are construct
c070: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ed correctly..  
c080: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72      */.      for
c090: 28 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (x=sqliteHashFir
c0a0: 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d  st(pTbls); x; x=
c0b0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78  sqliteHashNext(x
c0c0: 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  )){.        Tabl
c0d0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
c0e0: 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20  HashData(x);.   
c0f0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
c100: 2c 20 2a 70 50 6b 3b 0a 20 20 20 20 20 20 20 20  , *pPk;.        
c110: 49 6e 64 65 78 20 2a 70 50 72 69 6f 72 20 3d 20  Index *pPrior = 
c120: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  0;.        int l
c130: 6f 6f 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20  oopTop;.        
c140: 69 6e 74 20 69 44 61 74 61 43 75 72 2c 20 69 49  int iDataCur, iI
c150: 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 69  dxCur;.        i
c160: 6e 74 20 72 31 20 3d 20 2d 31 3b 0a 0a 20 20 20  nt r1 = -1;..   
c170: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74       if( pTab->t
c180: 6e 75 6d 3c 31 20 29 20 63 6f 6e 74 69 6e 75 65  num<1 ) continue
c190: 3b 20 20 2f 2a 20 53 6b 69 70 20 56 49 45 57 73  ;  /* Skip VIEWs
c1a0: 20 6f 72 20 56 49 52 54 55 41 4c 20 54 41 42 4c   or VIRTUAL TABL
c1b0: 45 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  Es */.        if
c1c0: 28 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 3d 3d  ( pTab->pCheck==
c1d0: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
c1e0: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
c1f0: 54 46 5f 48 61 73 4e 6f 74 4e 75 6c 6c 29 3d 3d  TF_HasNotNull)==
c200: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
c210: 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 7c  Tab->pIndex==0 |
c220: 7c 20 69 73 51 75 69 63 6b 29 0a 20 20 20 20 20  | isQuick).     
c230: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
c240: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 4e 6f  continue;  /* No
c250: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
c260: 6b 73 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68  ks needed for th
c270: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  is table */.    
c280: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
c290: 6b 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61  k = HasRowid(pTa
c2a0: 62 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  b) ? 0 : sqlite3
c2b0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
c2c0: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 73  pTab);.        s
c2d0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
c2e0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
c2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
c300: 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73  nTableAndIndices
c310: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4f  (pParse, pTab, O
c320: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 30 2c 0a 20  P_OpenRead, 0,. 
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c350: 20 20 31 2c 20 30 2c 20 26 69 44 61 74 61 43 75    1, 0, &iDataCu
c360: 72 2c 20 26 69 49 64 78 43 75 72 29 3b 0a 20 20  r, &iIdxCur);.  
c370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c380: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
c390: 74 65 67 65 72 2c 20 30 2c 20 37 29 3b 0a 20 20  teger, 0, 7);.  
c3a0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
c3b0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
c3c0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
c3d0: 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a  x->pNext, j++){.
c3e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c3f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c400: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 38 2b  P_Integer, 0, 8+
c410: 6a 29 3b 20 2f 2a 20 69 6e 64 65 78 20 65 6e 74  j); /* index ent
c420: 72 69 65 73 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ries counter */.
c430: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c440: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
c450: 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20 29 3b 0a 20  ->nMem>=8+j );. 
c460: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
c470: 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52  qlite3NoTempsInR
c480: 61 6e 67 65 28 70 50 61 72 73 65 2c 31 2c 37 2b  ange(pParse,1,7+
c490: 6a 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  j) );.        sq
c4a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c4b0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44  v, OP_Rewind, iD
c4c0: 61 74 61 43 75 72 2c 20 30 29 3b 20 56 64 62 65  ataCur, 0); Vdbe
c4d0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
c4e0: 20 20 20 20 20 6c 6f 6f 70 54 6f 70 20 3d 20 73       loopTop = s
c4f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c500: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 37  (v, OP_AddImm, 7
c510: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  , 1);.        /*
c520: 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c   Verify that all
c530: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
c540: 73 20 72 65 61 6c 6c 79 20 61 72 65 20 4e 4f 54  s really are NOT
c550: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20   NULL */.       
c560: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
c570: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
c580: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45          char *zE
c590: 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  rr;.          in
c5a0: 74 20 6a 6d 70 32 3b 0a 20 20 20 20 20 20 20 20  t jmp2;.        
c5b0: 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69    if( j==pTab->i
c5c0: 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b  PKey ) continue;
c5d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
c5e0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  Tab->aCol[j].not
c5f0: 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Null==0 ) contin
c600: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ue;.          sq
c610: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
c620: 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
c630: 20 70 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c   pTab, iDataCur,
c640: 20 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20   j, 3);.        
c650: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
c660: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
c670: 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20  TYPEOFARG);.    
c680: 20 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c        jmp2 = sql
c690: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
c6a0: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 33 29  , OP_NotNull, 3)
c6b0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
c6c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72  );.          zEr
c6d0: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
c6e0: 74 66 28 64 62 2c 20 22 4e 55 4c 4c 20 76 61 6c  tf(db, "NULL val
c6f0: 75 65 20 69 6e 20 25 73 2e 25 73 22 2c 20 70 54  ue in %s.%s", pT
c700: 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
c730: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[j].zName);. 
c740: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c750: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
c760: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20  _String8, 0, 3, 
c770: 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41  0, zErr, P4_DYNA
c780: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  MIC);.          
c790: 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65  integrityCheckRe
c7a0: 73 75 6c 74 52 6f 77 28 76 2c 20 33 29 3b 0a 20  sultRow(v, 3);. 
c7b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c7c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c7d0: 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  jmp2);.        }
c7e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69  .        /* Veri
c7f0: 66 79 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  fy CHECK constra
c800: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
c810: 69 66 28 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  if( pTab->pCheck
c820: 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
c830: 20 53 51 4c 49 54 45 5f 49 67 6e 6f 72 65 43 68   SQLITE_IgnoreCh
c840: 65 63 6b 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ecks)==0 ){.    
c850: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
c860: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
c870: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
c880: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 30 29  pTab->pCheck, 0)
c890: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
c8a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c8b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
c8c0: 20 20 20 69 6e 74 20 61 64 64 72 43 6b 46 61 75     int addrCkFau
c8d0: 6c 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  lt = sqlite3Vdbe
c8e0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
c8f0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64            int ad
c900: 64 72 43 6b 4f 6b 20 3d 20 73 71 6c 69 74 65 33  drCkOk = sqlite3
c910: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
c920: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
c930: 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20  ar *zErr;.      
c940: 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
c950: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
c960: 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 44 61 74  >iSelfTab = iDat
c970: 61 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  aCur;.          
c980: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
c990: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
c9b0: 6b 3d 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72 2d  k=pCheck->nExpr-
c9c0: 31 3b 20 6b 3e 30 3b 20 6b 2d 2d 29 7b 0a 20 20  1; k>0; k--){.  
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c9e0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
c9f0: 50 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61  Parse, pCheck->a
ca00: 5b 6b 5d 2e 70 45 78 70 72 2c 20 61 64 64 72 43  [k].pExpr, addrC
ca10: 6b 46 61 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20  kFault, 0);.    
ca20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ca30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ca40: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
ca50: 70 43 68 65 63 6b 2d 3e 61 5b 30 5d 2e 70 45 78  pCheck->a[0].pEx
ca60: 70 72 2c 20 61 64 64 72 43 6b 4f 6b 2c 20 0a 20  pr, addrCkOk, . 
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
ca80: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
ca90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
caa0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cab0: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b  eLabel(v, addrCk
cac0: 46 61 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  Fault);.        
cad0: 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74      zErr = sqlit
cae0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43  e3MPrintf(db, "C
caf0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
cb00: 66 61 69 6c 65 64 20 69 6e 20 25 73 22 2c 0a 20  failed in %s",. 
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
cb20: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
cb30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cb40: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
cb50: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20  _String8, 0, 3, 
cb60: 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41  0, zErr, P4_DYNA
cb70: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  MIC);.          
cb80: 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b    integrityCheck
cb90: 52 65 73 75 6c 74 52 6f 77 28 76 2c 20 33 29 3b  ResultRow(v, 3);
cba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
cbb0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
cbc0: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 4f 6b  abel(v, addrCkOk
cbd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
cbe0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
cbf0: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
cc00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cc10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
cc20: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 68 65  tDelete(db, pChe
cc30: 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ck);.        }. 
cc40: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 61         /* Valida
cc50: 74 65 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  te index entries
cc60: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
cc70: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20   row */.        
cc80: 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54  for(j=0, pIdx=pT
cc90: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
cca0: 20 26 26 20 21 69 73 51 75 69 63 6b 3b 20 70 49   && !isQuick; pI
ccb0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
ccc0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
ccd0: 69 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20  int jmp2, jmp3, 
cce0: 6a 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20 20 20 20  jmp4, jmp5;.    
ccf0: 20 20 20 20 20 20 69 6e 74 20 63 6b 55 6e 69 71        int ckUniq
cd00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
cd10: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
cd20: 20 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70        if( pPk==p
cd30: 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Idx ) continue;.
cd40: 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73            r1 = s
cd50: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
cd60: 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
cd70: 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20 30  Idx, iDataCur, 0
cd80: 2c 20 30 2c 20 26 6a 6d 70 33 2c 0a 20 20 20 20  , 0, &jmp3,.    
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 20 20 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a     pPrior, r1);.
cdc0: 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72            pPrior
cdd0: 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
cde0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cdf0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
ce00: 6d 2c 20 38 2b 6a 2c 20 31 29 3b 20 20 2f 2a 20  m, 8+j, 1);  /* 
ce10: 69 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72 79 20  increment entry 
ce20: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  count */.       
ce30: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
ce40: 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
ce50: 20 65 78 69 73 74 73 20 66 6f 72 20 74 68 65 20   exists for the 
ce60: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 72 6f  current table ro
ce70: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6a  w */.          j
ce80: 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mp2 = sqlite3Vdb
ce90: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
cea0: 5f 46 6f 75 6e 64 2c 20 69 49 64 78 43 75 72 2b  _Found, iIdxCur+
ceb0: 6a 2c 20 63 6b 55 6e 69 71 2c 20 72 31 2c 0a 20  j, ckUniq, r1,. 
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75       pIdx->nColu
cef0: 6d 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  mn); VdbeCoverag
cf00: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
cf10: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
cf20: 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77  tring(v, 3, "row
cf30: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   ");.          s
cf40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
cf50: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 37  (v, OP_Concat, 7
cf60: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 3, 3);.       
cf70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
cf80: 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 22  adString(v, 4, "
cf90: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e   missing from in
cfa0: 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20  dex ");.        
cfb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cfc0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
cfd0: 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20  , 4, 3, 3);.    
cfe0: 20 20 20 20 20 20 6a 6d 70 35 20 3d 20 73 71 6c        jmp5 = sql
cff0: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
d000: 6e 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a  ng(v, 4, pIdx->z
d010: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
d020: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d030: 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c  p3(v, OP_Concat,
d040: 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20   4, 3, 3);.     
d050: 20 20 20 20 20 6a 6d 70 34 20 3d 20 69 6e 74 65       jmp4 = inte
d060: 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74  grityCheckResult
d070: 52 6f 77 28 76 2c 20 33 29 3b 0a 20 20 20 20 20  Row(v, 3);.     
d080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d090: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32  JumpHere(v, jmp2
d0a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
d0b0: 46 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78  For UNIQUE index
d0c0: 65 73 2c 20 76 65 72 69 66 79 20 74 68 61 74 20  es, verify that 
d0d0: 6f 6e 6c 79 20 6f 6e 65 20 65 6e 74 72 79 20 65  only one entry e
d0e0: 78 69 73 74 73 20 77 69 74 68 20 74 68 65 0a 20  xists with the. 
d0f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72           ** curr
d100: 65 6e 74 20 6b 65 79 2e 20 20 54 68 65 20 65 6e  ent key.  The en
d110: 74 72 79 20 69 73 20 75 6e 69 71 75 65 20 69 66  try is unique if
d120: 20 28 31 29 20 61 6e 79 20 63 6f 6c 75 6d 6e 20   (1) any column 
d130: 69 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20  is NULL.        
d140: 20 20 2a 2a 20 6f 72 20 28 32 29 20 74 68 65 20    ** or (2) the 
d150: 6e 65 78 74 20 65 6e 74 72 79 20 68 61 73 20 61  next entry has a
d160: 20 64 69 66 66 65 72 65 6e 74 20 6b 65 79 20 2a   different key *
d170: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
d180: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
d190: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dx) ){.         
d1a0: 20 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20 3d 20     int uniqOk = 
d1b0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d1c0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
d1d0: 20 20 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20       int jmp6;. 
d1e0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
d1f0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  k;.            f
d200: 6f 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78  or(kk=0; kk<pIdx
d210: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29  ->nKeyCol; kk++)
d220: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d230: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d  int iCol = pIdx-
d240: 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20  >aiColumn[kk];. 
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
d260: 65 72 74 28 20 69 43 6f 6c 21 3d 58 4e 5f 52 4f  ert( iCol!=XN_RO
d270: 57 49 44 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  WID && iCol<pTab
d280: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
d290: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
d2a0: 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e 61 43 6f  >=0 && pTab->aCo
d2b0: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
d2c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d2d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d2e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d2f0: 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b 6b 2c  P_IsNull, r1+kk,
d300: 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20   uniqOk);.      
d310: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
d320: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
d330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d340: 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69 74 65     jmp6 = sqlite
d350: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
d360: 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2b  P_Next, iIdxCur+
d370: 6a 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  j); VdbeCoverage
d380: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d390: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
d3a0: 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20  (v, uniqOk);.   
d3b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d3c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d3d0: 6a 6d 70 36 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp6);.         
d3e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d3f0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
d400: 78 47 54 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20  xGT, iIdxCur+j, 
d410: 75 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20 20 20 20  uniqOk, r1,.    
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
d440: 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
d450: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d460: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d470: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
d480: 76 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69 71 75  v, 3, "non-uniqu
d490: 65 20 65 6e 74 72 79 20 69 6e 20 69 6e 64 65 78  e entry in index
d4a0: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ");.           
d4b0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
d4c0: 28 76 2c 20 6a 6d 70 35 29 3b 0a 20 20 20 20 20  (v, jmp5);.     
d4d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d4e0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d4f0: 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20  , uniqOk);.     
d500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d510: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d520: 48 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b 0a 20  Here(v, jmp4);. 
d530: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d540: 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61  ResolvePartIdxLa
d550: 62 65 6c 28 70 50 61 72 73 65 2c 20 6a 6d 70 33  bel(pParse, jmp3
d560: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d570: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d580: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
d590: 74 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 6f 6f  t, iDataCur, loo
d5a0: 70 54 6f 70 29 3b 20 56 64 62 65 43 6f 76 65 72  pTop); VdbeCover
d5b0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
d5c0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
d5d0: 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31  ere(v, loopTop-1
d5e0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
d5f0: 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
d600: 54 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  T.        if( !i
d610: 73 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20 20  sQuick ){.      
d620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
d630: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 32 2c 20  oadString(v, 2, 
d640: 22 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72  "wrong # of entr
d650: 69 65 73 20 69 6e 20 69 6e 64 65 78 20 22 29 3b  ies in index ");
d660: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
d670: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
d680: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
d690: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
d6a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
d6b0: 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29   if( pPk==pIdx )
d6c0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
d6d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d6e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
d6f0: 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2b 6a 2c  ount, iIdxCur+j,
d700: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   3);.           
d710: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
d720: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d730: 45 71 2c 20 38 2b 6a 2c 20 30 2c 20 33 29 3b 20  Eq, 8+j, 0, 3); 
d740: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d760: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
d770: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55  (v, SQLITE_NOTNU
d780: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  LL);.           
d790: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
d7a0: 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 70 49 64  String(v, 3, pId
d7b0: 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
d7c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d7d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
d7e0: 6f 6e 63 61 74 2c 20 33 2c 20 32 2c 20 37 29 3b  oncat, 3, 2, 7);
d7f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d800: 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c  egrityCheckResul
d810: 74 52 6f 77 28 76 2c 20 37 29 3b 0a 20 20 20 20  tRow(v, 7);.    
d820: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d830: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
d840: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
d850: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
d860: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
d870: 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a  T_BTREECOUNT */.
d880: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20        } .    }. 
d890: 20 20 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69     {.      stati
d8a0: 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20  c const int iLn 
d8b0: 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49  = VDBE_OFFSET_LI
d8c0: 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20 20 73  NENO(2);.      s
d8d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65  tatic const Vdbe
d8e0: 4f 70 4c 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d  OpList endCode[]
d8f0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f   = {.        { O
d900: 50 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31  P_AddImm,      1
d910: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
d920: 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20     /* 0 */.     
d930: 20 20 20 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65 72     { OP_IfNotZer
d940: 6f 2c 20 20 20 31 2c 20 34 2c 20 20 20 20 20 20  o,   1, 4,      
d950: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f    0},    /* 1 */
d960: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  .        { OP_St
d970: 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c  ring8,     0, 3,
d980: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
d990: 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 2 */.        {
d9a0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20   OP_ResultRow,  
d9b0: 20 33 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d   3, 1,        0}
d9c0: 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20  ,    /* 3 */.   
d9d0: 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65     };.      Vdbe
d9e0: 4f 70 20 2a 61 4f 70 3b 0a 0a 20 20 20 20 20 20  Op *aOp;..      
d9f0: 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  aOp = sqlite3Vdb
da00: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
da10: 72 61 79 53 69 7a 65 28 65 6e 64 43 6f 64 65 29  raySize(endCode)
da20: 2c 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e 29 3b  , endCode, iLn);
da30: 0a 20 20 20 20 20 20 69 66 28 20 61 4f 70 20 29  .      if( aOp )
da40: 7b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d  {.        aOp[0]
da50: 2e 70 32 20 3d 20 31 2d 6d 78 45 72 72 3b 0a 20  .p2 = 1-mxErr;. 
da60: 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34         aOp[2].p4
da70: 74 79 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43  type = P4_STATIC
da80: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d  ;.        aOp[2]
da90: 2e 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a 20 20  .p4.z = "ok";.  
daa0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
dab0: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
dac0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
dad0: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
dae0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
daf0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f  E_OMIT_UTF16.  /
db00: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
db10: 65 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 20 20  encoding.  **   
db20: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20  PRAGMA encoding 
db30: 3d 20 22 75 74 66 2d 38 22 7c 22 75 74 66 2d 31  = "utf-8"|"utf-1
db40: 36 22 7c 22 75 74 66 2d 31 36 6c 65 22 7c 22 75  6"|"utf-16le"|"u
db50: 74 66 2d 31 36 62 65 22 0a 20 20 2a 2a 0a 20 20  tf-16be".  **.  
db60: 2a 2a 20 49 6e 20 69 74 73 20 66 69 72 73 74 20  ** In its first 
db70: 66 6f 72 6d 2c 20 74 68 69 73 20 70 72 61 67 6d  form, this pragm
db80: 61 20 72 65 74 75 72 6e 73 20 74 68 65 20 65 6e  a returns the en
db90: 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 6d 61  coding of the ma
dba0: 69 6e 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  in.  ** database
dbb0: 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  . If the databas
dbc0: 65 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c  e is not initial
dbd0: 69 7a 65 64 2c 20 69 74 20 69 73 20 69 6e 69 74  ized, it is init
dbe0: 69 61 6c 69 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a  ialized now..  *
dbf0: 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e  *.  ** The secon
dc00: 64 20 66 6f 72 6d 20 6f 66 20 74 68 69 73 20 70  d form of this p
dc10: 72 61 67 6d 61 20 69 73 20 61 20 6e 6f 2d 6f 70  ragma is a no-op
dc20: 20 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   if the main dat
dc30: 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
dc40: 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
dc50: 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
dc60: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
dc70: 74 20 73 65 74 73 20 74 68 65 20 64 65 66 61 75  t sets the defau
dc80: 6c 74 0a 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67  lt.  ** encoding
dc90: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
dca0: 65 64 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  ed for the main 
dcb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
dcc0: 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a   a new file.  **
dcd0: 20 69 73 20 63 72 65 61 74 65 64 2e 20 49 66 20   is created. If 
dce0: 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 61 69 6e  an existing main
dcf0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
dd00: 73 20 6f 70 65 6e 65 64 2c 20 74 68 65 6e 20 74  s opened, then t
dd10: 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
dd20: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 66 6f  text encoding fo
dd30: 72 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64  r the existing d
dd40: 61 74 61 62 61 73 65 20 69 73 20 75 73 65 64 2e  atabase is used.
dd50: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20 61  .  ** .  ** In a
dd60: 6c 6c 20 63 61 73 65 73 20 6e 65 77 20 64 61 74  ll cases new dat
dd70: 61 62 61 73 65 73 20 63 72 65 61 74 65 64 20 75  abases created u
dd80: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
dd90: 63 6f 6d 6d 61 6e 64 20 61 72 65 0a 20 20 2a 2a  command are.  **
dda0: 20 63 72 65 61 74 65 64 20 74 6f 20 75 73 65 20   created to use 
ddb0: 74 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74  the same default
ddc0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61   text encoding a
ddd0: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
dde0: 61 73 65 2e 20 49 66 0a 20 20 2a 2a 20 74 68 65  ase. If.  ** the
ddf0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 68   main database h
de00: 61 73 20 6e 6f 74 20 62 65 65 6e 20 69 6e 69 74  as not been init
de10: 69 61 6c 69 7a 65 64 20 61 6e 64 2f 6f 72 20 63  ialized and/or c
de20: 72 65 61 74 65 64 20 77 68 65 6e 20 41 54 54 41  reated when ATTA
de30: 43 48 0a 20 20 2a 2a 20 69 73 20 65 78 65 63 75  CH.  ** is execu
de40: 74 65 64 2c 20 74 68 69 73 20 69 73 20 64 6f 6e  ted, this is don
de50: 65 20 62 65 66 6f 72 65 20 74 68 65 20 41 54 54  e before the ATT
de60: 41 43 48 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  ACH operation.. 
de70: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20   **.  ** In the 
de80: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 68 69 73  second form this
de90: 20 70 72 61 67 6d 61 20 73 65 74 73 20 74 68 65   pragma sets the
dea0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 74   text encoding t
deb0: 6f 20 62 65 20 75 73 65 64 20 69 6e 0a 20 20 2a  o be used in.  *
dec0: 2a 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66  * new database f
ded0: 69 6c 65 73 20 63 72 65 61 74 65 64 20 75 73 69  iles created usi
dee0: 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65  ng this database
def0: 20 68 61 6e 64 6c 65 2e 20 49 74 20 69 73 20 6f   handle. It is o
df00: 6e 6c 79 0a 20 20 2a 2a 20 75 73 65 66 75 6c 20  nly.  ** useful 
df10: 69 66 20 69 6e 76 6f 6b 65 64 20 69 6d 6d 65 64  if invoked immed
df20: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
df30: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
df40: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
df50: 67 54 79 70 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b  gTyp_ENCODING: {
df60: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
df70: 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65  t struct EncName
df80: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
df90: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 75 38 20 65  Name;.      u8 e
dfa0: 6e 63 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61 6d  nc;.    } encnam
dfb0: 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  es[] = {.      {
dfc0: 20 22 55 54 46 38 22 2c 20 20 20 20 20 53 51 4c   "UTF8",     SQL
dfd0: 49 54 45 5f 55 54 46 38 20 20 20 20 20 20 20 20  ITE_UTF8        
dfe0: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d  },.      { "UTF-
dff0: 38 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54  8",    SQLITE_UT
e000: 46 38 20 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a  F8        },  /*
e010: 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74   Must be element
e020: 20 5b 31 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20   [1] */.      { 
e030: 22 55 54 46 2d 31 36 6c 65 22 2c 20 53 51 4c 49  "UTF-16le", SQLI
e040: 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20 7d  TE_UTF16LE     }
e050: 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c  ,  /* Must be el
e060: 65 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20 20  ement [2] */.   
e070: 20 20 20 7b 20 22 55 54 46 2d 31 36 62 65 22 2c     { "UTF-16be",
e080: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
e090: 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20      },  /* Must 
e0a0: 62 65 20 65 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a  be element [3] *
e0b0: 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31 36  /.      { "UTF16
e0c0: 6c 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54 46  le",  SQLITE_UTF
e0d0: 31 36 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20 20  16LE     },.    
e0e0: 20 20 7b 20 22 55 54 46 31 36 62 65 22 2c 20 20    { "UTF16be",  
e0f0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20  SQLITE_UTF16BE  
e100: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55     },.      { "U
e110: 54 46 2d 31 36 22 2c 20 20 20 30 20 20 20 20 20  TF-16",   0     
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20               }, 
e130: 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  /* SQLITE_UTF16N
e140: 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b  ATIVE */.      {
e150: 20 22 55 54 46 31 36 22 2c 20 20 20 20 30 20 20   "UTF16",    0  
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46  }, /* SQLITE_UTF
e180: 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20  16NATIVE */.    
e190: 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d    { 0, 0 }.    }
e1a0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75  ;.    const stru
e1b0: 63 74 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e 63  ct EncName *pEnc
e1c0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
e1d0: 74 20 29 7b 20 20 20 20 2f 2a 20 22 50 52 41 47  t ){    /* "PRAG
e1e0: 4d 41 20 65 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a  MA encoding" */.
e1f0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
e200: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
e210: 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d  se) ) goto pragm
e220: 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 61 73 73  a_out;.      ass
e230: 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51  ert( encnames[SQ
e240: 4c 49 54 45 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d  LITE_UTF8].enc==
e250: 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20  SQLITE_UTF8 );. 
e260: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63       assert( enc
e270: 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46  names[SQLITE_UTF
e280: 31 36 4c 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54  16LE].enc==SQLIT
e290: 45 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20 20 20  E_UTF16LE );.   
e2a0: 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61     assert( encna
e2b0: 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36  mes[SQLITE_UTF16
e2c0: 42 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  BE].enc==SQLITE_
e2d0: 55 54 46 31 36 42 45 20 29 3b 0a 20 20 20 20 20  UTF16BE );.     
e2e0: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
e2f0: 74 28 76 2c 20 65 6e 63 6e 61 6d 65 73 5b 45 4e  t(v, encnames[EN
e300: 43 28 70 50 61 72 73 65 2d 3e 64 62 29 5d 2e 7a  C(pParse->db)].z
e310: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
e320: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
e330: 20 20 20 20 20 20 20 20 20 2f 2a 20 22 50 52 41           /* "PRA
e340: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 58  GMA encoding = X
e350: 58 58 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  XX" */.      /* 
e360: 4f 6e 6c 79 20 63 68 61 6e 67 65 20 74 68 65 20  Only change the 
e370: 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 2e  value of sqlite.
e380: 65 6e 63 20 69 66 20 74 68 65 20 64 61 74 61 62  enc if the datab
e390: 61 73 65 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f  ase handle is no
e3a0: 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69  t.      ** initi
e3b0: 61 6c 69 7a 65 64 2e 20 49 66 20 74 68 65 20 6d  alized. If the m
e3c0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 78 69  ain database exi
e3d0: 73 74 73 2c 20 74 68 65 20 6e 65 77 20 73 71 6c  sts, the new sql
e3e0: 69 74 65 2e 65 6e 63 20 76 61 6c 75 65 0a 20 20  ite.enc value.  
e3f0: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6f      ** will be o
e400: 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 20  verwritten when 
e410: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 6e 65  the schema is ne
e420: 78 74 20 6c 6f 61 64 65 64 2e 20 49 66 20 69 74  xt loaded. If it
e430: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20   does not.      
e440: 2a 2a 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ** already exist
e450: 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 72  s, it will be cr
e460: 65 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65  eated to use the
e470: 20 6e 65 77 20 65 6e 63 6f 64 69 6e 67 20 76 61   new encoding va
e480: 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lue..      */.  
e490: 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 20      if( .       
e4a0: 20 21 28 44 62 48 61 73 50 72 6f 70 65 72 74 79   !(DbHasProperty
e4b0: 28 64 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  (db, 0, DB_Schem
e4c0: 61 4c 6f 61 64 65 64 29 29 20 7c 7c 20 0a 20 20  aLoaded)) || .  
e4d0: 20 20 20 20 20 20 44 62 48 61 73 50 72 6f 70 65        DbHasPrope
e4e0: 72 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 45 6d  rty(db, 0, DB_Em
e4f0: 70 74 79 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  pty) .      ){. 
e500: 20 20 20 20 20 20 20 66 6f 72 28 70 45 6e 63 3d         for(pEnc=
e510: 26 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20 70 45  &encnames[0]; pE
e520: 6e 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b  nc->zName; pEnc+
e530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
e540: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
e550: 43 6d 70 28 7a 52 69 67 68 74 2c 20 70 45 6e 63  Cmp(zRight, pEnc
e560: 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ->zName) ){.    
e570: 20 20 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45          SCHEMA_E
e580: 4e 43 28 64 62 29 20 3d 20 45 4e 43 28 64 62 29  NC(db) = ENC(db)
e590: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
e5a0: 20 20 20 70 45 6e 63 2d 3e 65 6e 63 20 3f 20 70     pEnc->enc ? p
e5b0: 45 6e 63 2d 3e 65 6e 63 20 3a 20 53 51 4c 49 54  Enc->enc : SQLIT
e5c0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
e5d0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
e5e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
e5f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e600: 69 66 28 20 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65  if( !pEnc->zName
e610: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
e620: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e630: 61 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72 74  arse, "unsupport
e640: 65 64 20 65 6e 63 6f 64 69 6e 67 3a 20 25 73 22  ed encoding: %s"
e650: 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , zRight);.     
e660: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e670: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
e680: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e690: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
e6a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e6b0: 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  MIT_SCHEMA_VERSI
e6c0: 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a  ON_PRAGMAS.  /*.
e6d0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
e6e0: 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65  chema.]schema_ve
e6f0: 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41  rsion.  **   PRA
e700: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68  GMA [schema.]sch
e710: 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69  ema_version = <i
e720: 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a  nteger>.  **.  *
e730: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
e740: 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e  ma.]user_version
e750: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
e760: 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72  schema.]user_ver
e770: 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e  sion = <integer>
e780: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  **.  **   PRA
e790: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 66 72 65  GMA [schema.]fre
e7a0: 65 6c 69 73 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a  elist_count.  **
e7b0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
e7c0: 73 63 68 65 6d 61 2e 5d 64 61 74 61 5f 76 65 72  schema.]data_ver
e7d0: 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  sion.  **.  **  
e7e0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
e7f0: 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 0a  ]application_id.
e800: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
e810: 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69  chema.]applicati
e820: 6f 6e 5f 69 64 20 3d 20 3c 69 6e 74 65 67 65 72  on_id = <integer
e830: 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  >.  **.  ** The 
e840: 70 72 61 67 6d 61 27 73 20 73 63 68 65 6d 61 5f  pragma's schema_
e850: 76 65 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72  version and user
e860: 5f 76 65 72 73 69 6f 6e 20 61 72 65 20 75 73 65  _version are use
e870: 64 20 74 6f 20 73 65 74 20 6f 72 20 67 65 74 0a  d to set or get.
e880: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
e890: 66 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72  f the schema-ver
e8a0: 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 2d 76 65  sion and user-ve
e8b0: 72 73 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76  rsion, respectiv
e8c0: 65 6c 79 2e 20 42 6f 74 68 0a 20 20 2a 2a 20 74  ely. Both.  ** t
e8d0: 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f  he schema-versio
e8e0: 6e 20 61 6e 64 20 74 68 65 20 75 73 65 72 2d 76  n and the user-v
e8f0: 65 72 73 69 6f 6e 20 61 72 65 20 33 32 2d 62 69  ersion are 32-bi
e900: 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
e910: 73 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  s.  ** stored in
e920: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65   the database he
e930: 61 64 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ader..  **.  ** 
e940: 54 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69  The schema-cooki
e950: 65 20 69 73 20 75 73 75 61 6c 6c 79 20 6f 6e 6c  e is usually onl
e960: 79 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 69 6e  y manipulated in
e970: 74 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69  ternally by SQLi
e980: 74 65 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 69  te. It.  ** is i
e990: 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 53 51  ncremented by SQ
e9a0: 4c 69 74 65 20 77 68 65 6e 65 76 65 72 20 74 68  Lite whenever th
e9b0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
e9c0: 61 20 69 73 20 6d 6f 64 69 66 69 65 64 20 28 62  a is modified (b
e9d0: 79 0a 20 20 2a 2a 20 63 72 65 61 74 69 6e 67 20  y.  ** creating 
e9e0: 6f 72 20 64 72 6f 70 70 69 6e 67 20 61 20 74 61  or dropping a ta
e9f0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 29 2e 20 54  ble or index). T
ea00: 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  he schema versio
ea10: 6e 20 69 73 20 75 73 65 64 20 62 79 0a 20 20 2a  n is used by.  *
ea20: 2a 20 53 51 4c 69 74 65 20 65 61 63 68 20 74 69  * SQLite each ti
ea30: 6d 65 20 61 20 71 75 65 72 79 20 69 73 20 65 78  me a query is ex
ea40: 65 63 75 74 65 64 20 74 6f 20 65 6e 73 75 72 65  ecuted to ensure
ea50: 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e   that the intern
ea60: 61 6c 20 63 61 63 68 65 0a 20 20 2a 2a 20 6f 66  al cache.  ** of
ea70: 20 74 68 65 20 73 63 68 65 6d 61 20 75 73 65 64   the schema used
ea80: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
ea90: 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 6d 61  the SQL query ma
eaa0: 74 63 68 65 73 20 74 68 65 20 73 63 68 65 6d 61  tches the schema
eab0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74   of.  ** the dat
eac0: 61 62 61 73 65 20 61 67 61 69 6e 73 74 20 77 68  abase against wh
ead0: 69 63 68 20 74 68 65 20 63 6f 6d 70 69 6c 65 64  ich the compiled
eae0: 20 71 75 65 72 79 20 69 73 20 61 63 74 75 61 6c   query is actual
eaf0: 6c 79 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  ly executed..  *
eb00: 2a 20 53 75 62 76 65 72 74 69 6e 67 20 74 68 69  * Subverting thi
eb10: 73 20 6d 65 63 68 61 6e 69 73 6d 20 62 79 20 75  s mechanism by u
eb20: 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73 63 68  sing "PRAGMA sch
eb30: 65 6d 61 5f 76 65 72 73 69 6f 6e 22 20 74 6f 20  ema_version" to 
eb40: 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20  modify.  ** the 
eb50: 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 69  schema-version i
eb60: 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 64 61  s potentially da
eb70: 6e 67 65 72 6f 75 73 20 61 6e 64 20 6d 61 79 20  ngerous and may 
eb80: 6c 65 61 64 20 74 6f 20 70 72 6f 67 72 61 6d 0a  lead to program.
eb90: 20 20 2a 2a 20 63 72 61 73 68 65 73 20 6f 72 20    ** crashes or 
eba0: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
ebb0: 69 6f 6e 2e 20 55 73 65 20 77 69 74 68 20 63 61  ion. Use with ca
ebc0: 75 74 69 6f 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a  ution!.  **.  **
ebd0: 20 54 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f   The user-versio
ebe0: 6e 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  n is not used in
ebf0: 74 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69  ternally by SQLi
ec00: 74 65 2e 20 49 74 20 6d 61 79 20 62 65 20 75 73  te. It may be us
ec10: 65 64 20 62 79 0a 20 20 2a 2a 20 61 70 70 6c 69  ed by.  ** appli
ec20: 63 61 74 69 6f 6e 73 20 66 6f 72 20 61 6e 79 20  cations for any 
ec30: 70 75 72 70 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20  purpose..  */.  
ec40: 63 61 73 65 20 50 72 61 67 54 79 70 5f 48 45 41  case PragTyp_HEA
ec50: 44 45 52 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20  DER_VALUE: {.   
ec60: 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 70   int iCookie = p
ec70: 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 2f  Pragma->iArg;  /
ec80: 2a 20 57 68 69 63 68 20 63 6f 6f 6b 69 65 20 74  * Which cookie t
ec90: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
eca0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
ecb0: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
ecc0: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69  Db);.    if( zRi
ecd0: 67 68 74 20 26 26 20 28 70 50 72 61 67 6d 61 2d  ght && (pPragma-
ece0: 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
ecf0: 46 6c 67 5f 52 65 61 64 4f 6e 6c 79 29 3d 3d 30  Flg_ReadOnly)==0
ed00: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72 69   ){.      /* Wri
ed10: 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
ed20: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f   cookie value */
ed30: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
ed40: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73  nst VdbeOpList s
ed50: 65 74 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20  etCookie[] = {. 
ed60: 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e         { OP_Tran
ed70: 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20  saction,    0,  
ed80: 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20  1,  0},    /* 0 
ed90: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
eda0: 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20  SetCookie,      
edb0: 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f  0,  0,  0},    /
edc0: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a  * 1 */.      };.
edd0: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f        VdbeOp *aO
ede0: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
edf0: 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c  VdbeVerifyNoMall
ee00: 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72  ocRequired(v, Ar
ee10: 72 61 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69  raySize(setCooki
ee20: 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d  e));.      aOp =
ee30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ee40: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
ee50: 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 2c 20 73  ze(setCookie), s
ee60: 65 74 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20  etCookie, 0);.  
ee70: 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f      if( ONLY_IF_
ee80: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61  REALLOC_STRESS(a
ee90: 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a  Op==0) ) break;.
eea0: 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20        aOp[0].p1 
eeb0: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70  = iDb;.      aOp
eec0: 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20  [1].p1 = iDb;.  
eed0: 20 20 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20      aOp[1].p2 = 
eee0: 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 61  iCookie;.      a
eef0: 4f 70 5b 31 5d 2e 70 33 20 3d 20 73 71 6c 69 74  Op[1].p3 = sqlit
ef00: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
ef10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ef20: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 70 65   /* Read the spe
ef30: 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61  cified cookie va
ef40: 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61  lue */.      sta
ef50: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70  tic const VdbeOp
ef60: 4c 69 73 74 20 72 65 61 64 43 6f 6f 6b 69 65 5b  List readCookie[
ef70: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
ef80: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
ef90: 20 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20      0,  0,  0}, 
efa0: 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20     /* 0 */.     
efb0: 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b     { OP_ReadCook
efc0: 69 65 2c 20 20 20 20 20 20 30 2c 20 20 31 2c 20  ie,      0,  1, 
efd0: 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a   0},    /* 1 */.
efe0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73          { OP_Res
eff0: 75 6c 74 52 6f 77 2c 20 20 20 20 20 20 20 31 2c  ultRow,       1,
f000: 20 20 31 2c 20 20 30 7d 0a 20 20 20 20 20 20 7d    1,  0}.      }
f010: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
f020: 61 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  aOp;.      sqlit
f030: 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61  e3VdbeVerifyNoMa
f040: 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20  llocRequired(v, 
f050: 41 72 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f  ArraySize(readCo
f060: 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f  okie));.      aO
f070: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
f080: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
f090: 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65  ySize(readCookie
f0a0: 29 2c 72 65 61 64 43 6f 6f 6b 69 65 2c 30 29 3b  ),readCookie,0);
f0b0: 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f  .      if( ONLY_
f0c0: 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  IF_REALLOC_STRES
f0d0: 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61  S(aOp==0) ) brea
f0e0: 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  k;.      aOp[0].
f0f0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
f100: 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[1].p1 = iDb;
f110: 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33  .      aOp[1].p3
f120: 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20   = iCookie;.    
f130: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75    sqlite3VdbeReu
f140: 73 61 62 6c 65 28 76 29 3b 0a 20 20 20 20 7d 0a  sable(v);.    }.
f150: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
f160: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
f170: 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  IT_SCHEMA_VERSIO
f180: 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  N_PRAGMAS */..#i
f190: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f1a0: 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f  T_COMPILEOPTION_
f1b0: 44 49 41 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20  DIAGS.  /*.  ** 
f1c0: 20 20 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c 65    PRAGMA compile
f1d0: 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20  _options.  **.  
f1e0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
f1f0: 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 69  mes of all compi
f200: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
f210: 75 73 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  used in this bui
f220: 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70 74  ld,.  ** one opt
f230: 69 6f 6e 20 70 65 72 20 72 6f 77 2e 0a 20 20 2a  ion per row..  *
f240: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
f250: 5f 43 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e 53  _COMPILE_OPTIONS
f260: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20  : {.    int i = 
f270: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
f280: 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 70 50 61  r *zOpt;.    pPa
f290: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20  rse->nMem = 1;. 
f2a0: 20 20 20 77 68 69 6c 65 28 20 28 7a 4f 70 74 20     while( (zOpt 
f2b0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c  = sqlite3_compil
f2c0: 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69 2b 2b 29  eoption_get(i++)
f2d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
f2e0: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
f2f0: 69 6e 67 28 76 2c 20 31 2c 20 7a 4f 70 74 29 3b  ing(v, 1, zOpt);
f300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f310: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
f320: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b  esultRow, 1, 1);
f330: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f340: 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28 76  e3VdbeReusable(v
f350: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
f360: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f370: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
f380: 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 23 69  ION_DIAGS */..#i
f390: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f3a0: 54 5f 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20  T_WAL.  /*.  ** 
f3b0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
f3c0: 2e 5d 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  .]wal_checkpoint
f3d0: 20 3d 20 70 61 73 73 69 76 65 7c 66 75 6c 6c 7c   = passive|full|
f3e0: 72 65 73 74 61 72 74 7c 74 72 75 6e 63 61 74 65  restart|truncate
f3f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63 6b  .  **.  ** Check
f400: 70 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62 61  point the databa
f410: 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
f420: 50 72 61 67 54 79 70 5f 57 41 4c 5f 43 48 45 43  PragTyp_WAL_CHEC
f430: 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 6e  KPOINT: {.    in
f440: 74 20 69 42 74 20 3d 20 28 70 49 64 32 2d 3e 7a  t iBt = (pId2->z
f450: 3f 69 44 62 3a 53 51 4c 49 54 45 5f 4d 41 58 5f  ?iDb:SQLITE_MAX_
f460: 41 54 54 41 43 48 45 44 29 3b 0a 20 20 20 20 69  ATTACHED);.    i
f470: 6e 74 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54  nt eMode = SQLIT
f480: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
f490: 53 49 56 45 3b 0a 20 20 20 20 69 66 28 20 7a 52  SIVE;.    if( zR
f4a0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66  ight ){.      if
f4b0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f4c0: 28 7a 52 69 67 68 74 2c 20 22 66 75 6c 6c 22 29  (zRight, "full")
f4d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
f4e0: 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48  Mode = SQLITE_CH
f4f0: 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20  ECKPOINT_FULL;. 
f500: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
f510: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52  qlite3StrICmp(zR
f520: 69 67 68 74 2c 20 22 72 65 73 74 61 72 74 22 29  ight, "restart")
f530: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
f540: 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48  Mode = SQLITE_CH
f550: 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
f560: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f570: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f580: 28 7a 52 69 67 68 74 2c 20 22 74 72 75 6e 63 61  (zRight, "trunca
f590: 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  te")==0 ){.     
f5a0: 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54     eMode = SQLIT
f5b0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55  E_CHECKPOINT_TRU
f5c0: 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  NCATE;.      }. 
f5d0: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
f5e0: 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 73  >nMem = 3;.    s
f5f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f600: 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  (v, OP_Checkpoin
f610: 74 2c 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31  t, iBt, eMode, 1
f620: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f630: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
f640: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b  esultRow, 1, 3);
f650: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20  .  }.  break;.. 
f660: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
f670: 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  A wal_autocheckp
f680: 6f 69 6e 74 0a 20 20 2a 2a 20 20 20 50 52 41 47  oint.  **   PRAG
f690: 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  MA wal_autocheck
f6a0: 70 6f 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20  point = N.  **. 
f6b0: 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 20   ** Configure a 
f6c0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f6d0: 69 6f 6e 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  ion to automatic
f6e0: 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 20  ally checkpoint 
f6f0: 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  a database.  ** 
f700: 61 66 74 65 72 20 61 63 63 75 6d 75 6c 61 74 69  after accumulati
f710: 6e 67 20 4e 20 66 72 61 6d 65 73 20 69 6e 20 74  ng N frames in t
f720: 68 65 20 6c 6f 67 2e 20 4f 72 20 71 75 65 72 79  he log. Or query
f730: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
f740: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 4e   value.  ** of N
f750: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
f760: 61 67 54 79 70 5f 57 41 4c 5f 41 55 54 4f 43 48  agTyp_WAL_AUTOCH
f770: 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20  ECKPOINT: {.    
f780: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
f790: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
f7a0: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64  autocheckpoint(d
f7b0: 62 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a  b, sqlite3Atoi(z
f7c0: 52 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20  Right));.    }. 
f7d0: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
f7e0: 6e 74 28 76 2c 20 0a 20 20 20 20 20 20 20 64 62  nt(v, .       db
f7f0: 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d  ->xWalCallback==
f800: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
f810: 74 48 6f 6f 6b 20 3f 20 0a 20 20 20 20 20 20 20  tHook ? .       
f820: 20 20 20 20 53 51 4c 49 54 45 5f 50 54 52 5f 54      SQLITE_PTR_T
f830: 4f 5f 49 4e 54 28 64 62 2d 3e 70 57 61 6c 41 72  O_INT(db->pWalAr
f840: 67 29 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 62  g) : 0);.  }.  b
f850: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  reak;.#endif..  
f860: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
f870: 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20  shrink_memory.  
f880: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
f890: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34  TATION-OF: R-234
f8a0: 34 35 2d 34 36 31 30 39 20 54 68 69 73 20 70 72  45-46109 This pr
f8b0: 61 67 6d 61 20 63 61 75 73 65 73 20 74 68 65 20  agma causes the 
f8c0: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f  database.  ** co
f8d0: 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 77 68 69 63  nnection on whic
f8e0: 68 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  h it is invoked 
f8f0: 74 6f 20 66 72 65 65 20 75 70 20 61 73 20 6d 75  to free up as mu
f900: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 69 74 0a  ch memory as it.
f910: 20 20 2a 2a 20 63 61 6e 2c 20 62 79 20 63 61 6c    ** can, by cal
f920: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 62 5f  ling sqlite3_db_
f930: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29  release_memory()
f940: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
f950: 61 67 54 79 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d  agTyp_SHRINK_MEM
f960: 4f 52 59 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  ORY: {.    sqlit
f970: 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
f980: 6d 6f 72 79 28 64 62 29 3b 0a 20 20 20 20 62 72  mory(db);.    br
f990: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
f9a0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70 74 69   **  PRAGMA opti
f9b0: 6d 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d  mize.  **  PRAGM
f9c0: 41 20 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29  A optimize(MASK)
f9d0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 63  .  **  PRAGMA sc
f9e0: 68 65 6d 61 2e 6f 70 74 69 6d 69 7a 65 0a 20 20  hema.optimize.  
f9f0: 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d  **  PRAGMA schem
fa00: 61 2e 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29  a.optimize(MASK)
fa10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 74 65 6d  .  **.  ** Attem
fa20: 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74  pt to optimize t
fa30: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 6c  he database.  Al
fa40: 6c 20 73 63 68 65 6d 61 73 20 61 72 65 20 6f 70  l schemas are op
fa50: 74 69 6d 69 7a 65 64 20 69 6e 20 74 68 65 20 66  timized in the f
fa60: 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 66 6f  irst.  ** two fo
fa70: 72 6d 73 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  rms, and only th
fa80: 65 20 73 70 65 63 69 66 69 65 64 20 73 63 68 65  e specified sche
fa90: 6d 61 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  ma is optimized 
faa0: 69 6e 20 74 68 65 20 6c 61 74 74 65 72 20 74 77  in the latter tw
fab0: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  o..  **.  ** The
fac0: 20 64 65 74 61 69 6c 73 20 6f 66 20 6f 70 74 69   details of opti
fad0: 6d 69 7a 61 74 69 6f 6e 73 20 70 65 72 66 6f 72  mizations perfor
fae0: 6d 65 64 20 62 79 20 74 68 69 73 20 70 72 61 67  med by this prag
faf0: 6d 61 20 61 72 65 20 65 78 70 65 63 74 65 64 0a  ma are expected.
fb00: 20 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 61    ** to change a
fb10: 6e 64 20 69 6d 70 72 6f 76 65 20 6f 76 65 72 20  nd improve over 
fb20: 74 69 6d 65 2e 20 20 41 70 70 6c 69 63 61 74 69  time.  Applicati
fb30: 6f 6e 73 20 73 68 6f 75 6c 64 20 61 6e 74 69 63  ons should antic
fb40: 69 70 61 74 65 20 74 68 61 74 0a 20 20 2a 2a 20  ipate that.  ** 
fb50: 74 68 69 73 20 70 72 61 67 6d 61 20 77 69 6c 6c  this pragma will
fb60: 20 70 65 72 66 6f 72 6d 20 6e 65 77 20 6f 70 74   perform new opt
fb70: 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 66 75  imizations in fu
fb80: 74 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20  ture releases.. 
fb90: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 70 74   **.  ** The opt
fba0: 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 69  ional argument i
fbb0: 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f  s a bitmask of o
fbc0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20  ptimizations to 
fbd0: 70 65 72 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  perform:.  **.  
fbe0: 2a 2a 20 20 20 20 30 78 30 30 30 31 20 20 20 20  **    0x0001    
fbf0: 44 65 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20  Debugging mode. 
fc00: 20 44 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   Do not actually
fc10: 20 70 65 72 66 6f 72 6d 20 61 6e 79 20 6f 70 74   perform any opt
fc20: 69 6d 69 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a 20  imizations.  ** 
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
fc40: 20 69 6e 73 74 65 61 64 20 72 65 74 75 72 6e 20   instead return 
fc50: 6f 6e 65 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  one line of text
fc60: 20 66 6f 72 20 65 61 63 68 20 6f 70 74 69 6d 69   for each optimi
fc70: 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20  zation.  **     
fc80: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 77 6f           that wo
fc90: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 64 6f  uld have been do
fca0: 6e 65 2e 20 20 4f 66 66 20 62 79 20 64 65 66 61  ne.  Off by defa
fcb0: 75 6c 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ult..  **.  **  
fcc0: 20 20 30 78 30 30 30 32 20 20 20 20 52 75 6e 20    0x0002    Run 
fcd0: 41 4e 41 4c 59 5a 45 20 6f 6e 20 74 61 62 6c 65  ANALYZE on table
fce0: 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 6e  s that might ben
fcf0: 65 66 69 74 2e 20 20 4f 6e 20 62 79 20 64 65 66  efit.  On by def
fd00: 61 75 6c 74 2e 0a 20 20 2a 2a 20 20 20 20 20 20  ault..  **      
fd10: 20 20 20 20 20 20 20 20 53 65 65 20 62 65 6c 6f          See belo
fd20: 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  w for additional
fd30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
fd40: 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30  **.  **    0x000
fd50: 34 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d  4    (Not yet im
fd60: 70 6c 65 6d 65 6e 74 65 64 29 20 52 65 63 6f 72  plemented) Recor
fd70: 64 20 75 73 61 67 65 20 61 6e 64 20 70 65 72 66  d usage and perf
fd80: 6f 72 6d 61 6e 63 65 20 0a 20 20 2a 2a 20 20 20  ormance .  **   
fd90: 20 20 20 20 20 20 20 20 20 20 20 69 6e 66 6f 72             infor
fda0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
fdb0: 63 75 72 72 65 6e 74 20 73 65 73 73 69 6f 6e 20  current session 
fdc0: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  in the.  **     
fdd0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
fde0: 65 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  e file so that i
fdf0: 74 20 77 69 6c 6c 20 62 65 20 61 76 61 69 6c 61  t will be availa
fe00: 62 6c 65 20 74 6f 20 22 6f 70 74 69 6d 69 7a 65  ble to "optimize
fe10: 22 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  ".  **          
fe20: 20 20 20 20 70 72 61 67 6d 61 73 20 72 75 6e 20      pragmas run 
fe30: 62 79 20 66 75 74 75 72 65 20 64 61 74 61 62 61  by future databa
fe40: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  se connections..
fe50: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30    **.  **    0x0
fe60: 30 30 38 20 20 20 20 28 4e 6f 74 20 79 65 74 20  008    (Not yet 
fe70: 69 6d 70 6c 65 6d 65 6e 74 65 64 29 20 43 72 65  implemented) Cre
fe80: 61 74 65 20 69 6e 64 65 78 65 73 20 74 68 61 74  ate indexes that
fe90: 20 6d 69 67 68 74 20 68 61 76 65 0a 20 20 2a 2a   might have.  **
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
feb0: 65 6e 20 68 65 6c 70 66 75 6c 20 74 6f 20 72 65  en helpful to re
fec0: 63 65 6e 74 20 71 75 65 72 69 65 73 0a 20 20 2a  cent queries.  *
fed0: 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75  *.  ** The defau
fee0: 6c 74 20 4d 41 53 4b 20 69 73 20 61 6e 64 20 61  lt MASK is and a
fef0: 6c 77 61 79 73 20 73 68 61 6c 6c 20 62 65 20 30  lways shall be 0
ff00: 78 66 66 66 65 2e 20 20 30 78 66 66 66 65 20 6d  xfffe.  0xfffe m
ff10: 65 61 6e 73 20 70 65 72 66 6f 72 6d 20 61 6c 6c  eans perform all
ff20: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70      ** of the op
ff30: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 73 74  timizations list
ff40: 65 64 20 61 62 6f 76 65 20 65 78 63 65 70 74 20  ed above except 
ff50: 44 65 62 75 67 20 4d 6f 64 65 2c 20 69 6e 63 6c  Debug Mode, incl
ff60: 75 64 69 6e 67 20 6e 65 77 0a 20 20 2a 2a 20 6f  uding new.  ** o
ff70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 68 61  ptimizations tha
ff80: 74 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  t have not yet b
ff90: 65 65 6e 20 69 6e 76 65 6e 74 65 64 2e 20 20 49  een invented.  I
ffa0: 66 20 6e 65 77 20 6f 70 74 69 6d 69 7a 61 74 69  f new optimizati
ffb0: 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20 65 76 65  ons are.  ** eve
ffc0: 72 20 61 64 64 65 64 20 74 68 61 74 20 73 68 6f  r added that sho
ffd0: 75 6c 64 20 62 65 20 6f 66 66 20 62 79 20 64 65  uld be off by de
ffe0: 66 61 75 6c 74 2c 20 74 68 6f 73 65 20 6f 66 66  fault, those off
fff0: 2d 62 79 2d 64 65 66 61 75 6c 74 20 0a 20 20 2a  -by-default .  *
10000 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  * optimizations 
10010 77 69 6c 6c 20 68 61 76 65 20 62 69 74 6d 61 73  will have bitmas
10020 6b 73 20 6f 66 20 30 78 31 30 30 30 30 20 6f 72  ks of 0x10000 or
10030 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 0a 20 20   larger..  **.  
10040 2a 2a 20 44 45 54 45 52 4d 49 4e 41 54 49 4f 4e  ** DETERMINATION
10050 20 4f 46 20 57 48 45 4e 20 54 4f 20 52 55 4e 20   OF WHEN TO RUN 
10060 41 4e 41 4c 59 5a 45 0a 20 20 2a 2a 0a 20 20 2a  ANALYZE.  **.  *
10070 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
10080 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
10090 20 61 20 74 61 62 6c 65 20 69 73 20 61 6e 61 6c   a table is anal
100a0 79 7a 65 64 20 69 66 20 6f 6e 6c 79 20 69 66 20  yzed if only if 
100b0 61 6c 6c 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  all of.  ** the 
100c0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
100d0 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31  ue:.  **.  ** (1
100e0 29 20 4d 41 53 4b 20 62 69 74 20 30 78 30 32 20  ) MASK bit 0x02 
100f0 69 73 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  is set..  **.  *
10100 2a 20 28 32 29 20 54 68 65 20 71 75 65 72 79 20  * (2) The query 
10110 70 6c 61 6e 6e 65 72 20 75 73 65 64 20 73 71 6c  planner used sql
10120 69 74 65 5f 73 74 61 74 31 2d 73 74 79 6c 65 20  ite_stat1-style 
10130 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 6f  statistics for o
10140 6e 65 20 6f 72 0a 20 20 2a 2a 20 20 20 20 20 6d  ne or.  **     m
10150 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74  ore indexes of t
10160 68 65 20 74 61 62 6c 65 20 61 74 20 73 6f 6d 65  he table at some
10170 20 70 6f 69 6e 74 20 64 75 72 69 6e 67 20 74 68   point during th
10180 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 20 20  e lifetime of.  
10190 2a 2a 20 20 20 20 20 74 68 65 20 63 75 72 72 65  **     the curre
101a0 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  nt connection.. 
101b0 20 2a 2a 0a 20 20 2a 2a 20 28 33 29 20 4f 6e 65   **.  ** (3) One
101c0 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73   or more indexes
101d0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72   of the table ar
101e0 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 61 6e  e currently unan
101f0 61 6c 79 7a 65 64 20 4f 52 0a 20 20 2a 2a 20 20  alyzed OR.  **  
10200 20 20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66     the number of
10210 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
10220 6c 65 20 68 61 73 20 69 6e 63 72 65 61 73 65 64  le has increased
10230 20 62 79 20 32 35 20 74 69 6d 65 73 20 6f 72 20   by 25 times or 
10240 6d 6f 72 65 0a 20 20 2a 2a 20 20 20 20 20 73 69  more.  **     si
10250 6e 63 65 20 74 68 65 20 6c 61 73 74 20 74 69 6d  nce the last tim
10260 65 20 41 4e 41 4c 59 5a 45 20 77 61 73 20 72 75  e ANALYZE was ru
10270 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n..  **.  ** The
10280 20 72 75 6c 65 73 20 66 6f 72 20 77 68 65 6e 20   rules for when 
10290 74 61 62 6c 65 73 20 61 72 65 20 61 6e 61 6c 79  tables are analy
102a0 7a 65 64 20 61 72 65 20 6c 69 6b 65 6c 79 20 74  zed are likely t
102b0 6f 20 63 68 61 6e 67 65 20 69 6e 0a 20 20 2a 2a  o change in.  **
102c0 20 66 75 74 75 72 65 20 72 65 6c 65 61 73 65 73   future releases
102d0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
102e0 61 67 54 79 70 5f 4f 50 54 49 4d 49 5a 45 3a 20  agTyp_OPTIMIZE: 
102f0 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 4c 61 73  {.    int iDbLas
10300 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
10310 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  Loop termination
10320 20 70 6f 69 6e 74 20 66 6f 72 20 74 68 65 20 73   point for the s
10330 63 68 65 6d 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20  chema loop */.  
10340 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20    int iTabCur;  
10350 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
10360 6f 72 20 66 6f 72 20 61 20 74 61 62 6c 65 20 77  or for a table w
10370 68 6f 73 65 20 73 69 7a 65 20 6e 65 65 64 73 20  hose size needs 
10380 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20  checking */.    
10390 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
103a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f         /* Loop o
103b0 76 65 72 20 74 61 62 6c 65 73 20 6f 66 20 61 20  ver tables of a 
103c0 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 53 63  schema */.    Sc
103d0 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 3b 20 20  hema *pSchema;  
103e0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72       /* The curr
103f0 65 6e 74 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  ent schema */.  
10400 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
10410 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
10420 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d  ble in the schem
10430 61 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  a */.    Index *
10440 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
10450 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 66 20 74  /* An index of t
10460 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
10470 4c 6f 67 45 73 74 20 73 7a 54 68 72 65 73 68 6f  LogEst szThresho
10480 6c 64 3b 20 20 20 20 2f 2a 20 53 69 7a 65 20 74  ld;    /* Size t
10490 68 72 65 73 68 6f 6c 64 20 61 62 6f 76 65 20 77  hreshold above w
104a0 68 69 63 68 20 72 65 61 6e 61 6c 79 73 69 73 20  hich reanalysis 
104b0 69 73 20 6e 65 65 64 64 20 2a 2f 0a 20 20 20 20  is needd */.    
104c0 63 68 61 72 20 2a 7a 53 75 62 53 71 6c 3b 20 20  char *zSubSql;  
104d0 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
104e0 61 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 65 20  atement for the 
104f0 4f 50 5f 53 71 6c 45 78 65 63 20 6f 70 63 6f 64  OP_SqlExec opcod
10500 65 20 2a 2f 0a 20 20 20 20 75 33 32 20 6f 70 4d  e */.    u32 opM
10510 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
10520 2f 2a 20 4d 61 73 6b 20 6f 66 20 6f 70 65 72 61  /* Mask of opera
10530 74 69 6f 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d  tions to perform
10540 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52 69   */..    if( zRi
10550 67 68 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 4d  ght ){.      opM
10560 61 73 6b 20 3d 20 28 75 33 32 29 73 71 6c 69 74  ask = (u32)sqlit
10570 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
10580 20 20 20 20 20 20 69 66 28 20 28 6f 70 4d 61 73        if( (opMas
10590 6b 20 26 20 30 78 30 32 29 3d 3d 30 20 29 20 62  k & 0x02)==0 ) b
105a0 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
105b0 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  .      opMask = 
105c0 30 78 66 66 66 65 3b 0a 20 20 20 20 7d 0a 20 20  0xfffe;.    }.  
105d0 20 20 69 54 61 62 43 75 72 20 3d 20 70 50 61 72    iTabCur = pPar
105e0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
105f0 66 6f 72 28 69 44 62 4c 61 73 74 20 3d 20 7a 44  for(iDbLast = zD
10600 62 3f 69 44 62 3a 64 62 2d 3e 6e 44 62 2d 31 3b  b?iDb:db->nDb-1;
10610 20 69 44 62 3c 3d 69 44 62 4c 61 73 74 3b 20 69   iDb<=iDbLast; i
10620 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Db++){.      if(
10630 20 69 44 62 3d 3d 31 20 29 20 63 6f 6e 74 69 6e   iDb==1 ) contin
10640 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ue;.      sqlite
10650 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
10660 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
10670 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20        pSchema = 
10680 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
10690 68 65 6d 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  hema;.      for(
106a0 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
106b0 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
106c0 61 73 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74  ash); k; k=sqlit
106d0 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
106e0 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54         pTab = (T
106f0 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
10700 44 61 74 61 28 6b 29 3b 0a 0a 20 20 20 20 20 20  Data(k);..      
10710 20 20 2f 2a 20 49 66 20 74 61 62 6c 65 20 70 54    /* If table pT
10720 61 62 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ab has not been 
10730 75 73 65 64 20 69 6e 20 61 20 77 61 79 20 74 68  used in a way th
10740 61 74 20 77 6f 75 6c 64 20 62 65 6e 65 66 69 74  at would benefit
10750 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
10760 20 68 61 76 69 6e 67 20 61 6e 61 6c 79 73 69 73   having analysis
10770 20 73 74 61 74 69 73 74 69 63 73 20 64 75 72 69   statistics duri
10780 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
10790 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 6b 69  ession, then ski
107a0 70 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  p it..        **
107b0 20 54 68 69 73 20 61 6c 73 6f 20 68 61 73 20 74   This also has t
107c0 68 65 20 65 66 66 65 63 74 20 6f 66 20 73 6b 69  he effect of ski
107d0 70 70 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61  pping virtual ta
107e0 62 6c 65 73 20 61 6e 64 20 76 69 65 77 73 20 2a  bles and views *
107f0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  /.        if( (p
10800 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
10810 54 46 5f 53 74 61 74 73 55 73 65 64 29 3d 3d 30  TF_StatsUsed)==0
10820 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
10830 20 20 20 20 20 20 2f 2a 20 52 65 61 6e 61 6c 79        /* Reanaly
10840 7a 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ze if the table 
10850 69 73 20 32 35 20 74 69 6d 65 73 20 6c 61 72 67  is 25 times larg
10860 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 73 74  er than the last
10870 20 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20   analysis */.   
10880 20 20 20 20 20 73 7a 54 68 72 65 73 68 6f 6c 64       szThreshold
10890 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
108a0 45 73 74 20 2b 20 34 36 3b 20 61 73 73 65 72 74  Est + 46; assert
108b0 28 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ( sqlite3LogEst(
108c0 32 35 29 3d 3d 34 36 20 29 3b 0a 20 20 20 20 20  25)==46 );.     
108d0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
108e0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
108f0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
10900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
10910 20 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31   !pIdx->hasStat1
10920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
10930 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 30 3b  szThreshold = 0;
10940 20 2f 2a 20 41 6c 77 61 79 73 20 61 6e 61 6c 79   /* Always analy
10950 7a 65 20 69 66 20 61 6e 79 20 69 6e 64 65 78 20  ze if any index 
10960 6c 61 63 6b 73 20 73 74 61 74 69 73 74 69 63 73  lacks statistics
10970 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
10980 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
10990 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
109a0 20 20 20 20 20 69 66 28 20 73 7a 54 68 72 65 73       if( szThres
109b0 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  hold ){.        
109c0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
109d0 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 43  le(pParse, iTabC
109e0 75 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ur, iDb, pTab, O
109f0 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
10a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10a10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
10a20 66 53 6d 61 6c 6c 65 72 2c 20 69 54 61 62 43 75  fSmaller, iTabCu
10a30 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10a50 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10a60 64 64 72 28 76 29 2b 32 2b 28 6f 70 4d 61 73 6b  ddr(v)+2+(opMask
10a70 26 31 29 2c 20 73 7a 54 68 72 65 73 68 6f 6c 64  &1), szThreshold
10a80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
10a90 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
10aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10ab0 7a 53 75 62 53 71 6c 20 3d 20 73 71 6c 69 74 65  zSubSql = sqlite
10ac0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 41 4e  3MPrintf(db, "AN
10ad0 41 4c 59 5a 45 20 5c 22 25 77 5c 22 2e 5c 22 25  ALYZE \"%w\".\"%
10ae0 77 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  w\"",.          
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b00 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
10b10 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 70 54  Db].zDbSName, pT
10b20 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
10b30 20 20 20 20 69 66 28 20 6f 70 4d 61 73 6b 20 26      if( opMask &
10b40 20 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20   0x01 ){.       
10b50 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
10b60 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
10b70 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
10b80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10b90 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
10ba0 2c 20 30 2c 20 72 31 2c 20 30 2c 20 7a 53 75 62  , 0, r1, 0, zSub
10bb0 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Sql, P4_DYNAMIC)
10bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10bd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10be0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
10bf0 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  1, 1);.        }
10c00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10c10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10c20 34 28 76 2c 20 4f 50 5f 53 71 6c 45 78 65 63 2c  4(v, OP_SqlExec,
10c30 20 30 2c 20 30 2c 20 30 2c 20 7a 53 75 62 53 71   0, 0, 0, zSubSq
10c40 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  l, P4_DYNAMIC);.
10c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10c60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
10c70 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
10c80 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20   OP_Expire);.   
10c90 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
10ca0 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
10cb0 62 75 73 79 5f 74 69 6d 65 6f 75 74 0a 20 20 2a  busy_timeout.  *
10cc0 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f  *   PRAGMA busy_
10cd0 74 69 6d 65 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a  timeout = N.  **
10ce0 0a 20 20 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  .  ** Call sqlit
10cf0 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
10d00 64 62 2c 20 4e 29 2e 20 20 52 65 74 75 72 6e 20  db, N).  Return 
10d10 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
10d20 6f 75 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69  out value.  ** i
10d30 66 20 6f 6e 65 20 69 73 20 73 65 74 2e 20 20 49  f one is set.  I
10d40 66 20 6e 6f 20 62 75 73 79 20 68 61 6e 64 6c 65  f no busy handle
10d50 72 20 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74  r or a different
10d60 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 69 73   busy handler is
10d70 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 6e 20 30   set.  ** then 0
10d80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 53   is returned.  S
10d90 65 74 74 69 6e 67 20 74 68 65 20 62 75 73 79 5f  etting the busy_
10da0 74 69 6d 65 6f 75 74 20 74 6f 20 30 20 6f 72 20  timeout to 0 or 
10db0 6e 65 67 61 74 69 76 65 0a 20 20 2a 2a 20 64 69  negative.  ** di
10dc0 73 61 62 6c 65 73 20 74 68 65 20 74 69 6d 65 6f  sables the timeo
10dd0 75 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61 73  ut..  */.  /*cas
10de0 65 20 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54  e PragTyp_BUSY_T
10df0 49 4d 45 4f 55 54 2a 2f 20 64 65 66 61 75 6c 74  IMEOUT*/ default
10e00 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  : {.    assert( 
10e10 70 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79  pPragma->ePragTy
10e20 70 3d 3d 50 72 61 67 54 79 70 5f 42 55 53 59 5f  p==PragTyp_BUSY_
10e30 54 49 4d 45 4f 55 54 20 29 3b 0a 20 20 20 20 69  TIMEOUT );.    i
10e40 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
10e50 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
10e60 74 69 6d 65 6f 75 74 28 64 62 2c 20 73 71 6c 69  timeout(db, sqli
10e70 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29  te3Atoi(zRight))
10e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
10e90 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64  rnSingleInt(v, d
10ea0 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 29 3b  b->busyTimeout);
10eb0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
10ec0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
10ed0 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69  GMA soft_heap_li
10ee0 6d 69 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  mit.  **   PRAGM
10ef0 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  A soft_heap_limi
10f00 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t = N.  **.  ** 
10f10 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
10f20 46 3a 20 52 2d 32 36 33 34 33 2d 34 35 39 33 30  F: R-26343-45930
10f30 20 54 68 69 73 20 70 72 61 67 6d 61 20 69 6e 76   This pragma inv
10f40 6f 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 71  okes the.  ** sq
10f50 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
10f60 6c 69 6d 69 74 36 34 28 29 20 69 6e 74 65 72 66  limit64() interf
10f70 61 63 65 20 77 69 74 68 20 74 68 65 20 61 72 67  ace with the arg
10f80 75 6d 65 6e 74 20 4e 2c 20 69 66 20 4e 20 69 73  ument N, if N is
10f90 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
10fa0 61 6e 64 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67  and is a non-neg
10fb0 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20  ative integer.. 
10fc0 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
10fd0 4f 4e 2d 4f 46 3a 20 52 2d 36 34 34 35 31 2d 30  ON-OF: R-64451-0
10fe0 37 31 36 33 20 54 68 65 20 73 6f 66 74 5f 68 65  7163 The soft_he
10ff0 61 70 5f 6c 69 6d 69 74 20 70 72 61 67 6d 61 20  ap_limit pragma 
11000 61 6c 77 61 79 73 0a 20 20 2a 2a 20 72 65 74 75  always.  ** retu
11010 72 6e 73 20 74 68 65 20 73 61 6d 65 20 69 6e 74  rns the same int
11020 65 67 65 72 20 74 68 61 74 20 77 6f 75 6c 64 20  eger that would 
11030 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
11040 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  he.  ** sqlite3_
11050 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
11060 34 28 2d 31 29 20 43 2d 6c 61 6e 67 75 61 67 65  4(-1) C-language
11070 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
11080 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53    case PragTyp_S
11090 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 3a 20  OFT_HEAP_LIMIT: 
110a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
110b0 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a  t64 N;.    if( z
110c0 52 69 67 68 74 20 26 26 20 73 71 6c 69 74 65 33  Right && sqlite3
110d0 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52  DecOrHexToI64(zR
110e0 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54  ight, &N)==SQLIT
110f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
11100 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
11110 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 20 20  limit64(N);.    
11120 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
11130 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33  leInt(v, sqlite3
11140 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
11150 36 34 28 2d 31 29 29 3b 0a 20 20 20 20 62 72 65  64(-1));.    bre
11160 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
11170 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72 65  **   PRAGMA thre
11180 61 64 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ads.  **   PRAGM
11190 41 20 74 68 72 65 61 64 73 20 3d 20 4e 0a 20 20  A threads = N.  
111a0 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72  **.  ** Configur
111b0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
111c0 6d 62 65 72 20 6f 66 20 77 6f 72 6b 65 72 20 74  mber of worker t
111d0 68 72 65 61 64 73 2e 20 20 52 65 74 75 72 6e 20  hreads.  Return 
111e0 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78  the new.  ** max
111f0 69 6d 75 6d 2c 20 77 68 69 63 68 20 6d 69 67 68  imum, which migh
11200 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 72  t be less than r
11210 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
11220 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 54 48   case PragTyp_TH
11230 52 45 41 44 53 3a 20 7b 0a 20 20 20 20 73 71 6c  READS: {.    sql
11240 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20  ite3_int64 N;.  
11250 20 20 69 66 28 20 7a 52 69 67 68 74 0a 20 20 20    if( zRight.   
11260 20 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f    && sqlite3DecO
11270 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74  rHexToI64(zRight
11280 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &N)==SQLITE_OK
11290 0a 20 20 20 20 20 26 26 20 4e 3e 3d 30 0a 20 20  .     && N>=0.  
112a0 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
112b0 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c  e3_limit(db, SQL
112c0 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
112d0 5f 54 48 52 45 41 44 53 2c 20 28 69 6e 74 29 28  _THREADS, (int)(
112e0 4e 26 30 78 37 66 66 66 66 66 66 66 29 29 3b 0a  N&0x7fffffff));.
112f0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
11300 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c  SingleInt(v, sql
11310 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53  ite3_limit(db, S
11320 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
11330 45 52 5f 54 48 52 45 41 44 53 2c 20 2d 31 29 29  ER_THREADS, -1))
11340 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
11350 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
11360 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
11370 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
11380 53 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65  ST).  /*.  ** Re
11390 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74  port the current
113a0 20 73 74 61 74 65 20 6f 66 20 66 69 6c 65 20 6c   state of file l
113b0 6f 67 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  ogs for all data
113c0 62 61 73 65 73 0a 20 20 2a 2f 0a 20 20 63 61 73  bases.  */.  cas
113d0 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 53  e PragTyp_LOCK_S
113e0 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 73 74 61  TATUS: {.    sta
113f0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
11400 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65  const azLockName
11410 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e  [] = {.      "un
11420 6c 6f 63 6b 65 64 22 2c 20 22 73 68 61 72 65 64  locked", "shared
11430 22 2c 20 22 72 65 73 65 72 76 65 64 22 2c 20 22  ", "reserved", "
11440 70 65 6e 64 69 6e 67 22 2c 20 22 65 78 63 6c 75  pending", "exclu
11450 73 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20  sive".    };.   
11460 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72   int i;.    pPar
11470 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20  se->nMem = 2;.  
11480 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
11490 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
114a0 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
114b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
114c0 7a 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e 6f 77  zState = "unknow
114d0 6e 22 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  n";.      int j;
114e0 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
114f0 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d  Db[i].zDbSName==
11500 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
11510 20 20 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44      pBt = db->aD
11520 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
11530 69 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71  if( pBt==0 || sq
11540 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
11550 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pBt)==0 ){.     
11560 20 20 20 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f     zState = "clo
11570 73 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  sed";.      }els
11580 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69  e if( sqlite3_fi
11590 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69  le_control(db, i
115a0 20 3f 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44   ? db->aDb[i].zD
115b0 62 53 4e 61 6d 65 20 3a 20 30 2c 20 0a 20 20 20  bSName : 0, .   
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115e0 20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c    SQLITE_FCNTL_L
115f0 4f 43 4b 53 54 41 54 45 2c 20 26 6a 29 3d 3d 53  OCKSTATE, &j)==S
11600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11610 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20 61 7a       zState = az
11620 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20  LockName[j];.   
11630 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
11640 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
11650 76 2c 20 31 2c 20 22 73 73 22 2c 20 64 62 2d 3e  v, 1, "ss", db->
11660 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c  aDb[i].zDbSName,
11670 20 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20   zState);.      
11680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11690 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
116a0 77 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a  w, 1, 2);.    }.
116b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
116c0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
116d0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
116e0 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4b 45   case PragTyp_KE
116f0 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  Y: {.    if( zRi
11700 67 68 74 20 29 20 73 71 6c 69 74 65 33 5f 6b 65  ght ) sqlite3_ke
11710 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52  y_v2(db, zDb, zR
11720 69 67 68 74 2c 20 73 71 6c 69 74 65 33 53 74 72  ight, sqlite3Str
11730 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 29 3b 0a  len30(zRight));.
11740 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
11750 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 52 45   case PragTyp_RE
11760 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a  KEY: {.    if( z
11770 52 69 67 68 74 20 29 20 73 71 6c 69 74 65 33 5f  Right ) sqlite3_
11780 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62  rekey_v2(db, zDb
11790 2c 20 7a 52 69 67 68 74 2c 20 73 71 6c 69 74 65  , zRight, sqlite
117a0 33 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74  3Strlen30(zRight
117b0 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
117c0 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54 79   }.  case PragTy
117d0 70 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20 20 20  p_HEXKEY: {.    
117e0 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
117f0 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20      u8 iByte;.  
11800 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
11810 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a   char zKey[40];.
11820 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69        for(i=0, i
11830 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  Byte=0; i<sizeof
11840 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c 69  (zKey)*2 && sqli
11850 74 65 33 49 73 78 64 69 67 69 74 28 7a 52 69 67  te3Isxdigit(zRig
11860 68 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ht[i]); i++){.  
11870 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69        iByte = (i
11880 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74  Byte<<4) + sqlit
11890 65 33 48 65 78 54 6f 49 6e 74 28 7a 52 69 67 68  e3HexToInt(zRigh
118a0 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t[i]);.        i
118b0 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 4b  f( (i&1)!=0 ) zK
118c0 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b  ey[i/2] = iByte;
118d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
118e0 66 28 20 28 7a 4c 65 66 74 5b 33 5d 20 26 20 30  f( (zLeft[3] & 0
118f0 78 66 29 3d 3d 30 78 62 20 29 7b 0a 20 20 20 20  xf)==0xb ){.    
11900 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f      sqlite3_key_
11910 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79  v2(db, zDb, zKey
11920 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d 65  , i/2);.      }e
11930 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
11940 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28 64 62  ite3_rekey_v2(db
11950 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32  , zDb, zKey, i/2
11960 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11970 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11980 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
11990 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
119a0 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  DEC) || defined(
119b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45  SQLITE_ENABLE_CE
119c0 52 4f 44 29 0a 20 20 63 61 73 65 20 50 72 61 67  ROD).  case Prag
119d0 54 79 70 5f 41 43 54 49 56 41 54 45 5f 45 58 54  Typ_ACTIVATE_EXT
119e0 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20 7a 52 69  ENSIONS: if( zRi
119f0 67 68 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ght ){.#ifdef SQ
11a00 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
11a10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
11a20 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22  rNICmp(zRight, "
11a30 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29 7b 0a  see-", 4)==0 ){.
11a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61 63        sqlite3_ac
11a50 74 69 76 61 74 65 5f 73 65 65 28 26 7a 52 69 67  tivate_see(&zRig
11a60 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  ht[4]);.    }.#e
11a70 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
11a80 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 0a  TE_ENABLE_CEROD.
11a90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
11aa0 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  trNICmp(zRight, 
11ab0 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d 30 20  "cerod-", 6)==0 
11ac0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11ad0 5f 61 63 74 69 76 61 74 65 5f 63 65 72 6f 64 28  _activate_cerod(
11ae0 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20 20 20  &zRight[6]);.   
11af0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
11b00 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20  break;.#endif.. 
11b10 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65   } /* End of the
11b20 20 50 52 41 47 4d 41 20 73 77 69 74 63 68 20 2a   PRAGMA switch *
11b30 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  /..  /* The foll
11b40 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 69 73 20 61  owing block is a
11b50 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51   no-op unless SQ
11b60 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
11b70 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c 79 0a  fined. Its only.
11b80 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 69 73 20    ** purpose is 
11b90 74 6f 20 65 78 65 63 75 74 65 20 61 73 73 65 72  to execute asser
11ba0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
11bb0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  o verify that if
11bc0 20 74 68 65 0a 20 20 2a 2a 20 50 72 61 67 46 6c   the.  ** PragFl
11bd0 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 20 66 6c 61  g_NoColumns1 fla
11be0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
11bf0 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
11c00 64 20 61 6e 20 61 72 67 75 6d 65 6e 74 0a 20 20  d an argument.  
11c10 2a 2a 20 74 6f 20 74 68 65 20 50 52 41 47 4d 41  ** to the PRAGMA
11c20 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  , the implementa
11c30 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 61 64 64  tion has not add
11c40 65 64 20 61 6e 79 20 4f 50 5f 52 65 73 75 6c 74  ed any OP_Result
11c50 52 6f 77 20 0a 20 20 2a 2a 20 69 6e 73 74 72 75  Row .  ** instru
11c60 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 56 4d  ctions to the VM
11c70 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72  .  */.  if( (pPr
11c80 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26  agma->mPragFlg &
11c90 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d   PragFlg_NoColum
11ca0 6e 73 31 29 20 26 26 20 7a 52 69 67 68 74 20 29  ns1) && zRight )
11cb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
11cc0 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52  eVerifyNoResultR
11cd0 6f 77 28 76 29 3b 0a 20 20 7d 0a 0a 70 72 61 67  ow(v);.  }..prag
11ce0 6d 61 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  ma_out:.  sqlite
11cf0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4c 65 66  3DbFree(db, zLef
11d00 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  t);.  sqlite3DbF
11d10 72 65 65 28 64 62 2c 20 7a 52 69 67 68 74 29 3b  ree(db, zRight);
11d20 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  .}.#ifndef SQLIT
11d30 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11d40 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  BLE./***********
11d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d90 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  **.** Implementa
11da0 74 69 6f 6e 20 6f 66 20 61 6e 20 65 70 6f 6e 79  tion of an epony
11db0 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62  mous virtual tab
11dc0 6c 65 20 74 68 61 74 20 72 75 6e 73 20 61 20 70  le that runs a p
11dd0 72 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f 0a 74 79 70  ragma..**.*/.typ
11de0 65 64 65 66 20 73 74 72 75 63 74 20 50 72 61 67  edef struct Prag
11df0 6d 61 56 74 61 62 20 50 72 61 67 6d 61 56 74 61  maVtab PragmaVta
11e00 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  b;.typedef struc
11e10 74 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73  t PragmaVtabCurs
11e20 6f 72 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  or PragmaVtabCur
11e30 73 6f 72 3b 0a 73 74 72 75 63 74 20 50 72 61 67  sor;.struct Prag
11e40 6d 61 56 74 61 62 20 7b 0a 20 20 73 71 6c 69 74  maVtab {.  sqlit
11e50 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20 20  e3_vtab base;   
11e60 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61       /* Base cla
11e70 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72  ss.  Must be fir
11e80 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  st */.  sqlite3 
11e90 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
11ea0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
11eb0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
11ec0 77 68 69 63 68 20 69 74 20 62 65 6c 6f 6e 67 73  which it belongs
11ed0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 50 72 61 67   */.  const Prag
11ee0 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 20 20  maName *pName;  
11ef0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
11f00 72 61 67 6d 61 20 2a 2f 0a 20 20 75 38 20 6e 48  ragma */.  u8 nH
11f10 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20 20 20  idden;          
11f20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11f30 66 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73  f hidden columns
11f40 20 2a 2f 0a 20 20 75 38 20 69 48 69 64 64 65 6e   */.  u8 iHidden
11f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f60 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
11f70 66 69 72 73 74 20 68 69 64 64 65 6e 20 63 6f 6c  first hidden col
11f80 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74  umn */.};.struct
11f90 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   PragmaVtabCurso
11fa0 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  r {.  sqlite3_vt
11fb0 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 20  ab_cursor base; 
11fc0 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20 20  /* Base class.  
11fd0 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f  Must be first */
11fe0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
11ff0 2a 70 50 72 61 67 6d 61 3b 20 20 20 20 2f 2a 20  *pPragma;    /* 
12000 54 68 65 20 70 72 61 67 6d 61 20 73 74 61 74 65  The pragma state
12010 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 20  ment to run */. 
12020 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52   sqlite_int64 iR
12030 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 43 75  owid;      /* Cu
12040 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20  rrent rowid */. 
12050 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 32 5d 3b   char *azArg[2];
12060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
12070 6c 75 65 20 6f 66 20 74 68 65 20 61 72 67 75 6d  lue of the argum
12080 65 6e 74 20 61 6e 64 20 73 63 68 65 6d 61 20 2a  ent and schema *
12090 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61  /.};../* .** Pra
120a0 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
120b0 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e 65 63  e module xConnec
120c0 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  t method..*/.sta
120d0 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
120e0 61 62 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c  abConnect(.  sql
120f0 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
12100 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72   *pAux,.  int ar
12110 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
12120 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71  const*argv,.  sq
12130 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56  lite3_vtab **ppV
12140 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  tab,.  char **pz
12150 45 72 72 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 50  Err.){.  const P
12160 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50 72 61 67  ragmaName *pPrag
12170 6d 61 20 3d 20 28 63 6f 6e 73 74 20 50 72 61 67  ma = (const Prag
12180 6d 61 4e 61 6d 65 2a 29 70 41 75 78 3b 0a 20 20  maName*)pAux;.  
12190 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62  PragmaVtab *pTab
121a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
121b0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68    int i, j;.  ch
121c0 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a 20  ar cSep = '(';. 
121d0 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b 0a 20   StrAccum acc;. 
121e0 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
121f0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
12200 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55 4e  ETER(argc);.  UN
12210 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
12220 72 67 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  rgv);.  sqlite3S
12230 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63  trAccumInit(&acc
12240 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a 65 6f  , 0, zBuf, sizeo
12250 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20 20 73  f(zBuf), 0);.  s
12260 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
12270 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 43  pendAll(&acc, "C
12280 52 45 41 54 45 20 54 41 42 4c 45 20 78 22 29 3b  REATE TABLE x");
12290 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 50  .  for(i=0, j=pP
122a0 72 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e 61 6d  ragma->iPragCNam
122b0 65 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e 6e 50  e; i<pPragma->nP
122c0 72 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20 6a  ragCName; i++, j
122d0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
122e0 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22 25  XPrintf(&acc, "%
122f0 63 5c 22 25 73 5c 22 22 2c 20 63 53 65 70 2c 20  c\"%s\"", cSep, 
12300 70 72 61 67 43 4e 61 6d 65 5b 6a 5d 29 3b 0a 20  pragCName[j]);. 
12310 20 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20     cSep = ',';. 
12320 20 7d 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 7b   }.  if( i==0 ){
12330 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69  .    sqlite3XPri
12340 6e 74 66 28 26 61 63 63 2c 20 22 28 5c 22 25 73  ntf(&acc, "(\"%s
12350 5c 22 22 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e  \"", pPragma->zN
12360 61 6d 65 29 3b 0a 20 20 20 20 63 53 65 70 20 3d  ame);.    cSep =
12370 20 27 2c 27 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   ',';.    i++;. 
12380 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 69 66   }.  j = 0;.  if
12390 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67  ( pPragma->mPrag
123a0 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65  Flg & PragFlg_Re
123b0 73 75 6c 74 31 20 29 7b 0a 20 20 20 20 73 71 6c  sult1 ){.    sql
123c0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
123d0 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 2c 61 72  ndAll(&acc, ",ar
123e0 67 20 48 49 44 44 45 4e 22 29 3b 0a 20 20 20 20  g HIDDEN");.    
123f0 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  j++;.  }.  if( p
12400 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67  Pragma->mPragFlg
12410 20 26 20 28 50 72 61 67 46 6c 67 5f 53 63 68 65   & (PragFlg_Sche
12420 6d 61 4f 70 74 7c 50 72 61 67 46 6c 67 5f 53 63  maOpt|PragFlg_Sc
12430 68 65 6d 61 52 65 71 29 20 29 7b 0a 20 20 20 20  hemaReq) ){.    
12440 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
12450 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22  ppendAll(&acc, "
12460 2c 73 63 68 65 6d 61 20 48 49 44 44 45 4e 22 29  ,schema HIDDEN")
12470 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
12480 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
12490 41 70 70 65 6e 64 28 26 61 63 63 2c 20 22 29 22  Append(&acc, ")"
124a0 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 1);.  sqlite3S
124b0 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 61  trAccumFinish(&a
124c0 63 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  cc);.  assert( s
124d0 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20 73 69  trlen(zBuf) < si
124e0 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b 0a  zeof(zBuf)-1 );.
124f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64    rc = sqlite3_d
12500 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20  eclare_vtab(db, 
12510 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d  zBuf);.  if( rc=
12520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12530 20 20 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61    pTab = (Pragma
12540 56 74 61 62 2a 29 73 71 6c 69 74 65 33 5f 6d 61  Vtab*)sqlite3_ma
12550 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72 61 67  lloc(sizeof(Prag
12560 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20 69 66  maVtab));.    if
12570 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
12580 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
12590 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
125a0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54  .      memset(pT
125b0 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72  ab, 0, sizeof(Pr
125c0 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20  agmaVtab));.    
125d0 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20 3d 20    pTab->pName = 
125e0 70 50 72 61 67 6d 61 3b 0a 20 20 20 20 20 20 70  pPragma;.      p
125f0 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  Tab->db = db;.  
12600 20 20 20 20 70 54 61 62 2d 3e 69 48 69 64 64 65      pTab->iHidde
12610 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 54 61  n = i;.      pTa
12620 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a 3b 0a  b->nHidden = j;.
12630 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
12640 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
12650 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
12660 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
12670 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70  (db));.  }..  *p
12680 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33  pVtab = (sqlite3
12690 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20 72  _vtab*)pTab;.  r
126a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
126b0 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75  .** Pragma virtu
126c0 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
126d0 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74 68  xDisconnect meth
126e0 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
126f0 74 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63  t pragmaVtabDisc
12700 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76  onnect(sqlite3_v
12710 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 50  tab *pVtab){.  P
12720 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
12730 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 70  = (PragmaVtab*)p
12740 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Vtab;.  sqlite3_
12750 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20 72 65  free(pTab);.  re
12760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12770 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  }../* Figure out
12780 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
12790 74 6f 20 75 73 65 20 74 6f 20 73 65 61 72 63 68  to use to search
127a0 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61   a pragma virtua
127b0 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  l table..**.** T
127c0 68 65 72 65 20 61 72 65 20 6e 6f 74 20 72 65 61  here are not rea
127d0 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78 20 63 68  lly any index ch
127e0 6f 69 63 65 73 2e 20 20 42 75 74 20 77 65 20 77  oices.  But we w
127f0 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61 67 65  ant to encourage
12800 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 6c   the.** query pl
12810 61 6e 6e 65 72 20 74 6f 20 67 69 76 65 20 3d 3d  anner to give ==
12820 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
12830 61 73 20 6d 61 6e 79 20 68 69 64 64 65 6e 20 70  as many hidden p
12840 61 72 61 6d 65 74 65 72 73 20 61 73 0a 2a 2a 20  arameters as.** 
12850 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 65 73  possible, and es
12860 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68 65 20  pecially on the 
12870 66 69 72 73 74 20 68 69 64 64 65 6e 20 70 61 72  first hidden par
12880 61 6d 65 74 65 72 2e 20 20 53 6f 20 72 65 74 75  ameter.  So retu
12890 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63 6f 73  rn a.** high cos
128a0 74 20 69 66 20 68 69 64 64 65 6e 20 70 61 72 61  t if hidden para
128b0 6d 65 74 65 72 73 20 61 72 65 20 75 6e 63 6f 6e  meters are uncon
128c0 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  strained..*/.sta
128d0 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
128e0 61 62 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69  abBestIndex(sqli
128f0 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73  te3_vtab *tab, s
12900 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
12910 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20  o *pIdxInfo){.  
12920 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62  PragmaVtab *pTab
12930 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29   = (PragmaVtab*)
12940 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72  tab;.  const str
12950 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
12960 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43  x_constraint *pC
12970 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74  onstraint;.  int
12980 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73 65 65   i, j;.  int see
12990 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49 6e 66  n[2];..  pIdxInf
129a0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
129b0 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20   = (double)1;.  
129c0 69 66 28 20 70 54 61 62 2d 3e 6e 48 69 64 64 65  if( pTab->nHidde
129d0 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 53  n==0 ){ return S
129e0 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 70 43  QLITE_OK; }.  pC
129f0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
12a00 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
12a10 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d 20 30  t;.  seen[0] = 0
12a20 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20 30 3b  ;.  seen[1] = 0;
12a30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
12a40 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
12a50 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74  int; i++, pConst
12a60 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66  raint++){.    if
12a70 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75  ( pConstraint->u
12a80 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69  sable==0 ) conti
12a90 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  nue;.    if( pCo
12aa0 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53 51  nstraint->op!=SQ
12ab0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
12ac0 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69  RAINT_EQ ) conti
12ad0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  nue;.    if( pCo
12ae0 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d  nstraint->iColum
12af0 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69 64 64 65  n < pTab->iHidde
12b00 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
12b10 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e    j = pConstrain
12b20 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 54 61  t->iColumn - pTa
12b30 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20 20 20  b->iHidden;.    
12b40 61 73 73 65 72 74 28 20 6a 20 3c 20 32 20 29 3b  assert( j < 2 );
12b50 0a 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d 20 69  .    seen[j] = i
12b60 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 65  +1;.  }.  if( se
12b70 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  en[0]==0 ){.    
12b80 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
12b90 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c  tedCost = (doubl
12ba0 65 29 32 31 34 37 34 38 33 36 34 37 3b 0a 20 20  e)2147483647;.  
12bb0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
12bc0 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 31 34 37  matedRows = 2147
12bd0 34 38 33 36 34 37 3b 0a 20 20 20 20 72 65 74 75  483647;.    retu
12be0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12bf0 7d 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30 5d 2d  }.  j = seen[0]-
12c00 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  1;.  pIdxInfo->a
12c10 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
12c20 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31  j].argvIndex = 1
12c30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
12c40 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
12c50 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 69 66  ].omit = 1;.  if
12c60 28 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29 20 72  ( seen[1]==0 ) r
12c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12c80 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
12c90 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f  imatedCost = (do
12ca0 75 62 6c 65 29 32 30 3b 0a 20 20 70 49 64 78 49  uble)20;.  pIdxI
12cb0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
12cc0 77 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d 20 73  ws = 20;.  j = s
12cd0 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49 64 78  een[1]-1;.  pIdx
12ce0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
12cf0 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e  tUsage[j].argvIn
12d00 64 65 78 20 3d 20 32 3b 0a 20 20 70 49 64 78 49  dex = 2;.  pIdxI
12d10 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
12d20 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20  Usage[j].omit = 
12d30 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
12d40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72 65  TE_OK;.}../* Cre
12d50 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
12d60 20 66 6f 72 20 74 68 65 20 70 72 61 67 6d 61 20   for the pragma 
12d70 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
12d80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
12d90 6d 61 56 74 61 62 4f 70 65 6e 28 73 71 6c 69 74  maVtabOpen(sqlit
12da0 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20  e3_vtab *pVtab, 
12db0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
12dc0 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b  sor **ppCursor){
12dd0 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
12de0 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70 43 73  sor *pCsr;.  pCs
12df0 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
12e00 75 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f 6d  ursor*)sqlite3_m
12e10 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 43  alloc(sizeof(*pC
12e20 73 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73 72  sr));.  if( pCsr
12e30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
12e40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
12e50 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a  set(pCsr, 0, siz
12e60 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 43 75  eof(PragmaVtabCu
12e70 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e  rsor));.  pCsr->
12e80 62 61 73 65 2e 70 56 74 61 62 20 3d 20 70 56 74  base.pVtab = pVt
12e90 61 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20  ab;.  *ppCursor 
12ea0 3d 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20  = &pCsr->base;. 
12eb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12ec0 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20 61  K;.}../* Clear a
12ed0 6c 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ll content from 
12ee0 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  pragma virtual t
12ef0 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a  able cursor. */.
12f00 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 61 67  static void prag
12f10 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
12f20 72 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73  r(PragmaVtabCurs
12f30 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74  or *pCsr){.  int
12f40 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   i;.  sqlite3_fi
12f50 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72  nalize(pCsr->pPr
12f60 61 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d 3e 70  agma);.  pCsr->p
12f70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 66 6f  Pragma = 0;.  fo
12f80 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
12f90 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 3b  ze(pCsr->azArg);
12fa0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
12fb0 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 7a  e3_free(pCsr->az
12fc0 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70 43 73  Arg[i]);.    pCs
12fd0 72 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20 30 3b  r->azArg[i] = 0;
12fe0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73 65  .  }.}../* Close
12ff0 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61   a pragma virtua
13000 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 2a  l table cursor *
13010 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
13020 67 6d 61 56 74 61 62 43 6c 6f 73 65 28 73 71 6c  gmaVtabClose(sql
13030 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
13040 20 2a 63 75 72 29 7b 0a 20 20 50 72 61 67 6d 61   *cur){.  Pragma
13050 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
13060 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
13070 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 72 61  rsor*)cur;.  pra
13080 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65  gmaVtabCursorCle
13090 61 72 28 70 43 73 72 29 3b 0a 20 20 73 71 6c 69  ar(pCsr);.  sqli
130a0 74 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b 0a  te3_free(pCsr);.
130b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
130c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63  OK;.}../* Advanc
130d0 65 20 74 68 65 20 70 72 61 67 6d 61 20 76 69 72  e the pragma vir
130e0 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f  tual table curso
130f0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  r to the next ro
13100 77 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  w */.static int 
13110 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74 28 73  pragmaVtabNext(s
13120 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
13130 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29  or *pVtabCursor)
13140 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
13150 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
13160 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
13170 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 69  pVtabCursor;.  i
13180 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13190 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65  K;..  /* Increme
131a0 6e 74 20 74 68 65 20 78 52 6f 77 69 64 20 76 61  nt the xRowid va
131b0 6c 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d 3e 69  lue */.  pCsr->i
131c0 52 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73 65 72  Rowid++;.  asser
131d0 74 28 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61  t( pCsr->pPragma
131e0 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
131f0 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW!=sqlite3_st
13200 65 70 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61  ep(pCsr->pPragma
13210 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
13220 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
13230 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20  Csr->pPragma);. 
13240 20 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61     pCsr->pPragma
13250 20 3d 20 30 3b 0a 20 20 20 20 70 72 61 67 6d 61   = 0;.    pragma
13260 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28  VtabCursorClear(
13270 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pCsr);.  }.  ret
13280 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
13290 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c  * Pragma virtual
132a0 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 46   table module xF
132b0 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f  ilter method..*/
132c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
132d0 6d 61 56 74 61 62 46 69 6c 74 65 72 28 0a 20 20  maVtabFilter(.  
132e0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
132f0 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
13300 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c  , .  int idxNum,
13310 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78   const char *idx
13320 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  Str,.  int argc,
13330 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
13340 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72 61 67 6d  *argv.){.  Pragm
13350 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13360 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
13370 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
13380 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  or;.  PragmaVtab
13390 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61   *pTab = (Pragma
133a0 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73  Vtab*)(pVtabCurs
133b0 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 6e  or->pVtab);.  in
133c0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  t rc;.  int i, j
133d0 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63  ;.  StrAccum acc
133e0 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
133f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
13400 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20 20 55  TER(idxNum);.  U
13410 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
13420 69 64 78 53 74 72 29 3b 0a 20 20 70 72 61 67 6d  idxStr);.  pragm
13430 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72  aVtabCursorClear
13440 28 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20 28 70  (pCsr);.  j = (p
13450 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50 72 61  Tab->pName->mPra
13460 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52  gFlg & PragFlg_R
13470 65 73 75 6c 74 31 29 21 3d 30 20 3f 20 30 20 3a  esult1)!=0 ? 0 :
13480 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   1;.  for(i=0; i
13490 3c 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b 2b 29  <argc; i++, j++)
134a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  {.    assert( j<
134b0 41 72 72 61 79 53 69 7a 65 28 70 43 73 72 2d 3e  ArraySize(pCsr->
134c0 61 7a 41 72 67 29 20 29 3b 0a 20 20 20 20 70 43  azArg) );.    pC
134d0 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 20 3d 20 73  sr->azArg[j] = s
134e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
134f0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  %s", sqlite3_val
13500 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29  ue_text(argv[i])
13510 29 3b 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d  );.    if( pCsr-
13520 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 7b 0a  >azArg[j]==0 ){.
13530 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13540 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
13550 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
13560 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c  rAccumInit(&acc,
13570 20 30 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e   0, 0, 0, pTab->
13580 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
13590 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
135a0 54 48 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  TH]);.  sqlite3S
135b0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c  trAccumAppendAll
135c0 28 26 61 63 63 2c 20 22 50 52 41 47 4d 41 20 22  (&acc, "PRAGMA "
135d0 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61  );.  if( pCsr->a
135e0 7a 41 72 67 5b 31 5d 20 29 7b 0a 20 20 20 20 73  zArg[1] ){.    s
135f0 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 61  qlite3XPrintf(&a
13600 63 63 2c 20 22 25 51 2e 22 2c 20 70 43 73 72 2d  cc, "%Q.", pCsr-
13610 3e 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a  >azArg[1]);.  }.
13620 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
13630 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c  mAppendAll(&acc,
13640 20 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 7a 4e   pTab->pName->zN
13650 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 43 73 72  ame);.  if( pCsr
13660 2d 3e 61 7a 41 72 67 5b 30 5d 20 29 7b 0a 20 20  ->azArg[0] ){.  
13670 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
13680 28 26 61 63 63 2c 20 22 3d 25 51 22 2c 20 70 43  (&acc, "=%Q", pC
13690 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  sr->azArg[0]);. 
136a0 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69   }.  zSql = sqli
136b0 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
136c0 68 28 26 61 63 63 29 3b 0a 20 20 69 66 28 20 7a  h(&acc);.  if( z
136d0 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sql==0 ) return 
136e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
136f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
13700 70 61 72 65 5f 76 32 28 70 54 61 62 2d 3e 64 62  pare_v2(pTab->db
13710 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 73  , zSql, -1, &pCs
13720 72 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29 3b 0a  r->pPragma, 0);.
13730 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13740 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Sql);.  if( rc!=
13750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13760 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72   pTab->base.zErr
13770 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
13780 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
13790 74 65 33 5f 65 72 72 6d 73 67 28 70 54 61 62 2d  te3_errmsg(pTab-
137a0 3e 64 62 29 29 3b 0a 20 20 20 20 72 65 74 75 72  >db));.    retur
137b0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n rc;.  }.  retu
137c0 72 6e 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78  rn pragmaVtabNex
137d0 74 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a  t(pVtabCursor);.
137e0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d 61 20  }../*.** Pragma 
137f0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
13800 64 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f 64  dule xEof method
13810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13820 70 72 61 67 6d 61 56 74 61 62 45 6f 66 28 73 71  pragmaVtabEof(sq
13830 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
13840 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29 7b  r *pVtabCursor){
13850 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13860 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13870 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
13880 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72 65  VtabCursor;.  re
13890 74 75 72 6e 20 28 70 43 73 72 2d 3e 70 50 72 61  turn (pCsr->pPra
138a0 67 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20 54  gma==0);.}../* T
138b0 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f  he xColumn metho
138c0 64 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73  d simply returns
138d0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
138e0 6e 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  ng column from.*
138f0 2a 20 74 68 65 20 50 52 41 47 4d 41 2e 20 20 0a  * the PRAGMA.  .
13900 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
13910 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 28 0a  agmaVtabColumn(.
13920 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
13930 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
13940 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 63  or, .  sqlite3_c
13950 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20 20  ontext *ctx, .  
13960 69 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61 67 6d  int i.){.  Pragm
13970 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13980 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
13990 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
139a0 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  or;.  PragmaVtab
139b0 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61   *pTab = (Pragma
139c0 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73  Vtab*)(pVtabCurs
139d0 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 66  or->pVtab);.  if
139e0 28 20 69 3c 70 54 61 62 2d 3e 69 48 69 64 64 65  ( i<pTab->iHidde
139f0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
13a00 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74  _result_value(ct
13a10 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  x, sqlite3_colum
13a20 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 50  n_value(pCsr->pP
13a30 72 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20 7d 65  ragma, i));.  }e
13a40 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
13a50 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78  _result_text(ctx
13a60 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 2d  , pCsr->azArg[i-
13a70 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d 2c 2d  pTab->iHidden],-
13a80 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  1,SQLITE_TRANSIE
13a90 4e 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  NT);.  }.  retur
13aa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13ab0 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69  /* .** Pragma vi
13ac0 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
13ad0 6c 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f 64  le xRowid method
13ae0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13af0 70 72 61 67 6d 61 56 74 61 62 52 6f 77 69 64 28  pragmaVtabRowid(
13b00 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
13b10 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
13b20 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  , sqlite_int64 *
13b30 70 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  p){.  PragmaVtab
13b40 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
13b50 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13b60 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
13b70 20 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52 6f 77   *p = pCsr->iRow
13b80 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  id;.  return SQL
13b90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
13ba0 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  e pragma virtual
13bb0 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f   table object */
13bc0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
13bd0 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70 72 61  lite3_module pra
13be0 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20 3d 20  gmaVtabModule = 
13bf0 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  {.  0,          
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c10 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
13c20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
13c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13c40 2a 20 78 43 72 65 61 74 65 20 2d 20 63 72 65 61  * xCreate - crea
13c50 74 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  te a table */.  
13c60 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63  pragmaVtabConnec
13c70 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
13c80 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e 65  xConnect - conne
13c90 63 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e  ct to an existin
13ca0 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61  g table */.  pra
13cb0 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65 78  gmaVtabBestIndex
13cc0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65  ,         /* xBe
13cd0 73 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72 6d  stIndex - Determ
13ce0 69 6e 65 20 73 65 61 72 63 68 20 73 74 72 61 74  ine search strat
13cf0 65 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  egy */.  pragmaV
13d00 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20  tabDisconnect,  
13d10 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e        /* xDiscon
13d20 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65 63  nect - Disconnec
13d30 74 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 2a  t from a table *
13d40 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d60 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20 44   /* xDestroy - D
13d70 72 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20  rop a table */. 
13d80 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e 2c   pragmaVtabOpen,
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13da0 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20   xOpen - open a 
13db0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67  cursor */.  prag
13dc0 6d 61 56 74 61 62 43 6c 6f 73 65 2c 20 20 20 20  maVtabClose,    
13dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
13de0 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72  se - close a cur
13df0 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  sor */.  pragmaV
13e00 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20 20  tabFilter,      
13e10 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72        /* xFilter
13e20 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61   - configure sca
13e30 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  n constraints */
13e40 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78  .  pragmaVtabNex
13e50 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
13e60 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e  /* xNext - advan
13e70 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  ce a cursor */. 
13e80 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 2c 20   pragmaVtabEof, 
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13ea0 20 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61 67 6d   xEof */.  pragm
13eb0 61 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20 20  aVtabColumn,    
13ec0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75          /* xColu
13ed0 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  mn - read data *
13ee0 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 52 6f  /.  pragmaVtabRo
13ef0 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
13f00 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61   /* xRowid - rea
13f10 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20  d data */.  0,  
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64           /* xUpd
13f40 61 74 65 20 2d 20 77 72 69 74 65 20 64 61 74 61  ate - write data
13f50 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20 62     /* xBegin - b
13f80 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egin transaction
13f90 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73 79     /* xSync - sy
13fc0 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  nc transaction *
13fd0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f   /* xCommit - co
14000 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  mmit transaction
14010 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20     /* xRollback 
14040 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73  - rollback trans
14050 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  action */.  0,  
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14070 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e           /* xFin
14080 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e 63  dFunction - func
14090 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
140a0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140c0 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d 20     /* xRename - 
140d0 72 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c 65  rename the table
140e0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
140f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14100 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74     /* xSavepoint
14110 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14130 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a     /* xRelease *
14140 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20   /* xRollbackTo 
14170 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  */.};../*.** Che
14180 63 6b 20 74 6f 20 73 65 65 20 69 66 20 7a 54 61  ck to see if zTa
14190 62 4e 61 6d 65 20 69 73 20 72 65 61 6c 6c 79 20  bName is really 
141a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 70 72  the name of a pr
141b0 61 67 6d 61 2e 20 20 49 66 20 69 74 20 69 73 2c  agma.  If it is,
141c0 0a 2a 2a 20 74 68 65 6e 20 72 65 67 69 73 74 65  .** then registe
141d0 72 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76  r an eponymous v
141e0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66 6f 72  irtual table for
141f0 20 74 68 61 74 20 70 72 61 67 6d 61 20 61 6e 64   that pragma and
14200 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
14210 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 6f 64 75  nter to the Modu
14220 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  le object for th
14230 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 61  e new virtual ta
14240 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65 20 2a  ble..*/.Module *
14250 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61  sqlite3PragmaVta
14260 62 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65  bRegister(sqlite
14270 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
14280 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e  r *zName){.  con
14290 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
142a0 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
142b0 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
142c0 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f  (zName, "pragma_
142d0 22 2c 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 4e  ", 7)==0 );.  pN
142e0 61 6d 65 20 3d 20 70 72 61 67 6d 61 4c 6f 63 61  ame = pragmaLoca
142f0 74 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a 20 20 69  te(zName+7);.  i
14300 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( pName==0 ) re
14310 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
14320 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26  Name->mPragFlg &
14330 20 28 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74   (PragFlg_Result
14340 30 7c 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74  0|PragFlg_Result
14350 31 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  1))==0 ) return 
14360 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
14370 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
14380 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65  ->aModule, zName
14390 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
143a0 20 73 71 6c 69 74 65 33 56 74 61 62 43 72 65 61   sqlite3VtabCrea
143b0 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a 4e 61  teModule(db, zNa
143c0 6d 65 2c 20 26 70 72 61 67 6d 61 56 74 61 62 4d  me, &pragmaVtabM
143d0 6f 64 75 6c 65 2c 20 28 76 6f 69 64 2a 29 70 4e  odule, (void*)pN
143e0 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65 6e 64  ame, 0);.}..#end
143f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
14400 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
14410 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
14420 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20  ITE_OMIT_PRAGMA 
14430 2a 2f 0a                                         */.