/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 7831956012f5d764761fbd023e59b0ffc08f5e8d:


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 50 72 6f 63 65 73 73 20 61 20 70 72 61  ** Process a pra
23a0: 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  gma statement.  
23b0: 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20 61  .**.** Pragmas a
23c0: 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72 6d 3a  re of this form:
23d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41 47  .**.**      PRAG
23e0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 64 20 5b  MA [schema.]id [
23f0: 3d 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a 20 54  = value].**.** T
2400: 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d 69  he identifier mi
2410: 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73 74  ght also be a st
2420: 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75 65  ring.  The value
2430: 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61 6e   is a string, an
2440: 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2c  d.** identifier,
2450: 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20 49   or a number.  I
2460: 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20 74  f minusFlag is t
2470: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61  rue, then the va
2480: 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62  lue is.** a numb
2490: 65 72 20 74 68 61 74 20 77 61 73 20 70 72 65 63  er that was prec
24a0: 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20  eded by a minus 
24b0: 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sign..**.** If t
24c0: 68 65 20 6c 65 66 74 20 73 69 64 65 20 69 73 20  he left side is 
24d0: 22 64 61 74 61 62 61 73 65 2e 69 64 22 20 74 68  "database.id" th
24e0: 65 6e 20 70 49 64 31 20 69 73 20 74 68 65 20 64  en pId1 is the d
24f0: 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20  atabase name.** 
2500: 61 6e 64 20 70 49 64 32 20 69 73 20 74 68 65 20  and pId2 is the 
2510: 69 64 2e 20 20 49 66 20 74 68 65 20 6c 65 66 74  id.  If the left
2520: 20 73 69 64 65 20 69 73 20 6a 75 73 74 20 22 69   side is just "i
2530: 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73 20  d" then pId1 is 
2540: 74 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20 70 49  the.** id and pI
2550: 64 32 20 69 73 20 61 6e 79 20 65 6d 70 74 79 20  d2 is any empty 
2560: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  string..*/.void 
2570: 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 0a 20  sqlite3Pragma(. 
2580: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2590: 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31 2c 20  .  Token *pId1, 
25a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
25b0: 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e  part of [schema.
25c0: 5d 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20 20 54  ]id field */.  T
25d0: 6f 6b 65 6e 20 2a 70 49 64 32 2c 20 20 20 20 20  oken *pId2,     
25e0: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
25f0: 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d 69 64  t of [schema.]id
2600: 20 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c 4c 20   field, or NULL 
2610: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56 61 6c  */.  Token *pVal
2620: 75 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65  ue,      /* Toke
2630: 6e 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c 20 6f  n for <value>, o
2640: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
2650: 6d 69 6e 75 73 46 6c 61 67 20 20 20 20 20 20 20  minusFlag       
2660: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 27 2d 27  /* True if a '-'
2670: 20 73 69 67 6e 20 70 72 65 63 65 64 65 64 20 3c   sign preceded <
2680: 76 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20 20 63  value> */.){.  c
2690: 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b 20  har *zLeft = 0; 
26a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72        /* Nul-ter
26b0: 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74  minated UTF-8 st
26c0: 72 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20 20 63  ring <id> */.  c
26d0: 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20 30 3b  har *zRight = 0;
26e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72        /* Nul-ter
26f0: 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74  minated UTF-8 st
2700: 72 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20 6f 72  ring <value>, or
2710: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
2720: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20   char *zDb = 0; 
2730: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
2740: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f 6b 65  e name */.  Toke
2750: 6e 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20  n *pId;         
2760: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2770: 20 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f 0a 20   <id> token */. 
2780: 20 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b 34 5d   char *aFcntl[4]
2790: 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ;       /* Argum
27a0: 65 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 43  ent to SQLITE_FC
27b0: 4e 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20  NTL_PRAGMA */.  
27c0: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
27d0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
27e0: 73 65 20 69 6e 64 65 78 20 66 6f 72 20 3c 64 61  se index for <da
27f0: 74 61 62 61 73 65 3e 20 2a 2f 0a 20 20 69 6e 74  tabase> */.  int
2800: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 74            /* ret
2820: 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 6d 20 53  urn value form S
2830: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47  QLITE_FCNTL_PRAG
2840: 4d 41 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  MA */.  sqlite3 
2850: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
2860: 3b 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  ;    /* The data
2870: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2880: 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  */.  Db *pDb;   
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
28b0: 63 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  c database being
28c0: 20 70 72 61 67 6d 61 65 64 20 2a 2f 0a 20 20 56   pragmaed */.  V
28d0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
28e0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
28f0: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
2900: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
2910: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
2920: 50 72 61 67 6d 61 3b 20 20 20 2f 2a 20 54 68 65  Pragma;   /* The
2930: 20 70 72 61 67 6d 61 20 2a 2f 0a 0a 20 20 69 66   pragma */..  if
2940: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
2950: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 75  .  sqlite3VdbeRu
2960: 6e 4f 6e 6c 79 4f 6e 63 65 28 76 29 3b 0a 20 20  nOnlyOnce(v);.  
2970: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32  pParse->nMem = 2
2980: 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 70 72 65  ;..  /* Interpre
2990: 74 20 74 68 65 20 5b 73 63 68 65 6d 61 2e 5d 20  t the [schema.] 
29a0: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67  part of the prag
29b0: 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 69 44  ma statement. iD
29c0: 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e  b is the.  ** in
29d0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
29e0: 61 73 65 20 74 68 69 73 20 70 72 61 67 6d 61 20  ase this pragma 
29f0: 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69 65 64  is being applied
2a00: 20 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b 5d 2e   to in db.aDb[].
2a10: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
2a20: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
2a30: 50 61 72 73 65 2c 20 70 49 64 31 2c 20 70 49 64  Parse, pId1, pId
2a40: 32 2c 20 26 70 49 64 29 3b 0a 20 20 69 66 28 20  2, &pId);.  if( 
2a50: 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
2a60: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
2a70: 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 49 66 20  [iDb];..  /* If 
2a80: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
2a90: 65 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c 69  e has been expli
2aa0: 63 69 74 6c 79 20 6e 61 6d 65 64 20 61 73 20 70  citly named as p
2ab0: 61 72 74 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a  art of the .  **
2ac0: 20 70 72 61 67 6d 61 2c 20 6d 61 6b 65 20 73 75   pragma, make su
2ad0: 72 65 20 69 74 20 69 73 20 6f 70 65 6e 2e 20 0a  re it is open. .
2ae0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62 3d 3d    */.  if( iDb==
2af0: 31 20 26 26 20 73 71 6c 69 74 65 33 4f 70 65 6e  1 && sqlite3Open
2b00: 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50 61  TempDatabase(pPa
2b10: 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
2b20: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 4c 65 66 74  rn;.  }..  zLeft
2b30: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
2b40: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 49 64 29  omToken(db, pId)
2b50: 3b 0a 20 20 69 66 28 20 21 7a 4c 65 66 74 20 29  ;.  if( !zLeft )
2b60: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d   return;.  if( m
2b70: 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20  inusFlag ){.    
2b80: 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  zRight = sqlite3
2b90: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d 25 54  MPrintf(db, "-%T
2ba0: 22 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d 65  ", pValue);.  }e
2bb0: 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68 74 20  lse{.    zRight 
2bc0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
2bd0: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 56 61 6c 75  mToken(db, pValu
2be0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  e);.  }..  asser
2bf0: 74 28 20 70 49 64 32 20 29 3b 0a 20 20 7a 44 62  t( pId2 );.  zDb
2c00: 20 3d 20 70 49 64 32 2d 3e 6e 3e 30 20 3f 20 70   = pId2->n>0 ? p
2c10: 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a 20 30  Db->zDbSName : 0
2c20: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
2c30: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
2c40: 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 2c 20   SQLITE_PRAGMA, 
2c50: 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 2c 20 7a  zLeft, zRight, z
2c60: 44 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  Db) ){.    goto 
2c70: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a  pragma_out;.  }.
2c80: 0a 20 20 2f 2a 20 53 65 6e 64 20 61 6e 20 53 51  .  /* Send an SQ
2c90: 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d  LITE_FCNTL_PRAGM
2ca0: 41 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 74  A file-control t
2cb0: 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  o the underlying
2cc0: 20 56 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63   VFS.  ** connec
2cd0: 74 69 6f 6e 2e 20 20 49 66 20 69 74 20 72 65 74  tion.  If it ret
2ce0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  urns SQLITE_OK, 
2cf0: 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68 61 74  then assume that
2d00: 20 74 68 65 20 56 46 53 0a 20 20 2a 2a 20 68 61   the VFS.  ** ha
2d10: 6e 64 6c 65 64 20 74 68 65 20 70 72 61 67 6d 61  ndled the pragma
2d20: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20   and generate a 
2d30: 6e 6f 2d 6f 70 20 70 72 65 70 61 72 65 64 20 73  no-op prepared s
2d40: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a 0a 20  tatement..  **. 
2d50: 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
2d60: 4f 4e 2d 4f 46 3a 20 52 2d 31 32 32 33 38 2d 35  ON-OF: R-12238-5
2d70: 35 31 32 30 20 57 68 65 6e 65 76 65 72 20 61 20  5120 Whenever a 
2d80: 50 52 41 47 4d 41 20 73 74 61 74 65 6d 65 6e 74  PRAGMA statement
2d90: 20 69 73 20 70 61 72 73 65 64 2c 0a 20 20 2a 2a   is parsed,.  **
2da0: 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   an SQLITE_FCNTL
2db0: 5f 50 52 41 47 4d 41 20 66 69 6c 65 20 63 6f 6e  _PRAGMA file con
2dc0: 74 72 6f 6c 20 69 73 20 73 65 6e 74 20 74 6f 20  trol is sent to 
2dd0: 74 68 65 20 6f 70 65 6e 20 73 71 6c 69 74 65 33  the open sqlite3
2de0: 5f 66 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a 65 63  _file.  ** objec
2df0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
2e00: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2e10: 66 69 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68  file to which th
2e20: 65 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20 73 74  e pragma.  ** st
2e30: 61 74 65 6d 65 6e 74 20 72 65 66 65 72 73 2e 0a  atement refers..
2e40: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
2e50: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32  ENTATION-OF: R-2
2e60: 39 38 37 35 2d 33 31 36 37 38 20 54 68 65 20 61  9875-31678 The a
2e70: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 53  rgument to the S
2e80: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47  QLITE_FCNTL_PRAG
2e90: 4d 41 0a 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  MA.  ** file con
2ea0: 74 72 6f 6c 20 69 73 20 61 6e 20 61 72 72 61 79  trol is an array
2eb0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
2ec0: 73 74 72 69 6e 67 73 20 28 63 68 61 72 2a 2a 29  strings (char**)
2ed0: 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a 20 20   in which the.  
2ee0: 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  ** second elemen
2ef0: 74 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69  t of the array i
2f00: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
2f10: 65 20 70 72 61 67 6d 61 20 61 6e 64 20 74 68 65  e pragma and the
2f20: 20 74 68 69 72 64 0a 20 20 2a 2a 20 65 6c 65 6d   third.  ** elem
2f30: 65 6e 74 20 69 73 20 74 68 65 20 61 72 67 75 6d  ent is the argum
2f40: 65 6e 74 20 74 6f 20 74 68 65 20 70 72 61 67 6d  ent to the pragm
2f50: 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  a or NULL if the
2f60: 20 70 72 61 67 6d 61 20 68 61 73 20 6e 6f 0a 20   pragma has no. 
2f70: 20 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20   ** argument..  
2f80: 2a 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d 20 3d  */.  aFcntl[0] =
2f90: 20 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31 5d 20   0;.  aFcntl[1] 
2fa0: 3d 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63 6e 74  = zLeft;.  aFcnt
2fb0: 6c 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b 0a 20  l[2] = zRight;. 
2fc0: 20 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30 3b 0a   aFcntl[3] = 0;.
2fd0: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
2fe0: 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 72  r.nBusy = 0;.  r
2ff0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
3000: 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
3010: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  , SQLITE_FCNTL_P
3020: 52 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29 61 46  RAGMA, (void*)aF
3030: 63 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d  cntl);.  if( rc=
3040: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
3060: 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20  NumCols(v, 1);. 
3070: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
3080: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43  tColName(v, 0, C
3090: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61 46 63  OLNAME_NAME, aFc
30a0: 6e 74 6c 5b 30 5d 2c 20 53 51 4c 49 54 45 5f 54  ntl[0], SQLITE_T
30b0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 72  RANSIENT);.    r
30c0: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
30d0: 76 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20  v, aFcntl[0]);. 
30e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
30f0: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
3100: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
3110: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
3120: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
3130: 7b 0a 20 20 20 20 69 66 28 20 61 46 63 6e 74 6c  {.    if( aFcntl
3140: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
3150: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3160: 72 73 65 2c 20 22 25 73 22 2c 20 61 46 63 6e 74  rse, "%s", aFcnt
3170: 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c  l[0]);.      sql
3180: 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e 74 6c  ite3_free(aFcntl
3190: 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [0]);.    }.    
31a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
31b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
31c0: 20 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72   rc;.    goto pr
31d0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  agma_out;.  }.. 
31e0: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 70   /* Locate the p
31f0: 72 61 67 6d 61 20 69 6e 20 74 68 65 20 6c 6f 6f  ragma in the loo
3200: 6b 75 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  kup table */.  p
3210: 50 72 61 67 6d 61 20 3d 20 70 72 61 67 6d 61 4c  Pragma = pragmaL
3220: 6f 63 61 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20  ocate(zLeft);.  
3230: 69 66 28 20 70 50 72 61 67 6d 61 3d 3d 30 20 29  if( pPragma==0 )
3240: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
3250: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
3260: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
3270: 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65 64 20  chema is loaded 
3280: 69 66 20 74 68 65 20 70 72 61 67 6d 61 20 72 65  if the pragma re
3290: 71 75 69 72 65 73 20 74 68 61 74 20 2a 2f 0a 20  quires that */. 
32a0: 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d   if( (pPragma->m
32b0: 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
32c0: 67 5f 4e 65 65 64 53 63 68 65 6d 61 29 21 3d 30  g_NeedSchema)!=0
32d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
32e0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
32f0: 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61  arse) ) goto pra
3300: 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  gma_out;.  }..  
3310: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  /* Register the 
3320: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61  result column na
3330: 6d 65 73 20 66 6f 72 20 70 72 61 67 6d 61 73 20  mes for pragmas 
3340: 74 68 61 74 20 72 65 74 75 72 6e 20 72 65 73 75  that return resu
3350: 6c 74 73 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  lts */.  if( (pP
3360: 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
3370: 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75  & PragFlg_NoColu
3380: 6d 6e 73 29 3d 3d 30 20 0a 20 20 20 26 26 20 28  mns)==0 .   && (
3390: 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46  (pPragma->mPragF
33a0: 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43  lg & PragFlg_NoC
33b0: 6f 6c 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c 20 7a  olumns1)==0 || z
33c0: 52 69 67 68 74 3d 3d 30 29 0a 20 20 29 7b 0a 20  Right==0).  ){. 
33d0: 20 20 20 73 65 74 50 72 61 67 6d 61 52 65 73 75     setPragmaResu
33e0: 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c  ltColumnNames(v,
33f0: 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d 0a 0a   pPragma);.  }..
3400: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
3410: 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 72 61   appropriate pra
3420: 67 6d 61 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20  gma handler */. 
3430: 20 73 77 69 74 63 68 28 20 70 50 72 61 67 6d 61   switch( pPragma
3440: 2d 3e 65 50 72 61 67 54 79 70 20 29 7b 0a 20 20  ->ePragTyp ){.  
3450: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
3460: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
3470: 50 52 41 47 4d 41 53 29 20 26 26 20 21 64 65 66  PRAGMAS) && !def
3480: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3490: 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20 20 2f  _DEPRECATED).  /
34a0: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
34b0: 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f  schema.]default_
34c0: 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20  cache_size.  ** 
34d0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
34e0: 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73  ]default_cache_s
34f0: 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ize=N.  **.  ** 
3500: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
3510: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
3520: 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20 73 65  nt persistent se
3530: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
3540: 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69  ** page cache si
3550: 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72  ze.  The value r
3560: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d  eturned is the m
3570: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3580: 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74  .  ** pages in t
3590: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
35a0: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
35b0: 73 65 74 73 20 62 6f 74 68 20 74 68 65 20 63 75  sets both the cu
35c0: 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20  rrent.  ** page 
35d0: 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65  cache size value
35e0: 20 61 6e 64 20 74 68 65 20 70 65 72 73 69 73 74   and the persist
35f0: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 73  ent page cache s
3600: 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 73  ize value.  ** s
3610: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
3620: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a  abase file..  **
3630: 0a 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65 72 73  .  ** Older vers
3640: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77  ions of SQLite w
3650: 6f 75 6c 64 20 73 65 74 20 74 68 65 20 64 65 66  ould set the def
3660: 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 20  ault cache size 
3670: 74 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61 74 69  to a.  ** negati
3680: 76 65 20 6e 75 6d 62 65 72 20 74 6f 20 69 6e 64  ve number to ind
3690: 69 63 61 74 65 20 73 79 6e 63 68 72 6f 6e 6f 75  icate synchronou
36a0: 73 3d 4f 46 46 2e 20 20 54 68 65 73 65 20 64 61  s=OFF.  These da
36b0: 79 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a  ys, synchronous.
36c0: 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 6f    ** is always o
36d0: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 72 65 67  n by default reg
36e0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
36f0: 69 67 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75  ign of the defau
3700: 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69  lt cache.  ** si
3710: 7a 65 2e 20 20 42 75 74 20 63 6f 6e 74 69 6e 75  ze.  But continu
3720: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 61 62  e to take the ab
3730: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20  solute value of 
3740: 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68  the default cach
3750: 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 68  e.  ** size of h
3760: 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74  istorical compat
3770: 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a 20 20  ibility..  */.  
3780: 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 45 46  case PragTyp_DEF
3790: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3a  AULT_CACHE_SIZE:
37a0: 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
37b0: 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44  nst int iLn = VD
37c0: 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f  BE_OFFSET_LINENO
37d0: 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20  (2);.    static 
37e0: 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
37f0: 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20   getCacheSize[] 
3800: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 54  = {.      { OP_T
3810: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30  ransaction, 0, 0
3820: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3840: 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20       /* 0 */.   
3850: 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b     { OP_ReadCook
3860: 69 65 2c 20 20 30 2c 20 31 2c 20 20 20 20 20 20  ie,  0, 1,      
3870: 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f    BTREE_DEFAULT_
3880: 43 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20 2f 2a  CACHE_SIZE},  /*
3890: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
38a0: 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c  _IfPos,       1,
38b0: 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   8,        0},. 
38c0: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
38d0: 72 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20  r,     0, 2,    
38e0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
38f0: 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 20 20 20  OP_Subtract,    
3900: 31 2c 20 32 2c 20 20 20 20 20 20 20 20 31 7d 2c  1, 2,        1},
3910: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 50 6f  .      { OP_IfPo
3920: 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c 20 20  s,       1, 8,  
3930: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3940: 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20  { OP_Integer,   
3950: 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20 30    0, 1,        0
3960: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  },              
3970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 20             /* 6 
3980: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 6f  */.      { OP_No
3990: 6f 70 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c  op,        0, 0,
39a0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
39b0: 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77    { OP_ResultRow
39c0: 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20  ,   1, 1,       
39d0: 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
39e0: 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20  VdbeOp *aOp;.   
39f0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
3a00: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
3a10: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
3a20: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
3a30: 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20  nMem += 2;.     
3a40: 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
3a50: 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72  fyNoMallocRequir
3a60: 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  ed(v, ArraySize(
3a70: 67 65 74 43 61 63 68 65 53 69 7a 65 29 29 3b 0a  getCacheSize));.
3a80: 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69        aOp = sqli
3a90: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
3aa0: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65  (v, ArraySize(ge
3ab0: 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67 65 74  tCacheSize), get
3ac0: 43 61 63 68 65 53 69 7a 65 2c 20 69 4c 6e 29 3b  CacheSize, iLn);
3ad0: 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f  .      if( ONLY_
3ae0: 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  IF_REALLOC_STRES
3af0: 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61  S(aOp==0) ) brea
3b00: 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  k;.      aOp[0].
3b10: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
3b20: 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[1].p1 = iDb;
3b30: 0a 20 20 20 20 20 20 61 4f 70 5b 36 5d 2e 70 31  .      aOp[6].p1
3b40: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
3b50: 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a 20 20  T_CACHE_SIZE;.  
3b60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
3b70: 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65  nt size = sqlite
3b80: 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65  3AbsInt32(sqlite
3b90: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a  3Atoi(zRight));.
3ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
3bb0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
3bc0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
3bd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3be0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3bf0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
3c00: 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41  BTREE_DEFAULT_CA
3c10: 43 48 45 5f 53 49 5a 45 2c 20 73 69 7a 65 29 3b  CHE_SIZE, size);
3c20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
3c30: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
3c40: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
3c50: 29 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ) );.      pDb->
3c60: 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73  pSchema->cache_s
3c70: 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ize = size;.    
3c80: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
3c90: 74 43 61 63 68 65 53 69 7a 65 28 70 44 62 2d 3e  tCacheSize(pDb->
3ca0: 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d  pBt, pDb->pSchem
3cb0: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  a->cache_size);.
3cc0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
3cd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
3ce0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
3cf0: 52 5f 50 52 41 47 4d 41 53 20 26 26 20 21 53 51  R_PRAGMAS && !SQ
3d00: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
3d10: 41 54 45 44 20 2a 2f 0a 0a 23 69 66 20 21 64 65  ATED */..#if !de
3d20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3d30: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
3d40: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
3d50: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65  MA [schema.]page
3d60: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
3d70: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65  MA [schema.]page
3d80: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
3d90: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
3da0: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
3db0: 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72  rent setting for
3dc0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
3dd0: 73 65 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20  se page size in 
3de0: 62 79 74 65 73 2e 20 20 54 68 65 20 73 65 63 6f  bytes.  The seco
3df0: 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74 68 65  nd form sets the
3e00: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70  .  ** database p
3e10: 61 67 65 20 73 69 7a 65 20 76 61 6c 75 65 2e 20  age size value. 
3e20: 20 54 68 65 20 76 61 6c 75 65 20 63 61 6e 20 6f   The value can o
3e30: 6e 6c 79 20 62 65 20 73 65 74 20 69 66 0a 20 20  nly be set if.  
3e40: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
3e50: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
3e60: 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20   created..  */. 
3e70: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 41   case PragTyp_PA
3e80: 47 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 42  GE_SIZE: {.    B
3e90: 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d  tree *pBt = pDb-
3ea0: 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
3eb0: 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20  ( pBt!=0 );.    
3ec0: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
3ed0: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
3ee0: 41 4c 57 41 59 53 28 70 42 74 29 20 3f 20 73 71  ALWAYS(pBt) ? sq
3ef0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
3f00: 65 53 69 7a 65 28 70 42 74 29 20 3a 20 30 3b 0a  eSize(pBt) : 0;.
3f10: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
3f20: 6c 65 49 6e 74 28 76 2c 20 73 69 7a 65 29 3b 0a  leInt(v, size);.
3f30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3f40: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79 20 66   /* Malloc may f
3f50: 61 69 6c 20 77 68 65 6e 20 73 65 74 74 69 6e 67  ail when setting
3f60: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20   the page-size, 
3f70: 61 73 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  as there is an i
3f80: 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  nternal.      **
3f90: 20 62 75 66 66 65 72 20 74 68 61 74 20 74 68 65   buffer that the
3fa0: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20 72 65   pager module re
3fb0: 73 69 7a 65 73 20 75 73 69 6e 67 20 73 71 6c 69  sizes using sqli
3fc0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e 0a 20  te3_realloc().. 
3fd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 62       */.      db
3fe0: 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d  ->nextPagesize =
3ff0: 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69   sqlite3Atoi(zRi
4000: 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ght);.      if( 
4010: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71  SQLITE_NOMEM==sq
4020: 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
4030: 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e  eSize(pBt, db->n
4040: 65 78 74 50 61 67 65 73 69 7a 65 2c 2d 31 2c 30  extPagesize,-1,0
4050: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
4060: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
4070: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4080: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4090: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
40a0: 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63 75 72  A [schema.]secur
40b0: 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 20 50  e_delete.  **  P
40c0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73  RAGMA [schema.]s
40d0: 65 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f 4e 2f  ecure_delete=ON/
40e0: 4f 46 46 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  OFF.  **.  ** Th
40f0: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70  e first form rep
4100: 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  orts the current
4110: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65   setting for the
4120: 0a 20 20 2a 2a 20 73 65 63 75 72 65 5f 64 65 6c  .  ** secure_del
4130: 65 74 65 20 66 6c 61 67 2e 20 20 54 68 65 20 73  ete flag.  The s
4140: 65 63 6f 6e 64 20 66 6f 72 6d 20 63 68 61 6e 67  econd form chang
4150: 65 73 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  es the secure_de
4160: 6c 65 74 65 0a 20 20 2a 2a 20 66 6c 61 67 20 73  lete.  ** flag s
4170: 65 74 74 69 6e 67 20 61 6e 64 20 72 65 70 6f 72  etting and repor
4180: 74 73 20 74 68 65 6e 65 77 20 76 61 6c 75 65 2e  ts thenew value.
4190: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
41a0: 67 54 79 70 5f 53 45 43 55 52 45 5f 44 45 4c 45  gTyp_SECURE_DELE
41b0: 54 45 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20  TE: {.    Btree 
41c0: 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b  *pBt = pDb->pBt;
41d0: 0a 20 20 20 20 69 6e 74 20 62 20 3d 20 2d 31 3b  .    int b = -1;
41e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
41f0: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  !=0 );.    if( z
4200: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 62  Right ){.      b
4210: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f   = sqlite3GetBoo
4220: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 3b  lean(zRight, 0);
4230: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
4240: 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e 3d  Id2->n==0 && b>=
4250: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
4260: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
4270: 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  0; ii<db->nDb; i
4280: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
4290: 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
42a0: 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b 69  Delete(db->aDb[i
42b0: 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20 20  i].pBt, b);.    
42c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 20    }.    }.    b 
42d0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  = sqlite3BtreeSe
42e0: 63 75 72 65 44 65 6c 65 74 65 28 70 42 74 2c 20  cureDelete(pBt, 
42f0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69  b);.    returnSi
4300: 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b 0a 20  ngleInt(v, b);. 
4310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
4320: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
4330: 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61   [schema.]max_pa
4340: 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 50  ge_count.  **  P
4350: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d  RAGMA [schema.]m
4360: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e 0a  ax_page_count=N.
4370: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
4380: 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73  rst form reports
4390: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
43a0: 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a  ting for the.  *
43b0: 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * maximum number
43c0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
43d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
43e0: 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f 6e   The .  ** secon
43f0: 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74 73 20  d form attempts 
4400: 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73 20 73  to change this s
4410: 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20 20  etting.  Both.  
4420: 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72 6e 20  ** forms return 
4430: 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
4440: 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ing..  **.  ** T
4450: 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75  he absolute valu
4460: 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64 2e 20  e of N is used. 
4470: 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75 6d   This is undocum
4480: 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68 74 0a  ented and might.
4490: 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54 68    ** change.  Th
44a0: 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69  e only purpose i
44b0: 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20  s to provide an 
44c0: 65 61 73 79 20 77 61 79 20 74 6f 20 74 65 73 74  easy way to test
44d0: 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
44e0: 33 41 62 73 49 6e 74 33 32 28 29 20 66 75 6e 63  3AbsInt32() func
44f0: 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion..  **.  ** 
4500: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4510: 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a  ]page_count.  **
4520: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
4530: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
4540: 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   in the specifie
4550: 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
4560: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4570: 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20  PAGE_COUNT: {.  
4580: 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20 20 20    int iReg;.    
4590: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
45a0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
45b0: 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  iDb);.    iReg =
45c0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
45d0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
45e0: 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d  Tolower(zLeft[0]
45f0: 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20 20  )=='p' ){.      
4600: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4610: 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f 75 6e  2(v, OP_Pagecoun
4620: 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b 0a 20  t, iDb, iReg);. 
4630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4640: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4650: 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63 6e 74  3(v, OP_MaxPgcnt
4660: 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a 20 20  , iDb, iReg, .  
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62 73        sqlite3Abs
4690: 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41 74 6f  Int32(sqlite3Ato
46a0: 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20 20 20  i(zRight)));.   
46b0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
46c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
46d0: 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67 2c 20  esultRow, iReg, 
46e0: 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  1);.    break;. 
46f0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
4700: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c  RAGMA [schema.]l
4710: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a 2a  ocking_mode.  **
4720: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4730: 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  .]locking_mode =
4740: 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73 69   (normal|exclusi
4750: 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ve).  */.  case 
4760: 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47 5f  PragTyp_LOCKING_
4770: 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73  MODE: {.    cons
4780: 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 22  t char *zRet = "
4790: 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e 74  normal";.    int
47a0: 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63 6b   eMode = getLock
47b0: 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74 29 3b  ingMode(zRight);
47c0: 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e  ..    if( pId2->
47d0: 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d 50  n==0 && eMode==P
47e0: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
47f0: 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20 20 20  _QUERY ){.      
4800: 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41 47 4d  /* Simple "PRAGM
4810: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b 22  A locking_mode;"
4820: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
4830: 20 69 73 20 61 20 71 75 65 72 79 20 66 6f 72 0a   is a query for.
4840: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
4850: 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f 63  rent default loc
4860: 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69 63 68  king mode (which
4870: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
4880: 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  t to.      ** th
4890: 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6f  e locking-mode o
48a0: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
48b0: 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ase)..      */. 
48c0: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64 62 2d       eMode = db-
48d0: 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a 20  >dfltLockMode;. 
48e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
48f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
4900: 20 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e       if( pId2->n
4910: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
4920: 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
4930: 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62 61 73   that no databas
4940: 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65 63 69  e name was speci
4950: 66 69 65 64 20 61 73 20 70 61 72 74 0a 20 20 20  fied as part.   
4960: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 50       ** of the P
4970: 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20 49  RAGMA command. I
4980: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
4990: 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75 73  locking-mode mus
49a0: 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  t be.        ** 
49b0: 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61 63  set on all attac
49c0: 68 65 64 20 64 61 74 61 62 61 73 65 73 2c 20 61  hed databases, a
49d0: 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d 61  s well as the ma
49e0: 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20 20 20  in db file..    
49f0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
4a00: 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c 69  * Also, the sqli
4a10: 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65  te3.dfltLockMode
4a20: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
4a30: 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   so that.       
4a40: 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71 75 65   ** any subseque
4a50: 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20 64 61  ntly attached da
4a60: 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75 73 65  tabases also use
4a70: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 20   the specified. 
4a80: 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e         ** lockin
4a90: 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20 20  g mode..        
4aa0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4ab0: 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  i;.        asser
4ac0: 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62 5b  t(pDb==&db->aDb[
4ad0: 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  0]);.        for
4ae0: 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e 44  (ii=2; ii<db->nD
4af0: 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  b; ii++){.      
4b00: 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
4b10: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
4b20: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29 3b  b->aDb[ii].pBt);
4b30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4b40: 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
4b50: 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f 64 65  de(pPager, eMode
4b60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4b70: 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63       db->dfltLoc
4b80: 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  kMode = (u8)eMod
4b90: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
4ba0: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
4bb0: 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62 2d  3BtreePager(pDb-
4bc0: 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65 4d 6f  >pBt);.      eMo
4bd0: 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  de = sqlite3Page
4be0: 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61  rLockingMode(pPa
4bf0: 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ger, eMode);.   
4c00: 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
4c10: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
4c20: 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
4c40: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4c50: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
4c60: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f  E );.    if( eMo
4c70: 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
4c80: 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
4c90: 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20  ){.      zRet = 
4ca0: 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20 20 20  "exclusive";.   
4cb0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
4cc0: 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65 74 29  gleText(v, zRet)
4cd0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
4ce0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
4cf0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75  GMA [schema.]jou
4d00: 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20  rnal_mode.  **  
4d10: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4d20: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a 20  journal_mode =. 
4d30: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
4d40: 20 20 20 20 20 20 20 20 20 28 64 65 6c 65 74 65           (delete
4d50: 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74 72 75  |persist|off|tru
4d60: 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77 61 6c  ncate|memory|wal
4d70: 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63 61 73  |off).  */.  cas
4d80: 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41  e PragTyp_JOURNA
4d90: 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 69 6e  L_MODE: {.    in
4da0: 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  t eMode;        
4db0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41  /* One of the PA
4dc0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
4dd0: 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  XXX symbols */. 
4de0: 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
4df0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
4e00: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69 66 28  nter */..    if(
4e10: 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   zRight==0 ){.  
4e20: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
4e30: 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70 61  is no "=MODE" pa
4e40: 72 74 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61  rt of the pragma
4e50: 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66 6f 72  , do a query for
4e60: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 75   the.      ** cu
4e70: 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20 20  rrent mode */.  
4e80: 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47 45      eMode = PAGE
4e90: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
4ea0: 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ERY;.    }else{.
4eb0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
4ec0: 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20 69   *zMode;.      i
4ed0: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
4ee0: 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 3b 0a  rlen30(zRight);.
4ef0: 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64 65 3d        for(eMode=
4f00: 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c 69  0; (zMode = sqli
4f10: 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61  te3JournalModena
4f20: 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20 65  me(eMode))!=0; e
4f30: 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Mode++){.       
4f40: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
4f50: 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d 6f  ICmp(zRight, zMo
4f60: 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65 61  de, n)==0 ) brea
4f70: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4f80: 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a 20   if( !zMode ){. 
4f90: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
4fa0: 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 64 6f   "=MODE" part do
4fb0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79  es not match any
4fc0: 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20 6d   known journal m
4fd0: 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ode,.        ** 
4fe0: 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72 79 20  then do a query 
4ff0: 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  */.        eMode
5000: 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
5010: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20 20 20  MODE_QUERY;.    
5020: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5030: 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  ( eMode==PAGER_J
5040: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
5050: 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29   && pId2->n==0 )
5060: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  {.      /* Conve
5070: 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  rt "PRAGMA journ
5080: 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20 22 50  al_mode" into "P
5090: 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e  RAGMA main.journ
50a0: 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20 20 20  al_mode" */.    
50b0: 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20 20 20    iDb = 0;.     
50c0: 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20 20   pId2->n = 1;.  
50d0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 64    }.    for(ii=d
50e0: 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b  b->nDb-1; ii>=0;
50f0: 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66   ii--){.      if
5100: 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  ( db->aDb[ii].pB
5110: 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c  t && (ii==iDb ||
5120: 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a   pId2->n==0) ){.
5130: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5140: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
5150: 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ii);.        sql
5160: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5170: 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  , OP_JournalMode
5180: 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29 3b  , ii, 1, eMode);
5190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
51a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
51b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
51c0: 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20  tRow, 1, 1);.   
51d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
51e0: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
51f0: 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f  schema.]journal_
5200: 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20  size_limit.  ** 
5210: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
5220: 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69  ]journal_size_li
5230: 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mit=N.  **.  ** 
5240: 47 65 74 20 6f 72 20 73 65 74 20 74 68 65 20 73  Get or set the s
5250: 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72 6f 6c  ize limit on rol
5260: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
5270: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  les..  */.  case
5280: 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41 4c   PragTyp_JOURNAL
5290: 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b 0a 20  _SIZE_LIMIT: {. 
52a0: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
52b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
52c0: 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  ager(pDb->pBt);.
52d0: 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20 3d      i64 iLimit =
52e0: 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a 52 69   -2;.    if( zRi
52f0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ght ){.      sql
5300: 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
5310: 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d 69  4(zRight, &iLimi
5320: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4c  t);.      if( iL
5330: 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d 69 74  imit<-1 ) iLimit
5340: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
5350: 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65   iLimit = sqlite
5360: 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a  3PagerJournalSiz
5370: 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c 20 69  eLimit(pPager, i
5380: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65 74 75  Limit);.    retu
5390: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 69  rnSingleInt(v, i
53a0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72 65 61  Limit);.    brea
53b0: 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f  k;.  }..#endif /
53c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  * SQLITE_OMIT_PA
53d0: 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  GER_PRAGMAS */..
53e0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
53f0: 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f 5f  A [schema.]auto_
5400: 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50 52 41  vacuum.  **  PRA
5410: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74  GMA [schema.]aut
5420: 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a 2a 0a  o_vacuum=N.  **.
5430: 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65 74 20    ** Get or set 
5440: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
5450: 20 64 61 74 61 62 61 73 65 20 27 61 75 74 6f 2d   database 'auto-
5460: 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65 74 65  vacuum' paramete
5470: 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  r..  ** The valu
5480: 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20 30 20  e is one of:  0 
5490: 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20 49 4e  NONE 1 FULL 2 IN
54a0: 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f 0a 23  CREMENTAL.  */.#
54b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
54c0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
54d0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 41 55 54  case PragTyp_AUT
54e0: 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20  O_VACUUM: {.    
54f0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62  Btree *pBt = pDb
5500: 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
5510: 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20  t( pBt!=0 );.   
5520: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
5530: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
5540: 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33  leInt(v, sqlite3
5550: 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
5560: 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20 7d 65  um(pBt));.    }e
5570: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  lse{.      int e
5580: 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f 56 61  Auto = getAutoVa
5590: 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a 20 20  cuum(zRight);.  
55a0: 20 20 20 20 61 73 73 65 72 74 28 20 65 41 75 74      assert( eAut
55b0: 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c 3d 32  o>=0 && eAuto<=2
55c0: 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65   );.      db->ne
55d0: 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75 38 29  xtAutovac = (u8)
55e0: 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f 2a 20  eAuto;.      /* 
55f0: 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61 63 75  Call SetAutoVacu
5600: 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e 69 74  um() to set init
5610: 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74 65 72  ialize the inter
5620: 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20 20 20  nal auto and.   
5630: 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63 75 75     ** incr-vacuu
5640: 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20 69 73  m flags. This is
5650: 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61 73   required in cas
5660: 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  e this connectio
5670: 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74  n.      ** creat
5680: 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
5690: 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d 70 6f  file. It is impo
56a0: 72 74 61 6e 74 20 74 68 61 74 20 69 74 20 69 73  rtant that it is
56b0: 20 63 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a   created.      *
56c0: 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  * as an auto-vac
56d0: 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62 2e 0a  uum capable db..
56e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
56f0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5700: 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42  SetAutoVacuum(pB
5710: 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20 20 20  t, eAuto);.     
5720: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5730: 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d 31 20  OK && (eAuto==1 
5740: 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29 7b 0a  || eAuto==2) ){.
5750: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20          /* When 
5760: 73 65 74 74 69 6e 67 20 74 68 65 20 61 75 74 6f  setting the auto
5770: 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 6f 20  _vacuum mode to 
5780: 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20 6f 72  either "full" or
5790: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 69 6e   .        ** "in
57a0: 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72 69 74  cremental", writ
57b0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  e the value of m
57c0: 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20 64 61  eta[6] in the da
57d0: 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a  tabase.        *
57e0: 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65 20 77  * file. Before w
57f0: 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61 5b 36  riting to meta[6
5800: 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20 6d 65  ], check that me
5810: 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65 73 0a  ta[3] indicates.
5820: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
5830: 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61  this really is a
5840: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  n auto-vacuum ca
5850: 70 61 62 6c 65 20 64 61 74 61 62 61 73 65 2e 0a  pable database..
5860: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
5870: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
5880: 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f  int iLn = VDBE_O
5890: 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b  FFSET_LINENO(2);
58a0: 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20  .        static 
58b0: 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
58c0: 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20 7b 0a   setMeta6[] = {.
58d0: 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54            { OP_T
58e0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30  ransaction,    0
58f0: 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20 20 20  ,         1,    
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c               0},
5910: 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20      /* 0 */.    
5920: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43        { OP_ReadC
5930: 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20 20 20  ookie,     0,   
5940: 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20 20        1,        
5950: 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52   BTREE_LARGEST_R
5960: 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20 20 20  OOT_PAGE},.     
5970: 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20 20 20       { OP_If,   
5980: 20 20 20 20 20 20 20 20 20 20 31 2c 20 20 20 20            1,    
5990: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
59a0: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
59b0: 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  * 2 */.         
59c0: 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20 20   { OP_Halt,     
59d0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2c        SQLITE_OK,
59e0: 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20 20 20   OE_Abort,      
59f0: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20      0},    /* 3 
5a00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f  */.          { O
5a10: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20  P_SetCookie,    
5a20: 20 20 30 2c 20 20 20 20 20 20 20 20 20 42 54 52    0,         BTR
5a30: 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d 2c 20  EE_INCR_VACUUM, 
5a40: 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20  0},    /* 4 */. 
5a50: 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20         };.      
5a60: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
5a70: 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72         int iAddr
5a80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
5a90: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
5aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5ab0: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
5ac0: 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79  equired(v, Array
5ad0: 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29 29 3b  Size(setMeta6));
5ae0: 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d 20 73  .        aOp = s
5af0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
5b00: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
5b10: 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65 74 4d  (setMeta6), setM
5b20: 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20 20 20  eta6, iLn);.    
5b30: 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f      if( ONLY_IF_
5b40: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61  REALLOC_STRESS(a
5b50: 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a  Op==0) ) break;.
5b60: 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70          aOp[0].p
5b70: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20  1 = iDb;.       
5b80: 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62   aOp[1].p1 = iDb
5b90: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d  ;.        aOp[2]
5ba0: 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b 0a 20  .p2 = iAddr+4;. 
5bb0: 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e 70 31         aOp[4].p1
5bc0: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20   = iDb;.        
5bd0: 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41 75 74  aOp[4].p3 = eAut
5be0: 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  o - 1;.        s
5bf0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
5c00: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
5c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
5c20: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
5c30: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
5c40: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 6e 63  GMA [schema.]inc
5c50: 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28  remental_vacuum(
5c60: 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20  N).  **.  ** Do 
5c70: 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63 72 65  N steps of incre
5c80: 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69 6e 67  mental vacuuming
5c90: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 2e 0a   on a database..
5ca0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
5cb0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
5cc0: 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61 67 54  UUM.  case PragT
5cd0: 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c 5f 56  yp_INCREMENTAL_V
5ce0: 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69 6e 74  ACUUM: {.    int
5cf0: 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b 0a 20   iLimit, addr;. 
5d00: 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d 3d 30     if( zRight==0
5d10: 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65 74 49   || !sqlite3GetI
5d20: 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 69 4c  nt32(zRight, &iL
5d30: 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69 74 3c  imit) || iLimit<
5d40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d  =0 ){.      iLim
5d50: 69 74 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b  it = 0x7fffffff;
5d60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5d70: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
5d80: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
5d90: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
5da0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5db0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c 69 6d  OP_Integer, iLim
5dc0: 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72  it, 1);.    addr
5dd0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
5de0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63 72 56  dOp1(v, OP_IncrV
5df0: 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56 64 62  acuum, iDb); Vdb
5e00: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5e10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5e20: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op1(v, OP_Result
5e30: 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Row, 1);.    sql
5e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5e50: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20  , OP_AddImm, 1, 
5e60: 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
5e70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5e80: 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64 72 29  _IfPos, 1, addr)
5e90: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5ea0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5eb0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5ec0: 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  dr);.    break;.
5ed0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e    }.#endif..#ifn
5ee0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5ef0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 20 20  PAGER_PRAGMAS.  
5f00: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
5f10: 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73  [schema.]cache_s
5f20: 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ize.  **  PRAGMA
5f30: 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f   [schema.]cache_
5f40: 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  size=N.  **.  **
5f50: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
5f60: 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72  reports the curr
5f70: 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e  ent local settin
5f80: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70  g for the.  ** p
5f90: 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20  age cache size. 
5fa0: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
5fb0: 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a 20  sets the local. 
5fc0: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
5fd0: 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66 20 4e  ize value.  If N
5fe0: 20 69 73 20 70 6f 73 69 74 69 76 65 20 74 68 65   is positive the
5ff0: 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  n that is the.  
6000: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
6010: 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
6020: 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69    If N is negati
6030: 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ve, then the.  *
6040: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
6050: 73 20 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f  s is adjusted so
6060: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
6070: 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65  uses -N kibibyte
6080: 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  s.  ** of memory
6090: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
60a0: 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49 5a 45  agTyp_CACHE_SIZE
60b0: 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  : {.    assert( 
60c0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
60d0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
60e0: 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  0) );.    if( !z
60f0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72  Right ){.      r
6100: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
6110: 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  , pDb->pSchema->
6120: 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20  cache_size);.   
6130: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
6140: 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  t size = sqlite3
6150: 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  Atoi(zRight);.  
6160: 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61      pDb->pSchema
6170: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73  ->cache_size = s
6180: 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ize;.      sqlit
6190: 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
61a0: 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20 70 44  ize(pDb->pBt, pD
61b0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68  b->pSchema->cach
61c0: 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  e_size);.    }. 
61d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
61e0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
61f0: 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f   [schema.]cache_
6200: 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52 41 47  spill.  **  PRAG
6210: 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d 42  MA cache_spill=B
6220: 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50 52 41  OOLEAN.  **  PRA
6230: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63  GMA [schema.]cac
6240: 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a 2a 0a  he_spill=N.  **.
6250: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
6260: 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20  orm reports the 
6270: 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65  current local se
6280: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
6290: 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 70  ** page cache sp
62a0: 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20 73 65  ill size. The se
62b0: 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e 73 20  cond form turns 
62c0: 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e 0a 20  cache spill on. 
62d0: 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57 68 65   ** or off.  Whe
62e0: 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63 68 65  n turnning cache
62f0: 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65 20 73   spill on, the s
6300: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
6310: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 63  e.  ** current c
6320: 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68 65 20  ache_size.  The 
6330: 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74 73 20  third form sets 
6340: 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74 68 61  a spill size tha
6350: 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 64 69  t.  ** may be di
6360: 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74 68 65  fferent form the
6370: 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 2a   cache size..  *
6380: 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69 74 69  * If N is positi
6390: 76 65 20 74 68 65 6e 20 74 68 61 74 20 69 73 20  ve then that is 
63a0: 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
63b0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
63c0: 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69 73 20  cache.  If N is 
63d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
63e0: 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  he.  ** number o
63f0: 66 20 70 61 67 65 73 20 69 73 20 61 64 6a 75 73  f pages is adjus
6400: 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ted so that the 
6410: 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20 6b 69  cache uses -N ki
6420: 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f 66 20  bibytes.  ** of 
6430: 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a  memory..  **.  *
6440: 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
6450: 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c 20 70  of cache_spill p
6460: 61 67 65 73 20 69 73 20 6c 65 73 73 20 74 68 65  ages is less the
6470: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
6480: 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a 65 20    ** cache_size 
6490: 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c 6c 69  pages, no spilli
64a0: 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69 6c 20  ng occurs until 
64b0: 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 20 65  the page count e
64c0: 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68 65 20  xceeds.  ** the 
64d0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 5f  number of cache_
64e0: 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20 2a 2a  size pages..  **
64f0: 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68 65 5f  .  ** The cache_
6500: 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20 73 65  spill=BOOLEAN se
6510: 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20 74 6f  tting applies to
6520: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 73 63   all attached sc
6530: 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20  hemas,.  ** not 
6540: 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d 61 20  just the schema 
6550: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a  specified..  */.
6560: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
6570: 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20  ACHE_SPILL: {.  
6580: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6590: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
65a0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
65b0: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
65c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
65d0: 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20 20 20  ingleInt(v,.    
65e0: 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 20       (db->flags 
65f0: 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70  & SQLITE_CacheSp
6600: 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20 0a 20  ill)==0 ? 0 : . 
6610: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6620: 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53  e3BtreeSetSpillS
6630: 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30 29 29  ize(pDb->pBt,0))
6640: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6650: 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 31 3b     int size = 1;
6660: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6670: 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67 68  e3GetInt32(zRigh
6680: 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20 20 20  t, &size) ){.   
6690: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
66a0: 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44  eSetSpillSize(pD
66b0: 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b 0a 20  b->pBt, size);. 
66c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
66d0: 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65   sqlite3GetBoole
66e0: 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a 65 21  an(zRight, size!
66f0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64  =0) ){.        d
6700: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
6710: 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20  TE_CacheSpill;. 
6720: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6730: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
6740: 20 7e 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70   ~SQLITE_CacheSp
6750: 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ill;.      }.   
6760: 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c     setAllPagerFl
6770: 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  ags(db);.    }. 
6780: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6790: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
67a0: 20 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73   [schema.]mmap_s
67b0: 69 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a  ize(N).  **.  **
67c0: 20 55 73 65 64 20 74 6f 20 73 65 74 20 6d 61 70   Used to set map
67d0: 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 2e  ping size limit.
67e0: 20 54 68 65 20 6d 61 70 70 69 6e 67 20 73 69 7a   The mapping siz
67f0: 65 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a 20  e limit is.  ** 
6800: 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68  used to limit th
6810: 65 20 61 67 67 72 65 67 61 74 65 20 73 69 7a 65  e aggregate size
6820: 20 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d   of all memory m
6830: 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20 6f 66  apped regions of
6840: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
6850: 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73  se file. If this
6860: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65   parameter is se
6870: 74 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t to zero, then 
6880: 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a 20  memory mapping. 
6890: 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 20   ** is not used 
68a0: 61 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69 73  at all.  If N is
68b0: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
68c0: 74 68 65 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f  the default memo
68d0: 72 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d 69  ry map.  ** limi
68e0: 74 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  t determined by 
68f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
6900: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
6910: 50 5f 53 49 5a 45 29 20 69 73 20 73 65 74 2e 0a  P_SIZE) is set..
6920: 20 20 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74    ** The paramet
6930: 65 72 20 4e 20 69 73 20 6d 65 61 73 75 72 65 64  er N is measured
6940: 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a 0a   in bytes..  **.
6950: 20 20 2a 2a 20 54 68 69 73 20 76 61 6c 75 65 20    ** This value 
6960: 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68  is advisory.  Th
6970: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53  e underlying VFS
6980: 20 69 73 20 66 72 65 65 20 74 6f 20 6d 65 6d 6f   is free to memo
6990: 72 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20 6c  ry map.  ** as l
69a0: 69 74 74 6c 65 20 6f 72 20 61 73 20 6d 75 63 68  ittle or as much
69b0: 20 61 73 20 69 74 20 77 61 6e 74 73 2e 20 20 45   as it wants.  E
69c0: 78 63 65 70 74 2c 20 69 66 20 4e 20 69 73 20 73  xcept, if N is s
69d0: 65 74 20 74 6f 20 30 20 74 68 65 6e 20 74 68 65  et to 0 then the
69e0: 0a 20 20 2a 2a 20 75 70 70 65 72 20 6c 61 79 65  .  ** upper laye
69f0: 72 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 69 6e  rs will never in
6a00: 76 6f 6b 65 20 74 68 65 20 78 46 65 74 63 68 20  voke the xFetch 
6a10: 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20 74 68  interfaces to th
6a20: 65 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63 61  e VFS..  */.  ca
6a30: 73 65 20 50 72 61 67 54 79 70 5f 4d 4d 41 50 5f  se PragTyp_MMAP_
6a40: 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c 69  SIZE: {.    sqli
6a50: 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23 69  te3_int64 sz;.#i
6a60: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
6a70: 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61 73 73  P_SIZE>0.    ass
6a80: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
6a90: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
6aa0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69  iDb, 0) );.    i
6ab0: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
6ac0: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
6ad0: 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
6ae0: 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 73  ToI64(zRight, &s
6af0: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  z);.      if( sz
6b00: 3c 30 20 29 20 73 7a 20 3d 20 73 71 6c 69 74 65  <0 ) sz = sqlite
6b10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
6b20: 4d 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20  Mmap;.      if( 
6b30: 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d  pId2->n==0 ) db-
6b40: 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20 20  >szMmap = sz;.  
6b50: 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e      for(ii=db->n
6b60: 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d  Db-1; ii>=0; ii-
6b70: 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -){.        if( 
6b80: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20  db->aDb[ii].pBt 
6b90: 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70  && (ii==iDb || p
6ba0: 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20  Id2->n==0) ){.  
6bb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
6bc0: 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
6bd0: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
6be0: 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d  , sz);.        }
6bf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6c00: 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20     sz = -1;.    
6c10: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
6c20: 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44  e_control(db, zD
6c30: 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  b, SQLITE_FCNTL_
6c40: 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b  MMAP_SIZE, &sz);
6c50: 0a 23 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d 20  .#else.    sz = 
6c60: 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  0;.    rc = SQLI
6c70: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  TE_OK;.#endif.  
6c80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6c90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
6ca0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
6cb0: 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  sz);.    }else i
6cc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc!=SQLITE_NO
6cd0: 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  TFOUND ){.      
6ce0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
6cf0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
6d00: 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   = rc;.    }.   
6d10: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
6d20: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
6d30: 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a 20  temp_store.  ** 
6d40: 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74    PRAGMA temp_st
6d50: 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74 22 7c  ore = "default"|
6d60: 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22 0a  "memory"|"file".
6d70: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
6d80: 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61   or set the loca
6d90: 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74  l value of the t
6da0: 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e 20  emp_store flag. 
6db0: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
6dc0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64  he local value d
6dd0: 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61  oes not make cha
6de0: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b  nges to the disk
6df0: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 65   file and the de
6e00: 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75 65  fault.  ** value
6e10: 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65   will be restore
6e20: 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  d the next time 
6e30: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
6e40: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  opened..  **.  *
6e50: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69  * Note that it i
6e60: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
6e70: 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70 69  he library compi
6e80: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
6e90: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64 65  to.  ** override
6ea0: 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a 20 20   this setting.  
6eb0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
6ec0: 70 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a  p_TEMP_STORE: {.
6ed0: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
6ee0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
6ef0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e  ingleInt(v, db->
6f00: 74 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20 20  temp_store);.   
6f10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
6f20: 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65 28  angeTempStorage(
6f30: 70 50 61 72 73 65 2c 20 7a 52 69 67 68 74 29 3b  pParse, zRight);
6f40: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6f50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
6f60: 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73     PRAGMA temp_s
6f70: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a 20  tore_directory. 
6f80: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d   **   PRAGMA tem
6f90: 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
6fa0: 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f 72  y = ""|"director
6fb0: 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a  y_name".  **.  *
6fc0: 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
6fd0: 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
6fe0: 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72  of the temp_stor
6ff0: 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61 67  e_directory flag
7000: 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a  .  Changing.  **
7010: 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73 20   the value sets 
7020: 61 20 73 70 65 63 69 66 69 63 20 64 69 72 65 63  a specific direc
7030: 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64 20  tory to be used 
7040: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
7050: 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69 6e  les..  ** Settin
7060: 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69  g to a null stri
7070: 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20 74 68  ng reverts to th
7080: 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70 6f 72  e default tempor
7090: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 65  ary directory se
70a0: 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74 65  arch..  ** If te
70b0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
70c0: 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  y is changed, th
70d0: 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d  en invalidateTem
70e0: 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a 20  pStorage..  **. 
70f0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
7100: 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44 49  yp_TEMP_STORE_DI
7110: 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69  RECTORY: {.    i
7120: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
7130: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
7140: 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f  Text(v, sqlite3_
7150: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b  temp_directory);
7160: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e  .    }else{.#ifn
7170: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7180: 57 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52  WSD.      if( zR
7190: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
71a0: 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
71b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
71c0: 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66  OsAccess(db->pVf
71d0: 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54  s, zRight, SQLIT
71e0: 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
71f0: 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  TE, &res);.     
7200: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7210: 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29  E_OK || res==0 )
7220: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
7230: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7240: 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61  se, "not a writa
7250: 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b  ble directory");
7260: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
7270: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20  pragma_out;.    
7280: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7290: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
72a0: 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20  EMP_STORE==0.   
72b0: 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54      || (SQLITE_T
72c0: 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20  EMP_STORE==1 && 
72d0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d  db->temp_store<=
72e0: 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51  1).       || (SQ
72f0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
7300: 3d 32 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73  =2 && db->temp_s
7310: 74 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20 20 29  tore==1).      )
7320: 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
7330: 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 28  dateTempStorage(
7340: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
7350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7360: 72 65 65 28 73 71 6c 69 74 65 33 5f 74 65 6d 70  ree(sqlite3_temp
7370: 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  _directory);.   
7380: 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d     if( zRight[0]
7390: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
73a0: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
73b0: 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
73c0: 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68  intf("%s", zRigh
73d0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
73e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
73f0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
7400: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  = 0;.      }.#en
7410: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
7420: 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a  IT_WSD */.    }.
7430: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
7440: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7450: 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  N.  /*.  **   PR
7460: 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f  AGMA data_store_
7470: 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20  directory.  **  
7480: 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f   PRAGMA data_sto
7490: 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22  re_directory = "
74a0: 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d  "|"directory_nam
74b0: 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  e".  **.  ** Ret
74c0: 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c  urn or set the l
74d0: 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68  ocal value of th
74e0: 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72  e data_store_dir
74f0: 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43 68  ectory flag.  Ch
7500: 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anging.  ** the 
7510: 76 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65  value sets a spe
7520: 63 69 66 69 63 20 64 69 72 65 63 74 6f 72 79 20  cific directory 
7530: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 64  to be used for d
7540: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 74 68  atabase files th
7550: 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73 70 65  at.  ** were spe
7560: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
7570: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
7580: 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e    Setting to a n
7590: 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72  ull string rever
75a0: 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  ts.  ** to the d
75b0: 65 66 61 75 6c 74 20 64 61 74 61 62 61 73 65 20  efault database 
75c0: 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69 63 68  directory, which
75d0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69   for database fi
75e0: 6c 65 73 20 73 70 65 63 69 66 69 65 64 20 77 69  les specified wi
75f0: 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74 69  th.  ** a relati
7600: 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70 72 6f  ve path will pro
7610: 62 61 62 6c 79 20 62 65 20 62 61 73 65 64 20 6f  bably be based o
7620: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 69  n the current di
7630: 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a  rectory for the.
7640: 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20 44    ** process.  D
7650: 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 70 65  atabase file spe
7660: 63 69 66 69 65 64 20 77 69 74 68 20 61 6e 20 61  cified with an a
7670: 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61 72 65  bsolute path are
7680: 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a 20 20   not impacted.  
7690: 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74 74 69  ** by this setti
76a0: 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ng, regardless o
76b0: 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a  f its value..  *
76c0: 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  *.  */.  case Pr
76d0: 61 67 54 79 70 5f 44 41 54 41 5f 53 54 4f 52 45  agTyp_DATA_STORE
76e0: 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20  _DIRECTORY: {.  
76f0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
7700: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
7710: 67 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74  gleText(v, sqlit
7720: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7730: 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23  y);.    }else{.#
7740: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7750: 49 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28  IT_WSD.      if(
7760: 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20   zRight[0] ){.  
7770: 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20        int res;. 
7780: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
7790: 74 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e  te3OsAccess(db->
77a0: 70 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51  pVfs, zRight, SQ
77b0: 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
77c0: 57 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20  WRITE, &res);.  
77d0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
77e0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d  LITE_OK || res==
77f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
7800: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7810: 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72  Parse, "not a wr
7820: 69 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79  itable directory
7830: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  ");.          go
7840: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
7850: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7860: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7870: 72 65 65 28 73 71 6c 69 74 65 33 5f 64 61 74 61  ree(sqlite3_data
7880: 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  _directory);.   
7890: 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d     if( zRight[0]
78a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
78b0: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
78c0: 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
78d0: 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68  intf("%s", zRigh
78e0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
78f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7900: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
7910: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  = 0;.      }.#en
7920: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
7930: 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a  IT_WSD */.    }.
7940: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
7950: 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
7960: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
7970: 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a  _STYLE.  /*.  **
7980: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
7990: 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  a.]lock_proxy_fi
79a0: 6c 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  le.  **   PRAGMA
79b0: 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70   [schema.]lock_p
79c0: 72 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61 75  roxy_file = ":au
79d0: 74 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f  to:"|"lock_file_
79e0: 70 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  path".  **.  ** 
79f0: 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68  Return or set th
7a00: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  e value of the l
7a10: 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20 66  ock_proxy_file f
7a20: 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20  lag.  Changing. 
7a30: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65   ** the value se
7a40: 74 73 20 61 20 73 70 65 63 69 66 69 63 20 66 69  ts a specific fi
7a50: 6c 65 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  le to be used fo
7a60: 72 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  r database acces
7a70: 73 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20  s locks..  **.  
7a80: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
7a90: 70 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49 4c  p_LOCK_PROXY_FIL
7aa0: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52  E: {.    if( !zR
7ab0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 50 61  ight ){.      Pa
7ac0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71  ger *pPager = sq
7ad0: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
7ae0: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
7af0: 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66 69 6c   char *proxy_fil
7b00: 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20  e_path = NULL;. 
7b10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
7b20: 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  e *pFile = sqlit
7b30: 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
7b40: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
7b50: 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
7b60: 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54  int(pFile, SQLIT
7b70: 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
7b80: 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ILE, .          
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74   &proxy_file_pat
7bb0: 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  h);.      return
7bc0: 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 70 72  SingleText(v, pr
7bd0: 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a  oxy_file_path);.
7be0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7bf0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
7c00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
7c10: 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  er(pDb->pBt);.  
7c20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
7c30: 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *pFile = sqlite
7c40: 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
7c50: 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  r);.      int re
7c60: 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  s;.      if( zRi
7c70: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
7c80: 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46    res=sqlite3OsF
7c90: 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65  ileControl(pFile
7ca0: 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
7cb0: 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20  KPROXYFILE, .   
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20    zRight);.     
7cf0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
7d00: 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46    res=sqlite3OsF
7d10: 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65  ileControl(pFile
7d20: 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
7d30: 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20  KPROXYFILE, .   
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d    NULL);.      }
7d70: 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 21 3d  .      if( res!=
7d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7d90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7da0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 61  rMsg(pParse, "fa
7db0: 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f 63 6b  iled to set lock
7dc0: 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a 20   proxy file");. 
7dd0: 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67         goto prag
7de0: 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ma_out;.      }.
7df0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
7e00: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
7e10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
7e20: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20 20  KING_STYLE */   
7e30: 20 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20 20     .    .  /*.  
7e40: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
7e50: 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73  ema.]synchronous
7e60: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
7e70: 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e  schema.]synchron
7e80: 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41  ous=OFF|ON|NORMA
7e90: 4c 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20 2a  L|FULL|EXTRA.  *
7ea0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72  *.  ** Return or
7eb0: 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76   set the local v
7ec0: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63  alue of the sync
7ed0: 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43  hronous flag.  C
7ee0: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
7ef0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65   local value doe
7f00: 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67  s not make chang
7f10: 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66  es to the disk f
7f20: 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a  ile and the.  **
7f30: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77   default value w
7f40: 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20  ill be restored 
7f50: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  the next time th
7f60: 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 20 20  e database is.  
7f70: 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  ** opened..  */.
7f80: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53    case PragTyp_S
7f90: 59 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20  YNCHRONOUS: {.  
7fa0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
7fb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
7fc0: 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e 73  gleInt(v, pDb->s
7fd0: 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a  afety_level-1);.
7fe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7ff0: 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f   if( !db->autoCo
8000: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
8010: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8020: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
8030: 20 20 20 20 20 22 53 61 66 65 74 79 20 6c 65 76       "Safety lev
8040: 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68  el may not be ch
8050: 61 6e 67 65 64 20 69 6e 73 69 64 65 20 61 20 74  anged inside a t
8060: 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20  ransaction");.  
8070: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8080: 20 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20     int iLevel = 
8090: 28 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  (getSafetyLevel(
80a0: 7a 52 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26  zRight,0,1)+1) &
80b0: 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
80c0: 55 53 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20  US_MASK;.       
80d0: 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29   if( iLevel==0 )
80e0: 20 69 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20   iLevel = 1;.   
80f0: 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79       pDb->safety
8100: 5f 6c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b  _level = iLevel;
8110: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53  .        pDb->bS
8120: 79 6e 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20  yncSet = 1;.    
8130: 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46      setAllPagerF
8140: 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20  lags(db);.      
8150: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
8160: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
8170: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
8180: 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23  ER_PRAGMAS */..#
8190: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
81a0: 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a  IT_FLAG_PRAGMAS.
81b0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46    case PragTyp_F
81c0: 4c 41 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a  LAG: {.    if( z
81d0: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
81e0: 20 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c    setPragmaResul
81f0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20  tColumnNames(v, 
8200: 70 50 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20  pPragma);.      
8210: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
8220: 76 2c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  v, (db->flags & 
8230: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d  pPragma->iArg)!=
8240: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
8250: 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d        int mask =
8260: 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20   pPragma->iArg; 
8270: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69     /* Mask of bi
8280: 74 73 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65  ts to set or cle
8290: 61 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ar. */.      if(
82a0: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
82b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
82c0: 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70   Foreign key sup
82d0: 70 6f 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  port may not be 
82e0: 65 6e 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62  enabled or disab
82f0: 6c 65 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20  led while not.  
8300: 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f        ** in auto
8310: 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a  -commit mode.  *
8320: 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26  /.        mask &
8330: 3d 20 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69  = ~(SQLITE_Forei
8340: 67 6e 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d  gnKeys);.      }
8350: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
8360: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
8370: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75        if( db->au
8380: 74 68 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41  th.authLevel==UA
8390: 55 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20  UTH_User ){.    
83a0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
83b0: 6c 6f 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73  low non-admin us
83c0: 65 72 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ers to modify th
83d0: 65 20 73 63 68 65 6d 61 20 61 72 62 69 74 72 61  e schema arbitra
83e0: 72 69 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  rily */.        
83f0: 6d 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45  mask &= ~(SQLITE
8400: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20  _WriteSchema);. 
8410: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
8420: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8430: 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  GetBoolean(zRigh
8440: 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t, 0) ){.       
8450: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61   db->flags |= ma
8460: 73 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  sk;.      }else{
8470: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  .        db->fla
8480: 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  gs &= ~mask;.   
8490: 20 20 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53       if( mask==S
84a0: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29  QLITE_DeferFKs )
84b0: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
84c0: 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  mCons = 0;.     
84d0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e   }..      /* Man
84e0: 79 20 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72  y of the flag-pr
84f0: 61 67 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65  agmas modify the
8500: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
8510: 62 79 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20  by the SQL .    
8520: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65    ** compiler (e
8530: 67 2e 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73  g. count_changes
8540: 29 2e 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63  ). So add an opc
8550: 6f 64 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c  ode to expire al
8560: 6c 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69  l.      ** compi
8570: 6c 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  led SQL statemen
8580: 74 73 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69  ts after modifyi
8590: 6e 67 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75  ng a pragma valu
85a0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
85b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
85c0: 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op0(v, OP_Expire
85d0: 29 3b 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50  );.      setAllP
85e0: 61 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20  agerFlags(db);. 
85f0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
8600: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
8610: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50  LITE_OMIT_FLAG_P
8620: 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64  RAGMAS */..#ifnd
8630: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8640: 43 48 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20  CHEMA_PRAGMAS.  
8650: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
8660: 20 74 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62   table_info(<tab
8670: 6c 65 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  le>).  **.  ** R
8680: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72  eturn a single r
8690: 6f 77 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ow for each colu
86a0: 6d 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  mn of the named 
86b0: 74 61 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d  table. The colum
86c0: 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72  ns of.  ** the r
86d0: 65 74 75 72 6e 65 64 20 64 61 74 61 20 73 65 74  eturned data set
86e0: 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   are:.  **.  ** 
86f0: 63 69 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75  cid:        Colu
8700: 6d 6e 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20  mn id (numbered 
8710: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
8720: 68 74 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20  ht, starting at 
8730: 30 29 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20  0).  ** name:   
8740: 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a      Column name.
8750: 20 20 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20    ** type:      
8760: 20 43 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   Column declarat
8770: 69 6f 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e  ion type..  ** n
8780: 6f 74 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20  otnull:    True 
8790: 69 66 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73  if 'NOT NULL' is
87a0: 20 70 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20   part of column 
87b0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a  declaration.  **
87c0: 20 64 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65   dflt_value: The
87d0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
87e0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69  or the column, i
87f0: 66 20 61 6e 79 2e 0a 20 20 2a 2f 0a 20 20 63 61  f any..  */.  ca
8800: 73 65 20 50 72 61 67 54 79 70 5f 54 41 42 4c 45  se PragTyp_TABLE
8810: 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68  _INFO: if( zRigh
8820: 74 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  t ){.    Table *
8830: 70 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d  pTab;.    pTab =
8840: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
8850: 62 6c 65 28 70 50 61 72 73 65 2c 20 4c 4f 43 41  ble(pParse, LOCA
8860: 54 45 5f 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74  TE_NOERR, zRight
8870: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
8880: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e  pTab ){.      in
8890: 74 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69 6e  t i, k;.      in
88a0: 74 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a 20  t nHidden = 0;. 
88b0: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f       Column *pCo
88c0: 6c 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  l;.      Index *
88d0: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
88e0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
88f0: 62 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  b);.      pParse
8900: 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20  ->nMem = 6;.    
8910: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
8920: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
8930: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
8940: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
8950: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
8960: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  pTab);.      for
8970: 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (i=0, pCol=pTab-
8980: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  >aCol; i<pTab->n
8990: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
89a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ){.        if( I
89b0: 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43  sHiddenColumn(pC
89c0: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ol) ){.         
89d0: 20 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20   nHidden++;.    
89e0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
89f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a00: 20 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c    if( (pCol->col
8a10: 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f  Flags & COLFLAG_
8a20: 50 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20  PRIMKEY)==0 ){. 
8a30: 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a           k = 0;.
8a40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
8a50: 28 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPk==0 ){.    
8a60: 20 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20        k = 1;.   
8a70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8a80: 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
8a90: 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20  <=pTab->nCol && 
8aa0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d  pPk->aiColumn[k-
8ab0: 31 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20  1]!=i; k++){}.  
8ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8ad0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70 44  assert( pCol->pD
8ae0: 66 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e  flt==0 || pCol->
8af0: 70 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50  pDflt->op==TK_SP
8b00: 41 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  AN );.        sq
8b10: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
8b20: 61 64 28 76 2c 20 31 2c 20 22 69 73 73 69 73 69  ad(v, 1, "issisi
8b30: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
8b40: 20 20 69 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20    i-nHidden,.   
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
8b60: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
8b70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
8b80: 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22  olumnType(pCol,"
8b90: 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "),.            
8ba0: 20 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c     pCol->notNull
8bb0: 20 3f 20 31 20 3a 20 30 2c 0a 20 20 20 20 20 20   ? 1 : 0,.      
8bc0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
8bd0: 44 66 6c 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66  Dflt ? pCol->pDf
8be0: 6c 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30  lt->u.zToken : 0
8bf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8c00: 20 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   k);.        sql
8c10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8c20: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
8c30: 31 2c 20 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 6);.      }. 
8c40: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
8c50: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
8c60: 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20 20 20 49  p_STATS: {.    I
8c70: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
8c80: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 20  HashElem *i;.   
8c90: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
8ca0: 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  4;.    sqlite3Co
8cb0: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
8cc0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
8cd0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
8ce0: 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
8cf0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
8d00: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
8d10: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 20 20 54  ext(i)){.      T
8d20: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
8d30: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
8d40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8d50: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
8d60: 20 22 73 73 69 69 22 2c 0a 20 20 20 20 20 20 20   "ssii",.       
8d70: 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
8d80: 0a 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20  .           0,. 
8d90: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
8da0: 73 7a 54 61 62 52 6f 77 2c 0a 20 20 20 20 20 20  szTabRow,.      
8db0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c       pTab->nRowL
8dc0: 6f 67 45 73 74 29 3b 0a 20 20 20 20 20 20 73 71  ogEst);.      sq
8dd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8de0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
8df0: 20 31 2c 20 34 29 3b 0a 20 20 20 20 20 20 66 6f   1, 4);.      fo
8e00: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
8e10: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
8e20: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
8e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8e40: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c  eMultiLoad(v, 2,
8e50: 20 22 73 69 69 22 2c 0a 20 20 20 20 20 20 20 20   "sii",.        
8e60: 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a     pIdx->zName,.
8e70: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
8e80: 3e 73 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20  >szIdxRow,.     
8e90: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f        pIdx->aiRo
8ea0: 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20  wLogEst[0]);.   
8eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ec0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
8ed0: 75 6c 74 52 6f 77 2c 20 31 2c 20 34 29 3b 0a 20  ultRow, 1, 4);. 
8ee0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8ef0: 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73  .  break;..  cas
8f00: 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f  e PragTyp_INDEX_
8f10: 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74  INFO: if( zRight
8f20: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
8f30: 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Idx;.    Table *
8f40: 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78 20 3d  pTab;.    pIdx =
8f50: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
8f60: 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  x(db, zRight, zD
8f70: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  b);.    if( pIdx
8f80: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
8f90: 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 3b 0a 20  .      int mx;. 
8fa0: 20 20 20 20 20 69 66 28 20 70 50 72 61 67 6d 61       if( pPragma
8fb0: 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ->iArg ){.      
8fc0: 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65    /* PRAGMA inde
8fd0: 78 5f 78 69 6e 66 6f 20 28 6e 65 77 65 72 20 76  x_xinfo (newer v
8fe0: 65 72 73 69 6f 6e 20 77 69 74 68 20 6d 6f 72 65  ersion with more
8ff0: 20 72 6f 77 73 20 61 6e 64 20 63 6f 6c 75 6d 6e   rows and column
9000: 73 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78  s) */.        mx
9010: 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
9020: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
9030: 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20  ->nMem = 6;.    
9040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9050: 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78   /* PRAGMA index
9060: 5f 69 6e 66 6f 20 28 6c 65 67 61 63 79 20 76 65  _info (legacy ve
9070: 72 73 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 20 20  rsion) */.      
9080: 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 4b 65    mx = pIdx->nKe
9090: 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 50  yCol;.        pP
90a0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a  arse->nMem = 3;.
90b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
90c0: 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
90d0: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
90e0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
90f0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
9100: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9110: 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61 67  rse->nMem<=pPrag
9120: 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 20 29  ma->nPragCName )
9130: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
9140: 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<mx; i++){.   
9150: 20 20 20 20 20 69 31 36 20 63 6e 75 6d 20 3d 20       i16 cnum = 
9160: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
9170: 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
9180: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
9190: 76 2c 20 31 2c 20 22 69 69 73 22 2c 20 69 2c 20  v, 1, "iis", i, 
91a0: 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  cnum,.          
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20 3a 20     cnum<0 ? 0 : 
91d0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d  pTab->aCol[cnum]
91e0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
91f0: 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41   if( pPragma->iA
9200: 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
9210: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9220: 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73 69 22  Load(v, 4, "isi"
9230: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ,.            pI
9240: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
9250: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ],.            p
9260: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 0a  Idx->azColl[i],.
9270: 20 20 20 20 20 20 20 20 20 20 20 20 69 3c 70 49              i<pI
9280: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  dx->nKeyCol);.  
9290: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
92a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
92b0: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
92c0: 77 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  w, 1, pParse->nM
92d0: 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  em);.      }.   
92e0: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
92f0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9300: 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66 28 20  INDEX_LIST: if( 
9310: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 49 6e  zRight ){.    In
9320: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54  dex *pIdx;.    T
9330: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
9340: 69 6e 74 20 69 3b 0a 20 20 20 20 70 54 61 62 20  int i;.    pTab 
9350: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
9360: 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a  le(db, zRight, z
9370: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Db);.    if( pTa
9380: 62 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  b ){.      pPars
9390: 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20  e->nMem = 5;.   
93a0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
93b0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
93c0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 66  e, iDb);.      f
93d0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
93e0: 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49 64 78 3b  ndex, i=0; pIdx;
93f0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
9400: 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t, i++){.       
9410: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f   const char *azO
9420: 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c  rigin[] = { "c",
9430: 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a 20 20   "u", "pk" };.  
9440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9450: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9460: 20 22 69 73 69 73 69 22 2c 0a 20 20 20 20 20 20   "isisi",.      
9470: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20       i,.        
9480: 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a     pIdx->zName,.
9490: 20 20 20 20 20 20 20 20 20 20 20 49 73 55 6e 69             IsUni
94a0: 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 2c 0a  queIndex(pIdx),.
94b0: 20 20 20 20 20 20 20 20 20 20 20 61 7a 4f 72 69             azOri
94c0: 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54 79 70  gin[pIdx->idxTyp
94d0: 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e],.           p
94e0: 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
94f0: 72 65 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  re!=0);.        
9500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9510: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
9520: 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20  w, 1, 5);.      
9530: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
9540: 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61  eak;..  case Pra
9550: 67 54 79 70 5f 44 41 54 41 42 41 53 45 5f 4c 49  gTyp_DATABASE_LI
9560: 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ST: {.    int i;
9570: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
9580: 6d 20 3d 20 33 3b 0a 20 20 20 20 66 6f 72 28 69  m = 3;.    for(i
9590: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
95a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  ++){.      if( d
95b0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30  b->aDb[i].pBt==0
95c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
95d0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
95e0: 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d  Db[i].zDbSName!=
95f0: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
9600: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
9610: 76 2c 20 31 2c 20 22 69 73 73 22 2c 0a 20 20 20  v, 1, "iss",.   
9620: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
9630: 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62    db->aDb[i].zDb
9640: 53 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  SName,.         
9650: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
9660: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
9670: 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20  i].pBt));.      
9680: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9690: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
96a0: 77 2c 20 31 2c 20 33 29 3b 0a 20 20 20 20 7d 0a  w, 1, 3);.    }.
96b0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20    }.  break;..  
96c0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4c  case PragTyp_COL
96d0: 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20  LATION_LIST: {. 
96e0: 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
96f0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
9700: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9710: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73  = 2;.    for(p=s
9720: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9730: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 70  db->aCollSeq); p
9740: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
9750: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 43 6f  xt(p)){.      Co
9760: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
9770: 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65  CollSeq *)sqlite
9780: 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20  HashData(p);.   
9790: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
97a0: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69  ltiLoad(v, 1, "i
97b0: 73 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e  s", i++, pColl->
97c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
97d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
97e0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
97f0: 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 2);.    }.  
9800: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
9810: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
9820: 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d 41 53 20  _SCHEMA_PRAGMAS 
9830: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
9840: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
9850: 4b 45 59 0a 20 20 63 61 73 65 20 50 72 61 67 54  KEY.  case PragT
9860: 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c  yp_FOREIGN_KEY_L
9870: 49 53 54 3a 20 69 66 28 20 7a 52 69 67 68 74 20  IST: if( zRight 
9880: 29 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b  ){.    FKey *pFK
9890: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
98a0: 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  b;.    pTab = sq
98b0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
98c0: 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  b, zRight, zDb);
98d0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
98e0: 0a 20 20 20 20 20 20 70 46 4b 20 3d 20 70 54 61  .      pFK = pTa
98f0: 62 2d 3e 70 46 4b 65 79 3b 0a 20 20 20 20 20 20  b->pFKey;.      
9900: 69 66 28 20 70 46 4b 20 29 7b 0a 20 20 20 20 20  if( pFK ){.     
9910: 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20     int i = 0; . 
9920: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
9930: 4d 65 6d 20 3d 20 38 3b 0a 20 20 20 20 20 20 20  Mem = 8;.       
9940: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
9950: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
9960: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 77   iDb);.        w
9970: 68 69 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20 20  hile(pFK){.     
9980: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
9990: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
99a0: 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  <pFK->nCol; j++)
99b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
99c0: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
99d0: 61 64 28 76 2c 20 31 2c 20 22 69 69 73 73 73 73  ad(v, 1, "iissss
99e0: 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ss",.           
99f0: 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20          i,.     
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c                j,
9a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9a20: 20 20 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20      pFK->zTo,.  
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d   pTab->aCol[pFK-
9a50: 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e  >aCol[j].iFrom].
9a60: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
9a70: 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 61            pFK->a
9a80: 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20  Col[j].zCol,.   
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e  actionName(pFK->
9ab0: 61 41 63 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a  aAction[1]),  /*
9ac0: 20 4f 4e 20 55 50 44 41 54 45 20 2a 2f 0a 20 20   ON UPDATE */.  
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d   actionName(pFK-
9af0: 3e 61 41 63 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f  >aAction[0]),  /
9b00: 2a 20 4f 4e 20 44 45 4c 45 54 45 20 2a 2f 0a 20  * ON DELETE */. 
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b20: 20 20 22 4e 4f 4e 45 22 29 3b 0a 20 20 20 20 20    "NONE");.     
9b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9b40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
9b50: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 38 29 3b  esultRow, 1, 8);
9b60: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9b70: 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20         ++i;.    
9b80: 20 20 20 20 20 20 70 46 4b 20 3d 20 70 46 4b 2d        pFK = pFK-
9b90: 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20  >pNextFrom;.    
9ba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9bb0: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9bc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
9bd0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9be0: 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
9bf0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9c00: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
9c10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9c20: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 63  OMIT_TRIGGER.  c
9c30: 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45  ase PragTyp_FORE
9c40: 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a 20 7b  IGN_KEY_CHECK: {
9c50: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 20  .    FKey *pFK; 
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9c70: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
9c80: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 54  straint */.    T
9c90: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
9ca0: 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 74        /* Child t
9cb0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22 52 45  able contain "RE
9cc0: 46 45 52 45 4e 43 45 53 22 20 6b 65 79 77 6f 72  FERENCES" keywor
9cd0: 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  d */.    Table *
9ce0: 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
9cf0: 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20  /* Parent table 
9d00: 74 68 61 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  that child point
9d10: 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e 64 65  s to */.    Inde
9d20: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
9d30: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 74     /* Index in t
9d40: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
9d50: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  */.    int i;   
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9d70: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20   Loop counter:  
9d80: 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75 6d 62  Foreign key numb
9d90: 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  er for pTab */. 
9da0: 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20     int j;       
9db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
9dc0: 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 69 65 6c  p counter:  Fiel
9dd0: 64 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e  d of the foreign
9de0: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61 73 68   key */.    Hash
9df0: 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
9e00: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9e10: 65 72 3a 20 20 4e 65 78 74 20 74 61 62 6c 65 20  er:  Next table 
9e20: 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  in schema */.   
9e30: 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20   int x;         
9e40: 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73 75 6c          /* resul
9e50: 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  t variable */.  
9e60: 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b    int regResult;
9e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 72 65           /* 3 re
9e80: 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
9e90: 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
9ea0: 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79 3b 20      int regKey; 
9eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
9ec0: 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6b  gister to hold k
9ed0: 65 79 20 66 6f 72 20 63 68 65 63 6b 69 6e 67 20  ey for checking 
9ee0: 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20 69 6e  the FK */.    in
9ef0: 74 20 72 65 67 52 6f 77 3b 20 20 20 20 20 20 20  t regRow;       
9f00: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
9f10: 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f 77 20  s to hold a row 
9f20: 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20 20 20  from pTab */.   
9f30: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
9f40: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
9f50: 66 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b 69 6e  f a loop checkin
9f60: 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 2a  g foreign keys *
9f70: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 6b  /.    int addrOk
9f80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9f90: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
9fa0: 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a 20 20   key is OK */.  
9fb0: 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b 20 20    int *aiCols;  
9fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 69 6c           /* chil
9fd0: 64 20 74 6f 20 70 61 72 65 6e 74 20 63 6f 6c 75  d to parent colu
9fe0: 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 0a 20  mn mapping */.. 
9ff0: 20 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70     regResult = p
a000: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
a010: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
a020: 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b 65 79  += 4;.    regKey
a030: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
a040: 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  m;.    regRow = 
a050: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
a060: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
a070: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
a080: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6b 20  se, iDb);.    k 
a090: 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  = sqliteHashFirs
a0a0: 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t(&db->aDb[iDb].
a0b0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
a0c0: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6b 20  );.    while( k 
a0d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  ){.      if( zRi
a0e0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ght ){.        p
a0f0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
a100: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
a110: 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29   0, zRight, zDb)
a120: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b  ;.        k = 0;
a130: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a140: 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
a150: 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
a160: 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 20 20  ata(k);.        
a170: 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65  k = sqliteHashNe
a180: 78 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xt(k);.      }. 
a190: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
a1a0: 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79 3d   || pTab->pFKey=
a1b0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
a1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
a1d0: 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
a1e0: 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
a1f0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
a200: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
a210: 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50 61 72  nCol+regRow>pPar
a220: 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73  se->nMem ) pPars
a230: 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62 2d 3e  e->nMem = pTab->
a240: 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b 0a 20  nCol + regRow;. 
a250: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
a260: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
a270: 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
a280: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
a290: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
a2a0: 74 72 69 6e 67 28 76 2c 20 72 65 67 52 65 73 75  tring(v, regResu
a2b0: 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  lt, pTab->zName)
a2c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c  ;.      for(i=1,
a2d0: 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79   pFK=pTab->pFKey
a2e0: 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d  ; pFK; i++, pFK=
a2f0: 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pFK->pNextFrom){
a300: 0a 20 20 20 20 20 20 20 20 70 50 61 72 65 6e 74  .        pParent
a310: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
a320: 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f  ble(db, pFK->zTo
a330: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , zDb);.        
a340: 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29  if( pParent==0 )
a350: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a360: 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20     pIdx = 0;.   
a370: 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
a380: 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
a390: 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e 75 6d  b, pParent->tnum
a3a0: 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e 7a 4e  , 0, pParent->zN
a3b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 78 20  ame);.        x 
a3c0: 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74  = sqlite3FkLocat
a3d0: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
a3e0: 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49  Parent, pFK, &pI
a3f0: 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  dx, 0);.        
a400: 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20  if( x==0 ){.    
a410: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d        if( pIdx==
a420: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
a430: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
a440: 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 44 62  e(pParse, i, iDb
a450: 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50 5f 4f 70  , pParent, OP_Op
a460: 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20  enRead);.       
a470: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a490: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
a4a0: 65 6e 52 65 61 64 2c 20 69 2c 20 70 49 64 78 2d  enRead, i, pIdx-
a4b0: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
a4c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a4d0: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
a4e0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
a4f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a500: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a510: 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20       k = 0;.    
a520: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a540: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a550: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70  rse->nErr>0 || p
a560: 46 4b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  FK==0 );.      i
a570: 66 28 20 70 46 4b 20 29 20 62 72 65 61 6b 3b 0a  f( pFK ) break;.
a580: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
a590: 2d 3e 6e 54 61 62 3c 69 20 29 20 70 50 61 72 73  ->nTab<i ) pPars
a5a0: 65 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a 20 20 20  e->nTab = i;.   
a5b0: 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c     addrTop = sql
a5c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
a5d0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30 29 3b  , OP_Rewind, 0);
a5e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a5f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c  ;.      for(i=1,
a600: 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79   pFK=pTab->pFKey
a610: 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d  ; pFK; i++, pFK=
a620: 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pFK->pNextFrom){
a630: 0a 20 20 20 20 20 20 20 20 70 50 61 72 65 6e 74  .        pParent
a640: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
a650: 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f  ble(db, pFK->zTo
a660: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , zDb);.        
a670: 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  pIdx = 0;.      
a680: 20 20 61 69 43 6f 6c 73 20 3d 20 30 3b 0a 20 20    aiCols = 0;.  
a690: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e        if( pParen
a6a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78  t ){.          x
a6b0: 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61   = sqlite3FkLoca
a6c0: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
a6d0: 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70  pParent, pFK, &p
a6e0: 49 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b 0a 20  Idx, &aiCols);. 
a6f0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
a700: 20 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   x==0 );.       
a710: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f   }.        addrO
a720: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
a730: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
a740: 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74       if( pParent
a750: 20 26 26 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20   && pIdx==0 ){. 
a760: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 4b 65           int iKe
a770: 79 20 3d 20 70 46 4b 2d 3e 61 43 6f 6c 5b 30 5d  y = pFK->aCol[0]
a780: 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20  .iFrom;.        
a790: 20 20 61 73 73 65 72 74 28 20 69 4b 65 79 3e 3d    assert( iKey>=
a7a0: 30 20 26 26 20 69 4b 65 79 3c 70 54 61 62 2d 3e  0 && iKey<pTab->
a7b0: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  nCol );.        
a7c0: 20 20 69 66 28 20 69 4b 65 79 21 3d 70 54 61 62    if( iKey!=pTab
a7d0: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
a7e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a7f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
a800: 6f 6c 75 6d 6e 2c 20 30 2c 20 69 4b 65 79 2c 20  olumn, 0, iKey, 
a810: 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  regRow);.       
a820: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75       sqlite3Colu
a830: 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
a840: 62 2c 20 69 4b 65 79 2c 20 72 65 67 52 6f 77 29  b, iKey, regRow)
a850: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
a860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a870: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
a880: 67 52 6f 77 2c 20 61 64 64 72 4f 6b 29 3b 20 56  gRow, addrOk); V
a890: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a8a0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
a8b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a8c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a8d0: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72  , OP_Rowid, 0, r
a8e0: 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  egRow);.        
a8f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
a900: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a910: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
a920: 20 69 2c 20 30 2c 20 72 65 67 52 6f 77 29 3b 20   i, 0, regRow); 
a930: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a940: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a950: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
a960: 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  drOk);.         
a970: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
a980: 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56  Here(v, sqlite3V
a990: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
a9a0: 29 2d 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  )-2);.        }e
a9b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
a9c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e  or(j=0; j<pFK->n
a9d0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
a9e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a9f0: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
aa00: 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
aa10: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
aa30: 69 43 6f 6c 73 20 3f 20 61 69 43 6f 6c 73 5b 6a  iCols ? aiCols[j
aa40: 5d 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d  ] : pFK->aCol[j]
aa50: 2e 69 46 72 6f 6d 2c 20 72 65 67 52 6f 77 2b 6a  .iFrom, regRow+j
aa60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
aa70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
aa80: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
aa90: 65 67 52 6f 77 2b 6a 2c 20 61 64 64 72 4f 6b 29  egRow+j, addrOk)
aaa0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
aab0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
aac0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
aad0: 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rent ){.        
aae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
aaf0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
ab00: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
ab10: 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65  pFK->nCol, regKe
ab20: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab40: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
ab50: 69 6e 69 74 79 53 74 72 28 64 62 2c 70 49 64 78  inityStr(db,pIdx
ab60: 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a 20  ), pFK->nCol);. 
ab70: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ab80: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
ab90: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c 20  v, OP_Found, i, 
aba0: 61 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79 2c 20  addrOk, regKey, 
abb0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
abc0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
abd0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
abe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
abf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ac00: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c  (v, OP_Rowid, 0,
ac10: 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a 20   regResult+1);. 
ac20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ac30: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 72  beMultiLoad(v, r
ac40: 65 67 52 65 73 75 6c 74 2b 32 2c 20 22 73 69 22  egResult+2, "si"
ac50: 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29  , pFK->zTo, i-1)
ac60: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ac70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ac80: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67  P_ResultRow, reg
ac90: 52 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20 20 20  Result, 4);.    
aca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
acb0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
acc0: 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20  ddrOk);.        
acd0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ace0: 2c 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20  , aiCols);.     
acf0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
ad00: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ad10: 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64 72 54 6f  _Next, 0, addrTo
ad20: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
ad30: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
ad40: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ad50: 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
ad60: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
ad70: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
ad80: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ad90: 54 52 49 47 47 45 52 29 20 2a 2f 0a 23 65 6e 64  TRIGGER) */.#end
ada0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
adb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
adc0: 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e  GN_KEY) */..#ifn
add0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 63 61 73  def NDEBUG.  cas
ade0: 65 20 50 72 61 67 54 79 70 5f 50 41 52 53 45 52  e PragTyp_PARSER
adf0: 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66  _TRACE: {.    if
ae00: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
ae10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74    if( sqlite3Get
ae20: 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20  Boolean(zRight, 
ae30: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0) ){.        sq
ae40: 6c 69 74 65 33 50 61 72 73 65 72 54 72 61 63 65  lite3ParserTrace
ae50: 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73 65 72  (stdout, "parser
ae60: 3a 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : ");.      }els
ae70: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
ae80: 65 33 50 61 72 73 65 72 54 72 61 63 65 28 30 2c  e3ParserTrace(0,
ae90: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
aea0: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
aeb0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 69  #endif..  /* Rei
aec0: 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b 45 20  nstall the LIKE 
aed0: 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f  and GLOB functio
aee0: 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61 6e 74  ns.  The variant
aef0: 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20 75 73   of LIKE.  ** us
af00: 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73 65 20  ed will be case 
af10: 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e 6f 74  sensitive or not
af20: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
af30: 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 63 61  e RHS..  */.  ca
af40: 73 65 20 50 72 61 67 54 79 70 5f 43 41 53 45 5f  se PragTyp_CASE_
af50: 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 3a 20  SENSITIVE_LIKE: 
af60: 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
af70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
af80: 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e  3RegisterLikeFun
af90: 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c 69 74  ctions(db, sqlit
afa0: 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  e3GetBoolean(zRi
afb0: 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a  ght, 0));.    }.
afc0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69    }.  break;..#i
afd0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54  fndef SQLITE_INT
afe0: 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52  EGRITY_CHECK_ERR
aff0: 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65 20  OR_MAX.# define 
b000: 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59  SQLITE_INTEGRITY
b010: 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58  _CHECK_ERROR_MAX
b020: 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66   100.#endif..#if
b030: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b040: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
b050: 0a 20 20 2f 2a 20 50 72 61 67 6d 61 20 22 71 75  .  /* Pragma "qu
b060: 69 63 6b 5f 63 68 65 63 6b 22 20 69 73 20 72 65  ick_check" is re
b070: 64 75 63 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  duced version of
b080: 20 0a 20 20 2a 2a 20 69 6e 74 65 67 72 69 74 79   .  ** integrity
b090: 5f 63 68 65 63 6b 20 64 65 73 69 67 6e 65 64 20  _check designed 
b0a0: 74 6f 20 64 65 74 65 63 74 20 6d 6f 73 74 20 64  to detect most d
b0b0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
b0c0: 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  on.  ** without 
b0d0: 6d 6f 73 74 20 6f 66 20 74 68 65 20 6f 76 65 72  most of the over
b0e0: 68 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 69  head of a full i
b0f0: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 0a  ntegrity-check..
b100: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
b110: 54 79 70 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  Typ_INTEGRITY_CH
b120: 45 43 4b 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  ECK: {.    int i
b130: 2c 20 6a 2c 20 61 64 64 72 2c 20 6d 78 45 72 72  , j, addr, mxErr
b140: 3b 0a 0a 20 20 20 20 69 6e 74 20 69 73 51 75 69  ;..    int isQui
b150: 63 6b 20 3d 20 28 73 71 6c 69 74 65 33 54 6f 6c  ck = (sqlite3Tol
b160: 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d  ower(zLeft[0])==
b170: 27 71 27 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  'q');..    /* If
b180: 20 74 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d   the PRAGMA comm
b190: 61 6e 64 20 77 61 73 20 6f 66 20 74 68 65 20 66  and was of the f
b1a0: 6f 72 6d 20 22 50 52 41 47 4d 41 20 3c 64 62 3e  orm "PRAGMA <db>
b1b0: 2e 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  .integrity_check
b1c0: 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 69  ",.    ** then i
b1d0: 44 62 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Db is set to the
b1e0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
b1f0: 74 61 62 61 73 65 20 69 64 65 6e 74 69 66 69 65  tabase identifie
b200: 64 20 62 79 20 3c 64 62 3e 2e 0a 20 20 20 20 2a  d by <db>..    *
b210: 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
b220: 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
b230: 20 64 61 74 61 62 61 73 65 20 69 44 62 20 6f 6e   database iDb on
b240: 6c 79 20 69 73 20 76 65 72 69 66 69 65 64 20 62  ly is verified b
b250: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 56 44 42  y.    ** the VDB
b260: 45 20 63 72 65 61 74 65 64 20 62 65 6c 6f 77 2e  E created below.
b270: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
b280: 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
b290: 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 73 69 6d   command was sim
b2a0: 70 6c 79 20 22 50 52 41 47 4d 41 20 69 6e 74 65  ply "PRAGMA inte
b2b0: 67 72 69 74 79 5f 63 68 65 63 6b 22 20 28 6f 72  grity_check" (or
b2c0: 0a 20 20 20 20 2a 2a 20 22 50 52 41 47 4d 41 20  .    ** "PRAGMA 
b2d0: 71 75 69 63 6b 5f 63 68 65 63 6b 22 29 2c 20 74  quick_check"), t
b2e0: 68 65 6e 20 69 44 62 20 69 73 20 73 65 74 20 74  hen iDb is set t
b2f0: 6f 20 30 2e 20 49 6e 20 74 68 69 73 20 63 61 73  o 0. In this cas
b300: 65 2c 20 73 65 74 20 69 44 62 0a 20 20 20 20 2a  e, set iDb.    *
b310: 2a 20 74 6f 20 2d 31 20 68 65 72 65 2c 20 74 6f  * to -1 here, to
b320: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
b330: 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 76  he VDBE should v
b340: 65 72 69 66 79 20 74 68 65 20 69 6e 74 65 67 72  erify the integr
b350: 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6c  ity.    ** of al
b360: 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
b370: 61 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  ases.  */.    as
b380: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a  sert( iDb>=0 );.
b390: 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d      assert( iDb=
b3a0: 3d 30 20 7c 7c 20 70 49 64 32 2d 3e 7a 20 29 3b  =0 || pId2->z );
b3b0: 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 7a  .    if( pId2->z
b3c0: 3d 3d 30 20 29 20 69 44 62 20 3d 20 2d 31 3b 0a  ==0 ) iDb = -1;.
b3d0: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
b3e0: 7a 65 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  ze the VDBE prog
b3f0: 72 61 6d 20 2a 2f 0a 20 20 20 20 70 50 61 72 73  ram */.    pPars
b400: 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20  e->nMem = 6;..  
b410: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 78    /* Set the max
b420: 69 6d 75 6d 20 65 72 72 6f 72 20 63 6f 75 6e 74  imum error count
b430: 20 2a 2f 0a 20 20 20 20 6d 78 45 72 72 20 3d 20   */.    mxErr = 
b440: 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59  SQLITE_INTEGRITY
b450: 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58  _CHECK_ERROR_MAX
b460: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
b470: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b480: 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67 68 74  3GetInt32(zRight
b490: 2c 20 26 6d 78 45 72 72 29 3b 0a 20 20 20 20 20  , &mxErr);.     
b4a0: 20 69 66 28 20 6d 78 45 72 72 3c 3d 30 20 29 7b   if( mxErr<=0 ){
b4b0: 0a 20 20 20 20 20 20 20 20 6d 78 45 72 72 20 3d  .        mxErr =
b4c0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54   SQLITE_INTEGRIT
b4d0: 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41  Y_CHECK_ERROR_MA
b4e0: 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  X;.      }.    }
b4f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b500: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
b510: 65 67 65 72 2c 20 6d 78 45 72 72 2c 20 31 29 3b  eger, mxErr, 1);
b520: 20 20 2f 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64    /* reg[1] hold
b530: 73 20 65 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f  s errors left */
b540: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69  ..    /* Do an i
b550: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f  ntegrity check o
b560: 6e 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  n each database 
b570: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  file */.    for(
b580: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
b590: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 48 61 73 68  i++){.      Hash
b5a0: 45 6c 65 6d 20 2a 78 3b 0a 20 20 20 20 20 20 48  Elem *x;.      H
b5b0: 61 73 68 20 2a 70 54 62 6c 73 3b 0a 20 20 20 20  ash *pTbls;.    
b5c0: 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 0a 20 20    int *aRoot;.  
b5d0: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
b5e0: 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 49 64 78  .      int mxIdx
b5f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
b600: 6e 49 64 78 3b 0a 0a 20 20 20 20 20 20 69 66 28  nIdx;..      if(
b610: 20 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20   OMIT_TEMPDB && 
b620: 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  i==1 ) continue;
b630: 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3e 3d  .      if( iDb>=
b640: 30 20 26 26 20 69 21 3d 69 44 62 20 29 20 63 6f  0 && i!=iDb ) co
b650: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73  ntinue;..      s
b660: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
b670: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
b680: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
b690: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b6a0: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  1(v, OP_IfPos, 1
b6b0: 29 3b 20 2f 2a 20 48 61 6c 74 20 69 66 20 6f 75  ); /* Halt if ou
b6c0: 74 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  t of errors */. 
b6d0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
b6e0: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
b6f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b700: 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b   OP_Halt, 0, 0);
b710: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b720: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b730: 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44  dr);..      /* D
b740: 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63  o an integrity c
b750: 68 65 63 6b 20 6f 66 20 74 68 65 20 42 2d 54 72  heck of the B-Tr
b760: 65 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  ee.      **.    
b770: 20 20 2a 2a 20 42 65 67 69 6e 20 62 79 20 66 69    ** Begin by fi
b780: 6e 64 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 70  nding the root p
b790: 61 67 65 73 20 6e 75 6d 62 65 72 73 0a 20 20 20  ages numbers.   
b7a0: 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61     ** for all ta
b7b0: 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
b7c0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
b7d0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b7e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b7f0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
b800: 64 62 2c 20 69 2c 20 30 29 20 29 3b 0a 20 20 20  db, i, 0) );.   
b810: 20 20 20 70 54 62 6c 73 20 3d 20 26 64 62 2d 3e     pTbls = &db->
b820: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 2d 3e  aDb[i].pSchema->
b830: 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 20 20 66  tblHash;.      f
b840: 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69  or(cnt=0, x=sqli
b850: 74 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c  teHashFirst(pTbl
b860: 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48  s); x; x=sqliteH
b870: 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20  ashNext(x)){.   
b880: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
b890: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
b8a0: 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e  a(x);.        In
b8b0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20  dex *pIdx;.     
b8c0: 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
b8d0: 70 54 61 62 29 20 29 20 63 6e 74 2b 2b 3b 0a 20  pTab) ) cnt++;. 
b8e0: 20 20 20 20 20 20 20 66 6f 72 28 6e 49 64 78 3d         for(nIdx=
b8f0: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
b900: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
b910: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49  =pIdx->pNext, nI
b920: 64 78 2b 2b 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a  dx++){ cnt++; }.
b930: 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 64 78          if( nIdx
b940: 3e 6d 78 49 64 78 20 29 20 6d 78 49 64 78 20 3d  >mxIdx ) mxIdx =
b950: 20 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20   nIdx;.      }. 
b960: 20 20 20 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c       aRoot = sql
b970: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b980: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  N(db, sizeof(int
b990: 29 2a 28 63 6e 74 2b 31 29 29 3b 0a 20 20 20 20  )*(cnt+1));.    
b9a0: 20 20 69 66 28 20 61 52 6f 6f 74 3d 3d 30 20 29    if( aRoot==0 )
b9b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
b9c0: 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74  r(cnt=0, x=sqlit
b9d0: 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73  eHashFirst(pTbls
b9e0: 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61  ); x; x=sqliteHa
b9f0: 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20  shNext(x)){.    
ba00: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
ba10: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
ba20: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64  (x);.        Ind
ba30: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20  ex *pIdx;.      
ba40: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
ba50: 54 61 62 29 20 29 20 61 52 6f 6f 74 5b 63 6e 74  Tab) ) aRoot[cnt
ba60: 2b 2b 5d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  ++] = pTab->tnum
ba70: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  ;.        for(pI
ba80: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
ba90: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
baa0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
bab0: 20 20 20 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d      aRoot[cnt++]
bac0: 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
bad0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
bae0: 0a 20 20 20 20 20 20 61 52 6f 6f 74 5b 63 6e 74  .      aRoot[cnt
baf0: 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  ] = 0;..      /*
bb00: 20 4d 61 6b 65 20 73 75 72 65 20 73 75 66 66 69   Make sure suffi
bb10: 63 69 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  cient number of 
bb20: 72 65 67 69 73 74 65 72 73 20 68 61 76 65 20 62  registers have b
bb30: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
bb40: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
bb50: 4d 65 6d 20 3d 20 4d 41 58 28 20 70 50 61 72 73  Mem = MAX( pPars
bb60: 65 2d 3e 6e 4d 65 6d 2c 20 38 2b 6d 78 49 64 78  e->nMem, 8+mxIdx
bb70: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f   );..      /* Do
bb80: 20 74 68 65 20 62 2d 74 72 65 65 20 69 6e 74 65   the b-tree inte
bb90: 67 72 69 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a  grity checks */.
bba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bbb0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e  eAddOp4(v, OP_In
bbc0: 74 65 67 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e  tegrityCk, 2, cn
bbd0: 74 2c 20 31 2c 20 28 63 68 61 72 2a 29 61 52 6f  t, 1, (char*)aRo
bbe0: 6f 74 2c 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  ot,P4_INTARRAY);
bbf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bc00: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
bc10: 38 29 69 29 3b 0a 20 20 20 20 20 20 61 64 64 72  8)i);.      addr
bc20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
bc30: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
bc40: 6c 2c 20 32 29 3b 20 56 64 62 65 43 6f 76 65 72  l, 2); VdbeCover
bc50: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
bc60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
bc70: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
bc80: 2c 20 33 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 3, 0,.        
bc90: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
bca0: 64 62 2c 20 22 2a 2a 2a 20 69 6e 20 64 61 74 61  db, "*** in data
bcb0: 62 61 73 65 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20  base %s ***\n", 
bcc0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
bcd0: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 50  ame),.         P
bce0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
bcf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bd00: 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20  Op3(v, OP_Move, 
bd10: 32 2c 20 34 2c 20 31 29 3b 0a 20 20 20 20 20 20  2, 4, 1);.      
bd20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bd30: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
bd40: 34 2c 20 33 2c 20 32 29 3b 0a 20 20 20 20 20 20  4, 3, 2);.      
bd50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bd60: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
bd70: 77 2c 20 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  w, 2, 1);.      
bd80: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
bd90: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20  ere(v, addr);.. 
bda0: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
bdb0: 65 20 61 6c 6c 20 74 68 65 20 69 6e 64 69 63 65  e all the indice
bdc0: 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74 65  s are constructe
bdd0: 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20  d correctly..   
bde0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28     */.      for(
bdf0: 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  x=sqliteHashFirs
be00: 74 28 70 54 62 6c 73 29 3b 20 78 20 26 26 20 21  t(pTbls); x && !
be10: 69 73 51 75 69 63 6b 3b 20 78 3d 73 71 6c 69 74  isQuick; x=sqlit
be20: 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20  eHashNext(x)){. 
be30: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
be40: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
be50: 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20  ata(x);.        
be60: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 2a 70 50  Index *pIdx, *pP
be70: 6b 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  k;.        Index
be80: 20 2a 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20   *pPrior = 0;.  
be90: 20 20 20 20 20 20 69 6e 74 20 6c 6f 6f 70 54 6f        int loopTo
bea0: 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  p;.        int i
beb0: 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72  DataCur, iIdxCur
bec0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
bed0: 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 20 20 20 20   = -1;..        
bee0: 69 66 28 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  if( pTab->pIndex
bef0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
bf00: 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20 48 61          pPk = Ha
bf10: 73 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20 30  sRowid(pTab) ? 0
bf20: 20 3a 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   : sqlite3Primar
bf30: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
bf40: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
bf50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bf60: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  1(v, OP_IfPos, 1
bf70: 29 3b 20 20 2f 2a 20 53 74 6f 70 20 69 66 20 6f  );  /* Stop if o
bf80: 75 74 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  ut of errors */.
bf90: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
bfa0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
bfb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bfc0: 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30  p2(v, OP_Halt, 0
bfd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
bfe0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
bff0: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
c000: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c010: 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
c020: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c030: 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e  e3OpenTableAndIn
c040: 64 69 63 65 73 28 70 50 61 72 73 65 2c 20 70 54  dices(pParse, pT
c050: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  ab, OP_OpenRead,
c060: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 26 69 44         1, 0, &iD
c090: 61 74 61 43 75 72 2c 20 26 69 49 64 78 43 75 72  ataCur, &iIdxCur
c0a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c0b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c0c0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 37  OP_Integer, 0, 7
c0d0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
c0e0: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
c0f0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
c100: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
c110: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
c120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c130: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
c140: 30 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65  0, 8+j); /* inde
c150: 78 20 65 6e 74 72 69 65 73 20 63 6f 75 6e 74 65  x entries counte
c160: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  r */.        }. 
c170: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c180: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a  Parse->nMem>=8+j
c190: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
c1a0: 72 74 28 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d  rt( sqlite3NoTem
c1b0: 70 73 49 6e 52 61 6e 67 65 28 70 50 61 72 73 65  psInRange(pParse
c1c0: 2c 31 2c 37 2b 6a 29 20 29 3b 0a 20 20 20 20 20  ,1,7+j) );.     
c1d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c1e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
c1f0: 64 2c 20 69 44 61 74 61 43 75 72 2c 20 30 29 3b  d, iDataCur, 0);
c200: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
c210: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6f 70 54 6f  ;.        loopTo
c220: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
c230: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
c240: 6d 6d 2c 20 37 2c 20 31 29 3b 0a 20 20 20 20 20  mm, 7, 1);.     
c250: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
c260: 74 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63  t all NOT NULL c
c270: 6f 6c 75 6d 6e 73 20 72 65 61 6c 6c 79 20 61 72  olumns really ar
c280: 65 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e NOT NULL */.  
c290: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
c2a0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
c2b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
c2c0: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20  r *zErr;.       
c2d0: 20 20 20 69 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70     int jmp2, jmp
c2e0: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  3;.          if(
c2f0: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
c300: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
c310: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
c320: 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
c330: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
c340: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c350: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
c360: 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
c370: 2c 20 69 44 61 74 61 43 75 72 2c 20 6a 2c 20 33  , iDataCur, j, 3
c380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
c390: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
c3a0: 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
c3b0: 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20  FARG);.         
c3c0: 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56   jmp2 = sqlite3V
c3d0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
c3e0: 4e 6f 74 4e 75 6c 6c 2c 20 33 29 3b 20 56 64 62  NotNull, 3); Vdb
c3f0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c400: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c410: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c420: 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 20  AddImm, 1, -1); 
c430: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 65 72 72  /* Decrement err
c440: 6f 72 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20  or limit */.    
c450: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c        zErr = sql
c460: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
c470: 22 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 25  "NULL value in %
c480: 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
c490: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e    pTab->aCol[j].
c4c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
c4d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c4e0: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
c4f0: 38 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72  8, 0, 3, 0, zErr
c500: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
c510: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c520: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c530: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31  _ResultRow, 3, 1
c540: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70  );.          jmp
c550: 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  3 = sqlite3VdbeA
c560: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
c570: 73 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72  s, 1); VdbeCover
c580: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
c590: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c5a0: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
c5b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c5c0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c5d0: 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20  , jmp2);.       
c5e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
c5f0: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 33 29 3b  mpHere(v, jmp3);
c600: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c610: 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 69     /* Validate i
c620: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 66 6f 72  ndex entries for
c630: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
c640: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
c650: 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  j=0, pIdx=pTab->
c660: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
c670: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
c680: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
c690: 69 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20  int jmp2, jmp3, 
c6a0: 6a 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20 20 20 20  jmp4, jmp5;.    
c6b0: 20 20 20 20 20 20 69 6e 74 20 63 6b 55 6e 69 71        int ckUniq
c6c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
c6d0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
c6e0: 20 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70        if( pPk==p
c6f0: 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Idx ) continue;.
c700: 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73            r1 = s
c710: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
c720: 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
c730: 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20 30  Idx, iDataCur, 0
c740: 2c 20 30 2c 20 26 6a 6d 70 33 2c 0a 20 20 20 20  , 0, &jmp3,.    
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 20 20 20 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a     pPrior, r1);.
c780: 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72            pPrior
c790: 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
c7a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c7b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
c7c0: 6d 2c 20 38 2b 6a 2c 20 31 29 3b 20 20 2f 2a 20  m, 8+j, 1);  /* 
c7d0: 69 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72 79 20  increment entry 
c7e0: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  count */.       
c7f0: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
c800: 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
c810: 20 65 78 69 73 74 73 20 66 6f 72 20 74 68 65 20   exists for the 
c820: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 72 6f  current table ro
c830: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6a  w */.          j
c840: 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mp2 = sqlite3Vdb
c850: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
c860: 5f 46 6f 75 6e 64 2c 20 69 49 64 78 43 75 72 2b  _Found, iIdxCur+
c870: 6a 2c 20 63 6b 55 6e 69 71 2c 20 72 31 2c 0a 20  j, ckUniq, r1,. 
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75       pIdx->nColu
c8b0: 6d 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  mn); VdbeCoverag
c8c0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
c8d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c8e0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
c8f0: 31 2c 20 2d 31 29 3b 20 2f 2a 20 44 65 63 72 65  1, -1); /* Decre
c900: 6d 65 6e 74 20 65 72 72 6f 72 20 6c 69 6d 69 74  ment error limit
c910: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
c920: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
c930: 69 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77 20 22  ing(v, 3, "row "
c940: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
c950: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c960: 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 37 2c 20  , OP_Concat, 7, 
c970: 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 3);.         
c980: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
c990: 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 22 20 6d  String(v, 4, " m
c9a0: 69 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65  issing from inde
c9b0: 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  x ");.          
c9c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c9d0: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
c9e0: 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20  4, 3, 3);.      
c9f0: 20 20 20 20 6a 6d 70 35 20 3d 20 73 71 6c 69 74      jmp5 = sqlit
ca00: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
ca10: 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e 61  (v, 4, pIdx->zNa
ca20: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
ca30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ca40: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34  (v, OP_Concat, 4
ca50: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 3, 3);.       
ca60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ca70: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
ca80: 74 52 6f 77 2c 20 33 2c 20 31 29 3b 0a 20 20 20  tRow, 3, 1);.   
ca90: 20 20 20 20 20 20 20 6a 6d 70 34 20 3d 20 73 71         jmp4 = sq
caa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
cab0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31 29 3b  v, OP_IfPos, 1);
cac0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
cad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cae0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
caf0: 20 4f 50 5f 48 61 6c 74 29 3b 0a 20 20 20 20 20   OP_Halt);.     
cb00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cb10: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32  JumpHere(v, jmp2
cb20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
cb30: 46 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78  For UNIQUE index
cb40: 65 73 2c 20 76 65 72 69 66 79 20 74 68 61 74 20  es, verify that 
cb50: 6f 6e 6c 79 20 6f 6e 65 20 65 6e 74 72 79 20 65  only one entry e
cb60: 78 69 73 74 73 20 77 69 74 68 20 74 68 65 0a 20  xists with the. 
cb70: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72           ** curr
cb80: 65 6e 74 20 6b 65 79 2e 20 20 54 68 65 20 65 6e  ent key.  The en
cb90: 74 72 79 20 69 73 20 75 6e 69 71 75 65 20 69 66  try is unique if
cba0: 20 28 31 29 20 61 6e 79 20 63 6f 6c 75 6d 6e 20   (1) any column 
cbb0: 69 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20  is NULL.        
cbc0: 20 20 2a 2a 20 6f 72 20 28 32 29 20 74 68 65 20    ** or (2) the 
cbd0: 6e 65 78 74 20 65 6e 74 72 79 20 68 61 73 20 61  next entry has a
cbe0: 20 64 69 66 66 65 72 65 6e 74 20 6b 65 79 20 2a   different key *
cbf0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
cc00: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
cc10: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dx) ){.         
cc20: 20 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20 3d 20     int uniqOk = 
cc30: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
cc40: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
cc50: 20 20 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20       int jmp6;. 
cc60: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
cc70: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  k;.            f
cc80: 6f 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78  or(kk=0; kk<pIdx
cc90: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29  ->nKeyCol; kk++)
cca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
ccb0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d  int iCol = pIdx-
ccc0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20  >aiColumn[kk];. 
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
cce0: 65 72 74 28 20 69 43 6f 6c 21 3d 58 4e 5f 52 4f  ert( iCol!=XN_RO
ccf0: 57 49 44 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  WID && iCol<pTab
cd00: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
cd10: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
cd20: 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e 61 43 6f  >=0 && pTab->aCo
cd30: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
cd40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
cd50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cd60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cd70: 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b 6b 2c  P_IsNull, r1+kk,
cd80: 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20   uniqOk);.      
cd90: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
cda0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
cdb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
cdc0: 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69 74 65     jmp6 = sqlite
cdd0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
cde0: 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2b  P_Next, iIdxCur+
cdf0: 6a 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  j); VdbeCoverage
ce00: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
ce10: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
ce20: 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20  (v, uniqOk);.   
ce30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ce40: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
ce50: 6a 6d 70 36 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp6);.         
ce60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ce70: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
ce80: 78 47 54 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20  xGT, iIdxCur+j, 
ce90: 75 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20 20 20 20  uniqOk, r1,.    
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
cec0: 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
ced0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
cee0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cef0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cf00: 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29  P_AddImm, 1, -1)
cf10: 3b 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 65  ; /* Decrement e
cf20: 72 72 6f 72 20 6c 69 6d 69 74 20 2a 2f 0a 20 20  rror limit */.  
cf30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cf40: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
cf50: 76 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69 71 75  v, 3, "non-uniqu
cf60: 65 20 65 6e 74 72 79 20 69 6e 20 69 6e 64 65 78  e entry in index
cf70: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ");.           
cf80: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
cf90: 28 76 2c 20 6a 6d 70 35 29 3b 0a 20 20 20 20 20  (v, jmp5);.     
cfa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cfb0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
cfc0: 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20  , uniqOk);.     
cfd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
cfe0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
cff0: 48 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b 0a 20  Here(v, jmp4);. 
d000: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d010: 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61  ResolvePartIdxLa
d020: 62 65 6c 28 70 50 61 72 73 65 2c 20 6a 6d 70 33  bel(pParse, jmp3
d030: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d040: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d050: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
d060: 74 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 6f 6f  t, iDataCur, loo
d070: 70 54 6f 70 29 3b 20 56 64 62 65 43 6f 76 65 72  pTop); VdbeCover
d080: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
d090: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
d0a0: 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31  ere(v, loopTop-1
d0b0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
d0c0: 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
d0d0: 54 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  T.        sqlite
d0e0: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
d0f0: 76 2c 20 32 2c 20 22 77 72 6f 6e 67 20 23 20 6f  v, 2, "wrong # o
d100: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 69 6e 64  f entries in ind
d110: 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66  ex ");.        f
d120: 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61  or(j=0, pIdx=pTa
d130: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
d140: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
d150: 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t, j++){.       
d160: 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78     if( pPk==pIdx
d170: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d180: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
d190: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
d1a0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
d1b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d1c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
d1d0: 2c 20 31 2c 20 61 64 64 72 2b 32 29 3b 20 56 64  , 1, addr+2); Vd
d1e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d1f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d200: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d210: 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  _Halt, 0, 0);.  
d220: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d230: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d240: 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2b 6a  Count, iIdxCur+j
d250: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
d260: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d270: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 38 2b 6a 2c  3(v, OP_Eq, 8+j,
d280: 20 61 64 64 72 2b 38 2c 20 33 29 3b 20 56 64 62   addr+8, 3); Vdb
d290: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d2a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d2b0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
d2c0: 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  QLITE_NOTNULL);.
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 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29  P_AddImm, 1, -1)
d300: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d310: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
d320: 67 28 76 2c 20 33 2c 20 70 49 64 78 2d 3e 7a 4e  g(v, 3, pIdx->zN
d330: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
d340: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d350: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
d360: 33 2c 20 32 2c 20 37 29 3b 0a 20 20 20 20 20 20  3, 2, 7);.      
d370: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d380: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
d390: 6c 74 52 6f 77 2c 20 37 2c 20 31 29 3b 0a 20 20  ltRow, 7, 1);.  
d3a0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f        }.#endif /
d3b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  * SQLITE_OMIT_BT
d3c0: 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20  REECOUNT */.    
d3d0: 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 20 20 7b    } .    }.    {
d3e0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
d3f0: 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44  nst int iLn = VD
d400: 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f  BE_OFFSET_LINENO
d410: 28 32 29 3b 0a 20 20 20 20 20 20 73 74 61 74 69  (2);.      stati
d420: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
d430: 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20 3d 20 7b  st endCode[] = {
d440: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 41 64  .        { OP_Ad
d450: 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c  dImm,      1, 0,
d460: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
d470: 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 0 */.        {
d480: 20 4f 50 5f 49 66 2c 20 20 20 20 20 20 20 20 20   OP_If,         
d490: 20 31 2c 20 34 2c 20 20 20 20 20 20 20 20 30 7d   1, 4,        0}
d4a0: 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20  ,    /* 1 */.   
d4b0: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
d4c0: 38 2c 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20  8,     0, 3,    
d4d0: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20      0},    /* 2 
d4e0: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
d4f0: 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 33 2c 20  ResultRow,   3, 
d500: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  1,        0},   
d510: 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7d   /* 3 */.      }
d520: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
d530: 61 4f 70 3b 0a 0a 20 20 20 20 20 20 61 4f 70 20  aOp;..      aOp 
d540: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d550: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
d560: 69 7a 65 28 65 6e 64 43 6f 64 65 29 2c 20 65 6e  ize(endCode), en
d570: 64 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a 20 20 20  dCode, iLn);.   
d580: 20 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20     if( aOp ){.  
d590: 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 32 20        aOp[0].p2 
d5a0: 3d 20 2d 6d 78 45 72 72 3b 0a 20 20 20 20 20 20  = -mxErr;.      
d5b0: 20 20 61 4f 70 5b 32 5d 2e 70 34 74 79 70 65 20    aOp[2].p4type 
d5c0: 3d 20 50 34 5f 53 54 41 54 49 43 3b 0a 20 20 20  = P4_STATIC;.   
d5d0: 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 2e 7a       aOp[2].p4.z
d5e0: 20 3d 20 22 6f 6b 22 3b 0a 20 20 20 20 20 20 7d   = "ok";.      }
d5f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
d600: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ak;.#endif /* SQ
d610: 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
d620: 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
d630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d640: 54 5f 55 54 46 31 36 0a 20 20 2f 2a 0a 20 20 2a  T_UTF16.  /*.  *
d650: 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  *   PRAGMA encod
d660: 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ing.  **   PRAGM
d670: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75 74  A encoding = "ut
d680: 66 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c 22 75  f-8"|"utf-16"|"u
d690: 74 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31 36  tf-16le"|"utf-16
d6a0: 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  be".  **.  ** In
d6b0: 20 69 74 73 20 66 69 72 73 74 20 66 6f 72 6d 2c   its first form,
d6c0: 20 74 68 69 73 20 70 72 61 67 6d 61 20 72 65 74   this pragma ret
d6d0: 75 72 6e 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  urns the encodin
d6e0: 67 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 20 20  g of the main.  
d6f0: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  ** database. If 
d700: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
d710: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  not initialized,
d720: 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   it is initializ
d730: 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a  ed now..  **.  *
d740: 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  * The second for
d750: 6d 20 6f 66 20 74 68 69 73 20 70 72 61 67 6d 61  m of this pragma
d760: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
d770: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
d780: 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6e   file.  ** has n
d790: 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
d7a0: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 6e 20  initialized. In 
d7b0: 74 68 69 73 20 63 61 73 65 20 69 74 20 73 65 74  this case it set
d7c0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20  s the default.  
d7d0: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68 61 74  ** encoding that
d7e0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
d7f0: 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
d800: 61 73 65 20 66 69 6c 65 20 69 66 20 61 20 6e 65  ase file if a ne
d810: 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 63  w file.  ** is c
d820: 72 65 61 74 65 64 2e 20 49 66 20 61 6e 20 65 78  reated. If an ex
d830: 69 73 74 69 6e 67 20 6d 61 69 6e 20 64 61 74 61  isting main data
d840: 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
d850: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ned, then the.  
d860: 2a 2a 20 64 65 66 61 75 6c 74 20 74 65 78 74 20  ** default text 
d870: 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65  encoding for the
d880: 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
d890: 73 65 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2a  se is used..  **
d8a0: 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20 63 61   .  ** In all ca
d8b0: 73 65 73 20 6e 65 77 20 64 61 74 61 62 61 73 65  ses new database
d8c0: 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  s created using 
d8d0: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
d8e0: 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63 72 65 61  nd are.  ** crea
d8f0: 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 73  ted to use the s
d900: 61 6d 65 20 64 65 66 61 75 6c 74 20 74 65 78 74  ame default text
d910: 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 74 68 65   encoding as the
d920: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
d930: 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e  If.  ** the main
d940: 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f   database has no
d950: 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  t been initializ
d960: 65 64 20 61 6e 64 2f 6f 72 20 63 72 65 61 74 65  ed and/or create
d970: 64 20 77 68 65 6e 20 41 54 54 41 43 48 0a 20 20  d when ATTACH.  
d980: 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64 2c 20  ** is executed, 
d990: 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  this is done bef
d9a0: 6f 72 65 20 74 68 65 20 41 54 54 41 43 48 20 6f  ore the ATTACH o
d9b0: 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20  peration..  **. 
d9c0: 20 2a 2a 20 49 6e 20 74 68 65 20 73 65 63 6f 6e   ** In the secon
d9d0: 64 20 66 6f 72 6d 20 74 68 69 73 20 70 72 61 67  d form this prag
d9e0: 6d 61 20 73 65 74 73 20 74 68 65 20 74 65 78 74  ma sets the text
d9f0: 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65 20   encoding to be 
da00: 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e 65 77  used in.  ** new
da10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
da20: 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
da30: 69 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  is database hand
da40: 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a 20  le. It is only. 
da50: 20 2a 2a 20 75 73 65 66 75 6c 20 69 66 20 69 6e   ** useful if in
da60: 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  voked immediatel
da70: 79 20 61 66 74 65 72 20 74 68 65 20 6d 61 69 6e  y after the main
da80: 20 64 61 74 61 62 61 73 65 20 69 0a 20 20 2a 2f   database i.  */
da90: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
daa0: 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20 20 20 20  ENCODING: {.    
dab0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
dac0: 75 63 74 20 45 6e 63 4e 61 6d 65 20 7b 0a 20 20  uct EncName {.  
dad0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
dae0: 0a 20 20 20 20 20 20 75 38 20 65 6e 63 3b 0a 20  .      u8 enc;. 
daf0: 20 20 20 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d 20     } encnames[] 
db00: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 55 54 46  = {.      { "UTF
db10: 38 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 55  8",     SQLITE_U
db20: 54 46 38 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  TF8        },.  
db30: 20 20 20 20 7b 20 22 55 54 46 2d 38 22 2c 20 20      { "UTF-8",  
db40: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20 20    SQLITE_UTF8   
db50: 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74       },  /* Must
db60: 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 31 5d 20   be element [1] 
db70: 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d  */.      { "UTF-
db80: 31 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  16le", SQLITE_UT
db90: 46 31 36 4c 45 20 20 20 20 20 7d 2c 20 20 2f 2a  F16LE     },  /*
dba0: 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74   Must be element
dbb0: 20 5b 32 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20   [2] */.      { 
dbc0: 22 55 54 46 2d 31 36 62 65 22 2c 20 53 51 4c 49  "UTF-16be", SQLI
dbd0: 54 45 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d  TE_UTF16BE     }
dbe0: 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c  ,  /* Must be el
dbf0: 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a 20 20 20  ement [3] */.   
dc00: 20 20 20 7b 20 22 55 54 46 31 36 6c 65 22 2c 20     { "UTF16le", 
dc10: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
dc20: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
dc30: 55 54 46 31 36 62 65 22 2c 20 20 53 51 4c 49 54  UTF16be",  SQLIT
dc40: 45 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c  E_UTF16BE     },
dc50: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36  .      { "UTF-16
dc60: 22 2c 20 20 20 30 20 20 20 20 20 20 20 20 20 20  ",   0          
dc70: 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51          }, /* SQ
dc80: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
dc90: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46   */.      { "UTF
dca0: 31 36 22 2c 20 20 20 20 30 20 20 20 20 20 20 20  16",    0       
dcb0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a             }, /*
dcc0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
dcd0: 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 30  IVE */.      { 0
dce0: 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20  , 0 }.    };.   
dcf0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45 6e   const struct En
dd00: 63 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a 20 20 20  cName *pEnc;.   
dd10: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 20   if( !zRight ){ 
dd20: 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e     /* "PRAGMA en
dd30: 63 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20 20 20  coding" */.     
dd40: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64   if( sqlite3Read
dd50: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
dd60: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
dd70: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
dd80: 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f  encnames[SQLITE_
dd90: 55 54 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54  UTF8].enc==SQLIT
dda0: 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20  E_UTF8 );.      
ddb0: 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73  assert( encnames
ddc0: 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 5d  [SQLITE_UTF16LE]
ddd0: 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  .enc==SQLITE_UTF
dde0: 31 36 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73  16LE );.      as
ddf0: 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53  sert( encnames[S
de00: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 5d 2e 65  QLITE_UTF16BE].e
de10: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
de20: 42 45 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  BE );.      retu
de30: 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20  rnSingleText(v, 
de40: 65 6e 63 6e 61 6d 65 73 5b 45 4e 43 28 70 50 61  encnames[ENC(pPa
de50: 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61 6d 65 29  rse->db)].zName)
de60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20  ;.    }else{    
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65      /* "PRAGMA e
de90: 6e 63 6f 64 69 6e 67 20 3d 20 58 58 58 22 20 2a  ncoding = XXX" *
dea0: 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  /.      /* Only 
deb0: 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
dec0: 20 6f 66 20 73 71 6c 69 74 65 2e 65 6e 63 20 69   of sqlite.enc i
ded0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
dee0: 61 6e 64 6c 65 20 69 73 20 6e 6f 74 0a 20 20 20  andle is not.   
def0: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
df00: 64 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  d. If the main d
df10: 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2c 20  atabase exists, 
df20: 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 2e 65  the new sqlite.e
df30: 6e 63 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  nc value.      *
df40: 2a 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  * will be overwr
df50: 69 74 74 65 6e 20 77 68 65 6e 20 74 68 65 20 73  itten when the s
df60: 63 68 65 6d 61 20 69 73 20 6e 65 78 74 20 6c 6f  chema is next lo
df70: 61 64 65 64 2e 20 49 66 20 69 74 20 64 6f 65 73  aded. If it does
df80: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c   not.      ** al
df90: 72 65 61 64 79 20 65 78 69 73 74 73 2c 20 69 74  ready exists, it
dfa0: 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
dfb0: 20 74 6f 20 75 73 65 20 74 68 65 20 6e 65 77 20   to use the new 
dfc0: 65 6e 63 6f 64 69 6e 67 20 76 61 6c 75 65 2e 0a  encoding value..
dfd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
dfe0: 66 28 20 0a 20 20 20 20 20 20 20 20 21 28 44 62  f( .        !(Db
dff0: 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
e000: 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  0, DB_SchemaLoad
e010: 65 64 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  ed)) || .       
e020: 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64   DbHasProperty(d
e030: 62 2c 20 30 2c 20 44 42 5f 45 6d 70 74 79 29 20  b, 0, DB_Empty) 
e040: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
e050: 20 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e 63 6e    for(pEnc=&encn
e060: 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e 7a  ames[0]; pEnc->z
e070: 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a 20  Name; pEnc++){. 
e080: 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d           if( 0==
e090: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
e0a0: 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e 7a 4e 61  Right, pEnc->zNa
e0b0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
e0c0: 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62     SCHEMA_ENC(db
e0d0: 29 20 3d 20 45 4e 43 28 64 62 29 20 3d 0a 20 20  ) = ENC(db) =.  
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
e0f0: 6e 63 2d 3e 65 6e 63 20 3f 20 70 45 6e 63 2d 3e  nc->enc ? pEnc->
e100: 65 6e 63 20 3a 20 53 51 4c 49 54 45 5f 55 54 46  enc : SQLITE_UTF
e110: 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 20 20  16NATIVE;.      
e120: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e130: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e140: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
e150: 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pEnc->zName ){. 
e160: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e170: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e180: 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 65 6e   "unsupported en
e190: 63 6f 64 69 6e 67 3a 20 25 73 22 2c 20 7a 52 69  coding: %s", zRi
e1a0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ght);.        }.
e1b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e1c0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
e1d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e1e0: 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64  _UTF16 */..#ifnd
e1f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
e200: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52  CHEMA_VERSION_PR
e210: 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20  AGMAS.  /*.  ** 
e220: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
e230: 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e  .]schema_version
e240: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
e250: 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76  schema.]schema_v
e260: 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65  ersion = <intege
e270: 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50  r>.  **.  **   P
e280: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75  RAGMA [schema.]u
e290: 73 65 72 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a  ser_version.  **
e2a0: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
e2b0: 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 20  a.]user_version 
e2c0: 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a  = <integer>.  **
e2d0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
e2e0: 73 63 68 65 6d 61 2e 5d 66 72 65 65 6c 69 73 74  schema.]freelist
e2f0: 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a  _count.  **.  **
e300: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
e310: 61 2e 5d 64 61 74 61 5f 76 65 72 73 69 6f 6e 0a  a.]data_version.
e320: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    **.  **   PRAG
e330: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c  MA [schema.]appl
e340: 69 63 61 74 69 6f 6e 5f 69 64 0a 20 20 2a 2a 20  ication_id.  ** 
e350: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
e360: 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64  .]application_id
e370: 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a   = <integer>.  *
e380: 2a 0a 20 20 2a 2a 20 54 68 65 20 70 72 61 67 6d  *.  ** The pragm
e390: 61 27 73 20 73 63 68 65 6d 61 5f 76 65 72 73 69  a's schema_versi
e3a0: 6f 6e 20 61 6e 64 20 75 73 65 72 5f 76 65 72 73  on and user_vers
e3b0: 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20  ion are used to 
e3c0: 73 65 74 20 6f 72 20 67 65 74 0a 20 20 2a 2a 20  set or get.  ** 
e3d0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
e3e0: 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20   schema-version 
e3f0: 61 6e 64 20 75 73 65 72 2d 76 65 72 73 69 6f 6e  and user-version
e400: 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
e410: 42 6f 74 68 0a 20 20 2a 2a 20 74 68 65 20 73 63  Both.  ** the sc
e420: 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64  hema-version and
e430: 20 74 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f   the user-versio
e440: 6e 20 61 72 65 20 33 32 2d 62 69 74 20 73 69 67  n are 32-bit sig
e450: 6e 65 64 20 69 6e 74 65 67 65 72 73 0a 20 20 2a  ned integers.  *
e460: 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
e470: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e  database header.
e480: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
e490: 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 69 73 20  chema-cookie is 
e4a0: 75 73 75 61 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e  usually only man
e4b0: 69 70 75 6c 61 74 65 64 20 69 6e 74 65 72 6e 61  ipulated interna
e4c0: 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49  lly by SQLite. I
e4d0: 74 0a 20 20 2a 2a 20 69 73 20 69 6e 63 72 65 6d  t.  ** is increm
e4e0: 65 6e 74 65 64 20 62 79 20 53 51 4c 69 74 65 20  ented by SQLite 
e4f0: 77 68 65 6e 65 76 65 72 20 74 68 65 20 64 61 74  whenever the dat
e500: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
e510: 6d 6f 64 69 66 69 65 64 20 28 62 79 0a 20 20 2a  modified (by.  *
e520: 2a 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 72  * creating or dr
e530: 6f 70 70 69 6e 67 20 61 20 74 61 62 6c 65 20 6f  opping a table o
e540: 72 20 69 6e 64 65 78 29 2e 20 54 68 65 20 73 63  r index). The sc
e550: 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 69 73 20  hema version is 
e560: 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 53 51 4c  used by.  ** SQL
e570: 69 74 65 20 65 61 63 68 20 74 69 6d 65 20 61 20  ite each time a 
e580: 71 75 65 72 79 20 69 73 20 65 78 65 63 75 74 65  query is execute
e590: 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
e5a0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
e5b0: 63 68 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  che.  ** of the 
e5c0: 73 63 68 65 6d 61 20 75 73 65 64 20 77 68 65 6e  schema used when
e5d0: 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53   compiling the S
e5e0: 51 4c 20 71 75 65 72 79 20 6d 61 74 63 68 65 73  QL query matches
e5f0: 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 0a 20   the schema of. 
e600: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
e610: 20 61 67 61 69 6e 73 74 20 77 68 69 63 68 20 74   against which t
e620: 68 65 20 63 6f 6d 70 69 6c 65 64 20 71 75 65 72  he compiled quer
e630: 79 20 69 73 20 61 63 74 75 61 6c 6c 79 20 65 78  y is actually ex
e640: 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 53 75 62  ecuted..  ** Sub
e650: 76 65 72 74 69 6e 67 20 74 68 69 73 20 6d 65 63  verting this mec
e660: 68 61 6e 69 73 6d 20 62 79 20 75 73 69 6e 67 20  hanism by using 
e670: 22 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76  "PRAGMA schema_v
e680: 65 72 73 69 6f 6e 22 20 74 6f 20 6d 6f 64 69 66  ersion" to modif
e690: 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  y.  ** the schem
e6a0: 61 2d 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 74  a-version is pot
e6b0: 65 6e 74 69 61 6c 6c 79 20 64 61 6e 67 65 72 6f  entially dangero
e6c0: 75 73 20 61 6e 64 20 6d 61 79 20 6c 65 61 64 20  us and may lead 
e6d0: 74 6f 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20  to program.  ** 
e6e0: 63 72 61 73 68 65 73 20 6f 72 20 64 61 74 61 62  crashes or datab
e6f0: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
e700: 55 73 65 20 77 69 74 68 20 63 61 75 74 69 6f 6e  Use with caution
e710: 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  !.  **.  ** The 
e720: 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 69 73 20  user-version is 
e730: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
e740: 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49  lly by SQLite. I
e750: 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 62 79  t may be used by
e760: 0a 20 20 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  .  ** applicatio
e770: 6e 73 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f  ns for any purpo
e780: 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
e790: 50 72 61 67 54 79 70 5f 48 45 41 44 45 52 5f 56  PragTyp_HEADER_V
e7a0: 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20  ALUE: {.    int 
e7b0: 69 43 6f 6f 6b 69 65 20 3d 20 70 50 72 61 67 6d  iCookie = pPragm
e7c0: 61 2d 3e 69 41 72 67 3b 20 20 2f 2a 20 57 68 69  a->iArg;  /* Whi
e7d0: 63 68 20 63 6f 6f 6b 69 65 20 74 6f 20 72 65 61  ch cookie to rea
e7e0: 64 20 6f 72 20 77 72 69 74 65 20 2a 2f 0a 20 20  d or write */.  
e7f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
e800: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
e810: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 26      if( zRight &
e820: 26 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61  & (pPragma->mPra
e830: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52  gFlg & PragFlg_R
e840: 65 61 64 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a 20  eadOnly)==0 ){. 
e850: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
e860: 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f 6b  e specified cook
e870: 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  ie value */.    
e880: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56    static const V
e890: 64 62 65 4f 70 4c 69 73 74 20 73 65 74 43 6f 6f  dbeOpList setCoo
e8a0: 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  kie[] = {.      
e8b0: 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69    { OP_Transacti
e8c0: 6f 6e 2c 20 20 20 20 30 2c 20 20 31 2c 20 20 30  on,    0,  1,  0
e8d0: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
e8e0: 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f        { OP_SetCo
e8f0: 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 30  okie,      0,  0
e900: 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a  ,  0},    /* 1 *
e910: 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  /.      };.     
e920: 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20   VdbeOp *aOp;.  
e930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56      sqlite3VdbeV
e940: 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71  erifyNoMallocReq
e950: 75 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69  uired(v, ArraySi
e960: 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 29 3b 0a  ze(setCookie));.
e970: 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69        aOp = sqli
e980: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
e990: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65  (v, ArraySize(se
e9a0: 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43 6f 6f  tCookie), setCoo
e9b0: 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  kie, 0);.      i
e9c0: 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c  f( ONLY_IF_REALL
e9d0: 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30  OC_STRESS(aOp==0
e9e0: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
e9f0: 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62   aOp[0].p1 = iDb
ea00: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70  ;.      aOp[1].p
ea10: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61  1 = iDb;.      a
ea20: 4f 70 5b 31 5d 2e 70 32 20 3d 20 69 43 6f 6f 6b  Op[1].p2 = iCook
ea30: 69 65 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  ie;.      aOp[1]
ea40: 2e 70 33 20 3d 20 73 71 6c 69 74 65 33 41 74 6f  .p3 = sqlite3Ato
ea50: 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  i(zRight);.    }
ea60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52  else{.      /* R
ea70: 65 61 64 20 74 68 65 20 73 70 65 63 69 66 69 65  ead the specifie
ea80: 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  d cookie value *
ea90: 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
eaa0: 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20  onst VdbeOpList 
eab0: 72 65 61 64 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b  readCookie[] = {
eac0: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72  .        { OP_Tr
ead0: 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 30  ansaction,     0
eae0: 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a  ,  0,  0},    /*
eaf0: 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   0 */.        { 
eb00: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20  OP_ReadCookie,  
eb10: 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20      0,  1,  0}, 
eb20: 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20     /* 1 */.     
eb30: 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f     { OP_ResultRo
eb40: 77 2c 20 20 20 20 20 20 20 31 2c 20 20 31 2c 20  w,       1,  1, 
eb50: 20 30 7d 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20   0}.      };.   
eb60: 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a     VdbeOp *aOp;.
eb70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
eb80: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
eb90: 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79  equired(v, Array
eba0: 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29  Size(readCookie)
ebb0: 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73  );.      aOp = s
ebc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
ebd0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
ebe0: 28 72 65 61 64 43 6f 6f 6b 69 65 29 2c 72 65 61  (readCookie),rea
ebf0: 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20 20 20 20  dCookie,0);.    
ec00: 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45    if( ONLY_IF_RE
ec10: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70  ALLOC_STRESS(aOp
ec20: 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ==0) ) break;.  
ec30: 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20      aOp[0].p1 = 
ec40: 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  iDb;.      aOp[1
ec50: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
ec60: 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 69 43    aOp[1].p3 = iC
ec70: 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 73 71 6c  ookie;.      sql
ec80: 69 74 65 33 56 64 62 65 52 65 75 73 61 62 6c 65  ite3VdbeReusable
ec90: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (v);.    }.  }. 
eca0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
ecb0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  * SQLITE_OMIT_SC
ecc0: 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41  HEMA_VERSION_PRA
ecd0: 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GMAS */..#ifndef
ece0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
ecf0: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
ed00: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
ed10: 47 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f 70 74 69  GMA compile_opti
ed20: 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ons.  **.  ** Re
ed30: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  turn the names o
ed40: 66 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 2d 74 69  f all compile-ti
ed50: 6d 65 20 6f 70 74 69 6f 6e 73 20 75 73 65 64 20  me options used 
ed60: 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 0a 20  in this build,. 
ed70: 20 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f 6e 20 70   ** one option p
ed80: 65 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63  er row..  */.  c
ed90: 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4d 50  ase PragTyp_COMP
eda0: 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20 7b 0a 20  ILE_OPTIONS: {. 
edb0: 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
edc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
edd0: 70 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  pt;.    pParse->
ede0: 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20 20 77 68  nMem = 1;.    wh
edf0: 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20 73 71 6c  ile( (zOpt = sql
ee00: 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  ite3_compileopti
ee10: 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21 3d 30 20  on_get(i++))!=0 
ee20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ee30: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
ee40: 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20 20 20 20  , 1, zOpt);.    
ee50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ee60: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
ee70: 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  Row, 1, 1);.    
ee80: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
ee90: 65 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20 20  eReusable(v);.  
eea0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
eeb0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
eec0: 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
eed0: 49 41 47 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  IAGS */..#ifndef
eee0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
eef0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
ef00: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 77 61 6c  GMA [schema.]wal
ef10: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 70 61  _checkpoint = pa
ef20: 73 73 69 76 65 7c 66 75 6c 6c 7c 72 65 73 74 61  ssive|full|resta
ef30: 72 74 7c 74 72 75 6e 63 61 74 65 0a 20 20 2a 2a  rt|truncate.  **
ef40: 0a 20 20 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  .  ** Checkpoint
ef50: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
ef60: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
ef70: 79 70 5f 57 41 4c 5f 43 48 45 43 4b 50 4f 49 4e  yp_WAL_CHECKPOIN
ef80: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 42 74  T: {.    int iBt
ef90: 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69 44 62 3a   = (pId2->z?iDb:
efa0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
efb0: 48 45 44 29 3b 0a 20 20 20 20 69 6e 74 20 65 4d  HED);.    int eM
efc0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45  ode = SQLITE_CHE
efd0: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3b  CKPOINT_PASSIVE;
efe0: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
eff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
f000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67  ite3StrICmp(zRig
f010: 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d 30 20 29  ht, "full")==0 )
f020: 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
f030: 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  = SQLITE_CHECKPO
f040: 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  INT_FULL;.      
f050: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
f060: 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c  3StrICmp(zRight,
f070: 20 22 72 65 73 74 61 72 74 22 29 3d 3d 30 20 29   "restart")==0 )
f080: 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
f090: 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  = SQLITE_CHECKPO
f0a0: 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a 20 20 20  INT_RESTART;.   
f0b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
f0c0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67  ite3StrICmp(zRig
f0d0: 68 74 2c 20 22 74 72 75 6e 63 61 74 65 22 29 3d  ht, "truncate")=
f0e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
f0f0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45  ode = SQLITE_CHE
f100: 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45  CKPOINT_TRUNCATE
f110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f120: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
f130: 20 3d 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 3;.    sqlite
f140: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f150: 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 42  P_Checkpoint, iB
f160: 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a 20 20  t, eMode, 1);.  
f170: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f180: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
f190: 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 7d 0a  Row, 1, 3);.  }.
f1a0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a 0a 20    break;..  /*. 
f1b0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c   **   PRAGMA wal
f1c0: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 0a  _autocheckpoint.
f1d0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61    **   PRAGMA wa
f1e0: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
f1f0: 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43   = N.  **.  ** C
f200: 6f 6e 66 69 67 75 72 65 20 61 20 64 61 74 61 62  onfigure a datab
f210: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
f220: 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
f230: 63 68 65 63 6b 70 6f 69 6e 74 20 61 20 64 61 74  checkpoint a dat
f240: 61 62 61 73 65 0a 20 20 2a 2a 20 61 66 74 65 72  abase.  ** after
f250: 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 4e 20   accumulating N 
f260: 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
f270: 67 2e 20 4f 72 20 71 75 65 72 79 20 66 6f 72 20  g. Or query for 
f280: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
f290: 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20 20 2a  e.  ** of N..  *
f2a0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
f2b0: 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f  _WAL_AUTOCHECKPO
f2c0: 49 4e 54 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a  INT: {.    if( z
f2d0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
f2e0: 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
f2f0: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 73 71  heckpoint(db, sq
f300: 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74  lite3Atoi(zRight
f310: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ));.    }.    re
f320: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
f330: 20 0a 20 20 20 20 20 20 20 64 62 2d 3e 78 57 61   .       db->xWa
f340: 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73 71 6c 69 74  lCallback==sqlit
f350: 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
f360: 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 53   ? .           S
f370: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
f380: 28 64 62 2d 3e 70 57 61 6c 41 72 67 29 20 3a 20  (db->pWalArg) : 
f390: 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  0);.  }.  break;
f3a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
f3b0: 2a 2a 20 20 50 52 41 47 4d 41 20 73 68 72 69 6e  **  PRAGMA shrin
f3c0: 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a 0a 20 20  k_memory.  **.  
f3d0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
f3e0: 4e 2d 4f 46 3a 20 52 2d 32 33 34 34 35 2d 34 36  N-OF: R-23445-46
f3f0: 31 30 39 20 54 68 69 73 20 70 72 61 67 6d 61 20  109 This pragma 
f400: 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
f410: 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63 74  ase.  ** connect
f420: 69 6f 6e 20 6f 6e 20 77 68 69 63 68 20 69 74 20  ion on which it 
f430: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 66 72  is invoked to fr
f440: 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65  ee up as much me
f450: 6d 6f 72 79 20 61 73 20 69 74 0a 20 20 2a 2a 20  mory as it.  ** 
f460: 63 61 6e 2c 20 62 79 20 63 61 6c 6c 69 6e 67 20  can, by calling 
f470: 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
f480: 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 20 20 2a  se_memory()..  *
f490: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
f4a0: 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52 59 3a 20  _SHRINK_MEMORY: 
f4b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  {.    sqlite3_db
f4c0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
f4d0: 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  db);.    break;.
f4e0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
f4f0: 20 50 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d   PRAGMA busy_tim
f500: 65 6f 75 74 0a 20 20 2a 2a 20 20 20 50 52 41 47  eout.  **   PRAG
f510: 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 20  MA busy_timeout 
f520: 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 61  = N.  **.  ** Ca
f530: 6c 6c 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  ll sqlite3_busy_
f540: 74 69 6d 65 6f 75 74 28 64 62 2c 20 4e 29 2e 20  timeout(db, N). 
f550: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
f560: 65 6e 74 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  ent timeout valu
f570: 65 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 69 73  e.  ** if one is
f580: 20 73 65 74 2e 20 20 49 66 20 6e 6f 20 62 75 73   set.  If no bus
f590: 79 20 68 61 6e 64 6c 65 72 20 6f 72 20 61 20 64  y handler or a d
f5a0: 69 66 66 65 72 65 6e 74 20 62 75 73 79 20 68 61  ifferent busy ha
f5b0: 6e 64 6c 65 72 20 69 73 20 73 65 74 0a 20 20 2a  ndler is set.  *
f5c0: 2a 20 74 68 65 6e 20 30 20 69 73 20 72 65 74 75  * then 0 is retu
f5d0: 72 6e 65 64 2e 20 20 53 65 74 74 69 6e 67 20 74  rned.  Setting t
f5e0: 68 65 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 20  he busy_timeout 
f5f0: 74 6f 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  to 0 or negative
f600: 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 73 20 74  .  ** disables t
f610: 68 65 20 74 69 6d 65 6f 75 74 2e 0a 20 20 2a 2f  he timeout..  */
f620: 0a 20 20 2f 2a 63 61 73 65 20 50 72 61 67 54 79  .  /*case PragTy
f630: 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55 54 2a 2f  p_BUSY_TIMEOUT*/
f640: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
f650: 61 73 73 65 72 74 28 20 70 50 72 61 67 6d 61 2d  assert( pPragma-
f660: 3e 65 50 72 61 67 54 79 70 3d 3d 50 72 61 67 54  >ePragTyp==PragT
f670: 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55 54 20  yp_BUSY_TIMEOUT 
f680: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
f690: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
f6a0: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
f6b0: 64 62 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28  db, sqlite3Atoi(
f6c0: 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a  zRight));.    }.
f6d0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
f6e0: 49 6e 74 28 76 2c 20 64 62 2d 3e 62 75 73 79 54  Int(v, db->busyT
f6f0: 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20 62 72 65  imeout);.    bre
f700: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
f710: 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f 66 74  **   PRAGMA soft
f720: 5f 68 65 61 70 5f 6c 69 6d 69 74 0a 20 20 2a 2a  _heap_limit.  **
f730: 20 20 20 50 52 41 47 4d 41 20 73 6f 66 74 5f 68     PRAGMA soft_h
f740: 65 61 70 5f 6c 69 6d 69 74 20 3d 20 4e 0a 20 20  eap_limit = N.  
f750: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
f760: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 36 33  TATION-OF: R-263
f770: 34 33 2d 34 35 39 33 30 20 54 68 69 73 20 70 72  43-45930 This pr
f780: 61 67 6d 61 20 69 6e 76 6f 6b 65 73 20 74 68 65  agma invokes the
f790: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f  .  ** sqlite3_so
f7a0: 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
f7b0: 29 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68  ) interface with
f7c0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 4e 2c   the argument N,
f7d0: 20 69 66 20 4e 20 69 73 0a 20 20 2a 2a 20 73 70   if N is.  ** sp
f7e0: 65 63 69 66 69 65 64 20 61 6e 64 20 69 73 20 61  ecified and is a
f7f0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
f800: 74 65 67 65 72 2e 0a 20 20 2a 2a 20 49 4d 50 4c  teger..  ** IMPL
f810: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
f820: 2d 36 34 34 35 31 2d 30 37 31 36 33 20 54 68 65  -64451-07163 The
f830: 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74   soft_heap_limit
f840: 20 70 72 61 67 6d 61 20 61 6c 77 61 79 73 0a 20   pragma always. 
f850: 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20   ** returns the 
f860: 73 61 6d 65 20 69 6e 74 65 67 65 72 20 74 68 61  same integer tha
f870: 74 20 77 6f 75 6c 64 20 62 65 20 72 65 74 75 72  t would be retur
f880: 6e 65 64 20 62 79 20 74 68 65 0a 20 20 2a 2a 20  ned by the.  ** 
f890: 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
f8a0: 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29 20 43 2d  p_limit64(-1) C-
f8b0: 6c 61 6e 67 75 61 67 65 20 66 75 6e 63 74 69 6f  language functio
f8c0: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  n..  */.  case P
f8d0: 72 61 67 54 79 70 5f 53 4f 46 54 5f 48 45 41 50  ragTyp_SOFT_HEAP
f8e0: 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 73 71  _LIMIT: {.    sq
f8f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20  lite3_int64 N;. 
f900: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 26 26     if( zRight &&
f910: 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
f920: 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 4e  ToI64(zRight, &N
f930: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
f940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6f        sqlite3_so
f950: 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
f960: 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  N);.    }.    re
f970: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
f980: 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
f990: 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29 29 3b  ap_limit64(-1));
f9a0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
f9b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
f9c0: 47 4d 41 20 74 68 72 65 61 64 73 0a 20 20 2a 2a  GMA threads.  **
f9d0: 20 20 20 50 52 41 47 4d 41 20 74 68 72 65 61 64     PRAGMA thread
f9e0: 73 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s = N.  **.  ** 
f9f0: 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 6d 61  Configure the ma
fa00: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
fa10: 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73 2e 20  worker threads. 
fa20: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 0a   Return the new.
fa30: 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 2c 20 77 68    ** maximum, wh
fa40: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 73  ich might be les
fa50: 73 20 74 68 61 6e 20 72 65 71 75 65 73 74 65 64  s than requested
fa60: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
fa70: 61 67 54 79 70 5f 54 48 52 45 41 44 53 3a 20 7b  agTyp_THREADS: {
fa80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
fa90: 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52  64 N;.    if( zR
faa0: 69 67 68 74 0a 20 20 20 20 20 26 26 20 73 71 6c  ight.     && sql
fab0: 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
fac0: 34 28 7a 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53  4(zRight, &N)==S
fad0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26 26  QLITE_OK.     &&
fae0: 20 4e 3e 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20   N>=0.    ){.   
faf0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74     sqlite3_limit
fb00: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49  (db, SQLITE_LIMI
fb10: 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
fb20: 2c 20 28 69 6e 74 29 28 4e 26 30 78 37 66 66 66  , (int)(N&0x7fff
fb30: 66 66 66 66 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ffff));.    }.  
fb40: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
fb50: 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 6c 69 6d  t(v, sqlite3_lim
fb60: 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c 49  it(db, SQLITE_LI
fb70: 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
fb80: 44 53 2c 20 2d 31 29 29 3b 0a 20 20 20 20 62 72  DS, -1));.    br
fb90: 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65  eak;.  }..#if de
fba0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
fbb0: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
fbc0: 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 2f 2a  QLITE_TEST).  /*
fbd0: 0a 20 20 2a 2a 20 52 65 70 6f 72 74 20 74 68 65  .  ** Report the
fbe0: 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
fbf0: 66 20 66 69 6c 65 20 6c 6f 67 73 20 66 6f 72 20  f file logs for 
fc00: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 0a 20 20  all databases.  
fc10: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
fc20: 70 5f 4c 4f 43 4b 5f 53 54 41 54 55 53 3a 20 7b  p_LOCK_STATUS: {
fc30: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
fc40: 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a  t char *const az
fc50: 4c 6f 63 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20  LockName[] = {. 
fc60: 20 20 20 20 20 22 75 6e 6c 6f 63 6b 65 64 22 2c       "unlocked",
fc70: 20 22 73 68 61 72 65 64 22 2c 20 22 72 65 73 65   "shared", "rese
fc80: 72 76 65 64 22 2c 20 22 70 65 6e 64 69 6e 67 22  rved", "pending"
fc90: 2c 20 22 65 78 63 6c 75 73 69 76 65 22 0a 20 20  , "exclusive".  
fca0: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    };.    int i;.
fcb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
fcc0: 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 2;.    for(i=
fcd0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
fce0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
fcf0: 2a 70 42 74 3b 0a 20 20 20 20 20 20 63 6f 6e 73  *pBt;.      cons
fd00: 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65 20 3d  t char *zState =
fd10: 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20   "unknown";.    
fd20: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
fd30: 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44  f( db->aDb[i].zD
fd40: 62 53 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74  bSName==0 ) cont
fd50: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 42 74 20  inue;.      pBt 
fd60: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
fd70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 3d  ;.      if( pBt=
fd80: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
fd90: 65 65 50 61 67 65 72 28 70 42 74 29 3d 3d 30 20  eePager(pBt)==0 
fda0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 74 61 74  ){.        zStat
fdb0: 65 20 3d 20 22 63 6c 6f 73 65 64 22 3b 0a 20 20  e = "closed";.  
fdc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
fdd0: 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
fde0: 6f 6c 28 64 62 2c 20 69 20 3f 20 64 62 2d 3e 61  ol(db, i ? db->a
fdf0: 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a  Db[i].zDbSName :
fe00: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe20: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
fe30: 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
fe40: 2c 20 26 6a 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &j)==SQLITE_OK
fe50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 7a 53 74   ){.         zSt
fe60: 61 74 65 20 3d 20 61 7a 4c 6f 63 6b 4e 61 6d 65  ate = azLockName
fe70: 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [j];.      }.   
fe80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
fe90: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
fea0: 73 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  s", db->aDb[i].z
feb0: 44 62 53 4e 61 6d 65 2c 20 7a 53 74 61 74 65 29  DbSName, zState)
fec0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fed0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fee0: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 32 29  ResultRow, 1, 2)
fef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
ff00: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  k;.  }.#endif..#
ff10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
ff20: 5f 43 4f 44 45 43 0a 20 20 63 61 73 65 20 50 72  _CODEC.  case Pr
ff30: 61 67 54 79 70 5f 4b 45 59 3a 20 7b 0a 20 20 20  agTyp_KEY: {.   
ff40: 20 69 66 28 20 7a 52 69 67 68 74 20 29 20 73 71   if( zRight ) sq
ff50: 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c  lite3_key_v2(db,
ff60: 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c 20 73 71   zDb, zRight, sq
ff70: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52  lite3Strlen30(zR
ff80: 69 67 68 74 29 29 3b 0a 20 20 20 20 62 72 65 61  ight));.    brea
ff90: 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65 20 50 72  k;.  }.  case Pr
ffa0: 61 67 54 79 70 5f 52 45 4b 45 59 3a 20 7b 0a 20  agTyp_REKEY: {. 
ffb0: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 20     if( zRight ) 
ffc0: 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32  sqlite3_rekey_v2
ffd0: 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74  (db, zDb, zRight
ffe0: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
fff0: 30 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20  0(zRight));.    
10000 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61 73  break;.  }.  cas
10010 65 20 50 72 61 67 54 79 70 5f 48 45 58 4b 45 59  e PragTyp_HEXKEY
10020 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
10030 68 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20 69  ht ){.      u8 i
10040 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Byte;.      int 
10050 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4b  i;.      char zK
10060 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f  ey[40];.      fo
10070 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20  r(i=0, iByte=0; 
10080 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29 2a 32  i<sizeof(zKey)*2
10090 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
100a0 67 69 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 20  git(zRight[i]); 
100b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 42  i++){.        iB
100c0 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29  yte = (iByte<<4)
100d0 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49   + sqlite3HexToI
100e0 6e 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 0a 20  nt(zRight[i]);. 
100f0 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29         if( (i&1)
10100 21 3d 30 20 29 20 7a 4b 65 79 5b 69 2f 32 5d 20  !=0 ) zKey[i/2] 
10110 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 7d  = iByte;.      }
10120 0a 20 20 20 20 20 20 69 66 28 20 28 7a 4c 65 66  .      if( (zLef
10130 74 5b 33 5d 20 26 20 30 78 66 29 3d 3d 30 78 62  t[3] & 0xf)==0xb
10140 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10150 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a  te3_key_v2(db, z
10160 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a  Db, zKey, i/2);.
10170 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10180 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6b       sqlite3_rek
10190 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
101a0 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20  Key, i/2);.     
101b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
101c0 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ak;.  }.#endif.#
101d0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
101e0 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20  E_HAS_CODEC) || 
101f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
10200 4e 41 42 4c 45 5f 43 45 52 4f 44 29 0a 20 20 63  NABLE_CEROD).  c
10210 61 73 65 20 50 72 61 67 54 79 70 5f 41 43 54 49  ase PragTyp_ACTI
10220 56 41 54 45 5f 45 58 54 45 4e 53 49 4f 4e 53 3a  VATE_EXTENSIONS:
10230 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 23   if( zRight ){.#
10240 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
10250 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 73  _CODEC.    if( s
10260 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
10270 52 69 67 68 74 2c 20 22 73 65 65 2d 22 2c 20 34  Right, "see-", 4
10280 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
10290 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f 73  lite3_activate_s
102a0 65 65 28 26 7a 52 69 67 68 74 5b 34 5d 29 3b 0a  ee(&zRight[4]);.
102b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
102c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
102d0 45 5f 43 45 52 4f 44 0a 20 20 20 20 69 66 28 20  E_CEROD.    if( 
102e0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
102f0 7a 52 69 67 68 74 2c 20 22 63 65 72 6f 64 2d 22  zRight, "cerod-"
10300 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 6)==0 ){.     
10310 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74   sqlite3_activat
10320 65 5f 63 65 72 6f 64 28 26 7a 52 69 67 68 74 5b  e_cerod(&zRight[
10330 36 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  6]);.    }.#endi
10340 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  f.  }.  break;.#
10350 65 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a 20 45 6e  endif..  } /* En
10360 64 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  d of the PRAGMA 
10370 73 77 69 74 63 68 20 2a 2f 0a 0a 20 20 2f 2a 20  switch */..  /* 
10380 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
10390 6f 63 6b 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ock is a no-op u
103a0 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42  nless SQLITE_DEB
103b0 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 20 49  UG is defined. I
103c0 74 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 75 72  ts only.  ** pur
103d0 70 6f 73 65 20 69 73 20 74 6f 20 65 78 65 63 75  pose is to execu
103e0 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  te assert() stat
103f0 65 6d 65 6e 74 73 20 74 6f 20 76 65 72 69 66 79  ements to verify
10400 20 74 68 61 74 20 69 66 20 74 68 65 0a 20 20 2a   that if the.  *
10410 2a 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75  * PragFlg_NoColu
10420 6d 6e 73 31 20 66 6c 61 67 20 69 73 20 73 65 74  mns1 flag is set
10430 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
10440 73 70 65 63 69 66 69 65 64 20 61 6e 20 61 72 67  specified an arg
10450 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 74 68  ument.  ** to th
10460 65 20 50 52 41 47 4d 41 2c 20 74 68 65 20 69 6d  e PRAGMA, the im
10470 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 68 61 73  plementation has
10480 20 6e 6f 74 20 61 64 64 65 64 20 61 6e 79 20 4f   not added any O
10490 50 5f 52 65 73 75 6c 74 52 6f 77 20 0a 20 20 2a  P_ResultRow .  *
104a0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74  * instructions t
104b0 6f 20 74 68 65 20 56 4d 2e 20 20 2a 2f 0a 20 20  o the VM.  */.  
104c0 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50  if( (pPragma->mP
104d0 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67  ragFlg & PragFlg
104e0 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 20 26 26 20  _NoColumns1) && 
104f0 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  zRight ){.    sq
10500 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
10510 6f 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20  oResultRow(v);. 
10520 20 7d 0a 0a 70 72 61 67 6d 61 5f 6f 75 74 3a 0a   }..pragma_out:.
10530 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10540 64 62 2c 20 7a 4c 65 66 74 29 3b 0a 20 20 73 71  db, zLeft);.  sq
10550 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10560 7a 52 69 67 68 74 29 3b 0a 7d 0a 23 69 66 6e 64  zRight);.}.#ifnd
10570 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10580 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a  IRTUALTABLE./***
10590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d  **********.** Im
105e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
105f0 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  an eponymous vir
10600 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
10610 72 75 6e 73 20 61 20 70 72 61 67 6d 61 2e 0a 2a  runs a pragma..*
10620 2a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  *.*/.typedef str
10630 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 50  uct PragmaVtab P
10640 72 61 67 6d 61 56 74 61 62 3b 0a 74 79 70 65 64  ragmaVtab;.typed
10650 65 66 20 73 74 72 75 63 74 20 50 72 61 67 6d 61  ef struct Pragma
10660 56 74 61 62 43 75 72 73 6f 72 20 50 72 61 67 6d  VtabCursor Pragm
10670 61 56 74 61 62 43 75 72 73 6f 72 3b 0a 73 74 72  aVtabCursor;.str
10680 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 7b  uct PragmaVtab {
10690 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
106a0 62 61 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  base;        /* 
106b0 42 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73  Base class.  Mus
106c0 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  t be first */.  
106d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
106e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
106f0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
10700 74 69 6f 6e 20 74 6f 20 77 68 69 63 68 20 69 74  tion to which it
10710 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63 6f   belongs */.  co
10720 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a  nst PragmaName *
10730 70 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  pName;  /* Name 
10740 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 2a 2f  of the pragma */
10750 0a 20 20 75 38 20 6e 48 69 64 64 65 6e 3b 20 20  .  u8 nHidden;  
10760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10770 4e 75 6d 62 65 72 20 6f 66 20 68 69 64 64 65 6e  Number of hidden
10780 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
10790 20 69 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20   iHidden;       
107a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
107b0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 68 69   of the first hi
107c0 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d  dden column */.}
107d0 3b 0a 73 74 72 75 63 74 20 50 72 61 67 6d 61 56  ;.struct PragmaV
107e0 74 61 62 43 75 72 73 6f 72 20 7b 0a 20 20 73 71  tabCursor {.  sq
107f0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
10800 72 20 62 61 73 65 3b 20 2f 2a 20 42 61 73 65 20  r base; /* Base 
10810 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20  class.  Must be 
10820 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74  first */.  sqlit
10830 65 33 5f 73 74 6d 74 20 2a 70 50 72 61 67 6d 61  e3_stmt *pPragma
10840 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 72 61 67  ;    /* The prag
10850 6d 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ma statement to 
10860 72 75 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f  run */.  sqlite_
10870 69 6e 74 36 34 20 69 52 6f 77 69 64 3b 20 20 20  int64 iRowid;   
10880 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f     /* Current ro
10890 77 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  wid */.  char *a
108a0 7a 41 72 67 5b 32 5d 3b 20 20 20 20 20 20 20 20  zArg[2];        
108b0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74     /* Value of t
108c0 68 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  he argument and 
108d0 73 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  schema */.};../*
108e0 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74   .** Pragma virt
108f0 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
10900 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64   xConnect method
10910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10920 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63  pragmaVtabConnec
10930 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
10940 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a  ,.  void *pAux,.
10950 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73    int argc, cons
10960 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72  t char *const*ar
10970 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  gv,.  sqlite3_vt
10980 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63  ab **ppVtab,.  c
10990 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
109a0 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d   const PragmaNam
109b0 65 20 2a 70 50 72 61 67 6d 61 20 3d 20 28 63 6f  e *pPragma = (co
109c0 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 2a 29  nst PragmaName*)
109d0 70 41 75 78 3b 0a 20 20 50 72 61 67 6d 61 56 74  pAux;.  PragmaVt
109e0 61 62 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  ab *pTab = 0;.  
109f0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c  int rc;.  int i,
10a00 20 6a 3b 0a 20 20 63 68 61 72 20 63 53 65 70 20   j;.  char cSep 
10a10 3d 20 27 28 27 3b 0a 20 20 53 74 72 41 63 63 75  = '(';.  StrAccu
10a20 6d 20 61 63 63 3b 0a 20 20 63 68 61 72 20 7a 42  m acc;.  char zB
10a30 75 66 5b 32 30 30 5d 3b 0a 0a 20 20 55 4e 55 53  uf[200];..  UNUS
10a40 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
10a50 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
10a60 41 4d 45 54 45 52 28 61 72 67 76 29 3b 0a 20 20  AMETER(argv);.  
10a70 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
10a80 6e 69 74 28 26 61 63 63 2c 20 30 2c 20 7a 42 75  nit(&acc, 0, zBu
10a90 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  f, sizeof(zBuf),
10aa0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   0);.  sqlite3St
10ab0 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
10ac0 26 61 63 63 2c 20 22 43 52 45 41 54 45 20 54 41  &acc, "CREATE TA
10ad0 42 4c 45 20 78 22 29 3b 0a 20 20 66 6f 72 28 69  BLE x");.  for(i
10ae0 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d 3e 69  =0, j=pPragma->i
10af0 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 70 50 72  PragCName; i<pPr
10b00 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65  agma->nPragCName
10b10 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
10b20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
10b30 26 61 63 63 2c 20 22 25 63 5c 22 25 73 5c 22 22  &acc, "%c\"%s\""
10b40 2c 20 63 53 65 70 2c 20 70 72 61 67 43 4e 61 6d  , cSep, pragCNam
10b50 65 5b 6a 5d 29 3b 0a 20 20 20 20 63 53 65 70 20  e[j]);.    cSep 
10b60 3d 20 27 2c 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = ',';.  }.  if(
10b70 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   i==0 ){.    sql
10b80 69 74 65 33 58 50 72 69 6e 74 66 28 26 61 63 63  ite3XPrintf(&acc
10b90 2c 20 22 28 5c 22 25 73 5c 22 22 2c 20 70 50 72  , "(\"%s\"", pPr
10ba0 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  agma->zName);.  
10bb0 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20    cSep = ',';.  
10bc0 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6a 20 3d    i++;.  }.  j =
10bd0 20 30 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d   0;.  if( pPragm
10be0 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72  a->mPragFlg & Pr
10bf0 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 20 29 7b  agFlg_Result1 ){
10c00 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
10c10 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61  ccumAppendAll(&a
10c20 63 63 2c 20 22 2c 61 72 67 20 48 49 44 44 45 4e  cc, ",arg HIDDEN
10c30 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d  ");.    j++;.  }
10c40 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e  .  if( pPragma->
10c50 6d 50 72 61 67 46 6c 67 20 26 20 28 50 72 61 67  mPragFlg & (Prag
10c60 46 6c 67 5f 53 63 68 65 6d 61 4f 70 74 7c 50 72  Flg_SchemaOpt|Pr
10c70 61 67 46 6c 67 5f 53 63 68 65 6d 61 52 65 71 29  agFlg_SchemaReq)
10c80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
10c90 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c  trAccumAppendAll
10ca0 28 26 61 63 63 2c 20 22 2c 73 63 68 65 6d 61 20  (&acc, ",schema 
10cb0 48 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b  HIDDEN");.    j+
10cc0 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
10cd0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
10ce0 61 63 63 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  acc, ")", 1);.  
10cf0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
10d00 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20 61  inish(&acc);.  a
10d10 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a 42  ssert( strlen(zB
10d20 75 66 29 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75  uf) < sizeof(zBu
10d30 66 29 2d 31 20 29 3b 0a 20 20 72 63 20 3d 20 73  f)-1 );.  rc = s
10d40 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
10d50 74 61 62 28 64 62 2c 20 7a 42 75 66 29 3b 0a 20  tab(db, zBuf);. 
10d60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10d70 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  OK ){.    pTab =
10d80 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 73 71   (PragmaVtab*)sq
10d90 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
10da0 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29 29  eof(PragmaVtab))
10db0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
10dc0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
10dd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
10df0 65 6d 73 65 74 28 70 54 61 62 2c 20 30 2c 20 73  emset(pTab, 0, s
10e00 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62  izeof(PragmaVtab
10e10 29 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ));.      pTab->
10e20 70 4e 61 6d 65 20 3d 20 70 50 72 61 67 6d 61 3b  pName = pPragma;
10e30 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62 20  .      pTab->db 
10e40 3d 20 64 62 3b 0a 20 20 20 20 20 20 70 54 61 62  = db;.      pTab
10e50 2d 3e 69 48 69 64 64 65 6e 20 3d 20 69 3b 0a 20  ->iHidden = i;. 
10e60 20 20 20 20 20 70 54 61 62 2d 3e 6e 48 69 64 64       pTab->nHidd
10e70 65 6e 20 3d 20 6a 3b 0a 20 20 20 20 7d 0a 20 20  en = j;.    }.  
10e80 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45 72  }else{.    *pzEr
10e90 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
10ea0 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
10eb0 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
10ec0 20 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d 20   }..  *ppVtab = 
10ed0 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70  (sqlite3_vtab*)p
10ee0 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Tab;.  return rc
10ef0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67  ;.}../* .** Prag
10f00 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
10f10 20 6d 6f 64 75 6c 65 20 78 44 69 73 63 6f 6e 6e   module xDisconn
10f20 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  ect method..*/.s
10f30 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
10f40 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 73  VtabDisconnect(s
10f50 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
10f60 61 62 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  ab){.  PragmaVta
10f70 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
10f80 61 56 74 61 62 2a 29 70 56 74 61 62 3b 0a 20 20  aVtab*)pVtab;.  
10f90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
10fa0 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
10fb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 46 69  ITE_OK;.}../* Fi
10fc0 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 65 73  gure out the bes
10fd0 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 74  t index to use t
10fe0 6f 20 73 65 61 72 63 68 20 61 20 70 72 61 67 6d  o search a pragm
10ff0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
11000 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
11010 20 6e 6f 74 20 72 65 61 6c 6c 79 20 61 6e 79 20   not really any 
11020 69 6e 64 65 78 20 63 68 6f 69 63 65 73 2e 20 20  index choices.  
11030 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 65  But we want to e
11040 6e 63 6f 75 72 61 67 65 20 74 68 65 0a 2a 2a 20  ncourage the.** 
11050 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 74 6f  query planner to
11060 20 67 69 76 65 20 3d 3d 20 63 6f 6e 73 74 72 61   give == constra
11070 69 6e 74 73 20 6f 6e 20 61 73 20 6d 61 6e 79 20  ints on as many 
11080 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72  hidden parameter
11090 73 20 61 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  s as.** possible
110a0 2c 20 61 6e 64 20 65 73 70 65 63 69 61 6c 6c 79  , and especially
110b0 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 68 69   on the first hi
110c0 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 2e 20  dden parameter. 
110d0 20 53 6f 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20   So return a.** 
110e0 68 69 67 68 20 63 6f 73 74 20 69 66 20 68 69 64  high cost if hid
110f0 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61  den parameters a
11100 72 65 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  re unconstrained
11110 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11120 70 72 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e  pragmaVtabBestIn
11130 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62  dex(sqlite3_vtab
11140 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69   *tab, sqlite3_i
11150 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
11160 6e 66 6f 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  nfo){.  PragmaVt
11170 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67  ab *pTab = (Prag
11180 6d 61 56 74 61 62 2a 29 74 61 62 3b 0a 20 20 63  maVtab*)tab;.  c
11190 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69  onst struct sqli
111a0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
111b0 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e  aint *pConstrain
111c0 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  t;.  int i, j;. 
111d0 20 69 6e 74 20 73 65 65 6e 5b 32 5d 3b 0a 0a 20   int seen[2];.. 
111e0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
111f0 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62  atedCost = (doub
11200 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 54 61 62  le)1;.  if( pTab
11210 2d 3e 6e 48 69 64 64 65 6e 3d 3d 30 20 29 7b 20  ->nHidden==0 ){ 
11220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11230 3b 20 7d 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e  ; }.  pConstrain
11240 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  t = pIdxInfo->aC
11250 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 73 65 65  onstraint;.  see
11260 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 73 65 65 6e  n[0] = 0;.  seen
11270 5b 31 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  [1] = 0;.  for(i
11280 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
11290 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
112a0 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29  , pConstraint++)
112b0 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74  {.    if( pConst
112c0 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30  raint->usable==0
112d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
112e0 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
112f0 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op!=SQLITE_IND
11300 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
11310 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11320 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
11330 2d 3e 69 43 6f 6c 75 6d 6e 20 3c 20 70 54 61 62  ->iColumn < pTab
11340 2d 3e 69 48 69 64 64 65 6e 20 29 20 63 6f 6e 74  ->iHidden ) cont
11350 69 6e 75 65 3b 0a 20 20 20 20 6a 20 3d 20 70 43  inue;.    j = pC
11360 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
11370 6d 6e 20 2d 20 70 54 61 62 2d 3e 69 48 69 64 64  mn - pTab->iHidd
11380 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
11390 6a 20 3c 20 32 20 29 3b 0a 20 20 20 20 73 65 65  j < 2 );.    see
113a0 6e 5b 6a 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a  n[j] = i+1;.  }.
113b0 20 20 69 66 28 20 73 65 65 6e 5b 30 5d 3d 3d 30    if( seen[0]==0
113c0 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   ){.    pIdxInfo
113d0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
113e0 3d 20 28 64 6f 75 62 6c 65 29 32 31 34 37 34 38  = (double)214748
113f0 33 36 34 37 3b 0a 20 20 20 20 70 49 64 78 49 6e  3647;.    pIdxIn
11400 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
11410 73 20 3d 20 32 31 34 37 34 38 33 36 34 37 3b 0a  s = 2147483647;.
11420 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11430 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20  E_OK;.  }.  j = 
11440 73 65 65 6e 5b 30 5d 2d 31 3b 0a 20 20 70 49 64  seen[0]-1;.  pId
11450 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
11460 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49  ntUsage[j].argvI
11470 6e 64 65 78 20 3d 20 31 3b 0a 20 20 70 49 64 78  ndex = 1;.  pIdx
11480 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
11490 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d  tUsage[j].omit =
114a0 20 31 3b 0a 20 20 69 66 28 20 73 65 65 6e 5b 31   1;.  if( seen[1
114b0 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  ]==0 ) return SQ
114c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 49 64 78 49  LITE_OK;.  pIdxI
114d0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
114e0 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 30 3b  st = (double)20;
114f0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
11500 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 30 3b  imatedRows = 20;
11510 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 31 5d 2d 31  .  j = seen[1]-1
11520 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
11530 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
11540 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 32 3b  ].argvIndex = 2;
11550 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  .  pIdxInfo->aCo
11560 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d  nstraintUsage[j]
11570 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 72 65 74  .omit = 1;.  ret
11580 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11590 0a 0a 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65  ../* Create a ne
115a0 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
115b0 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   pragma virtual 
115c0 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20  table */.static 
115d0 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4f 70  int pragmaVtabOp
115e0 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  en(sqlite3_vtab 
115f0 2a 70 56 74 61 62 2c 20 73 71 6c 69 74 65 33 5f  *pVtab, sqlite3_
11600 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70  vtab_cursor **pp
11610 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d  Cursor){.  Pragm
11620 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
11630 72 3b 0a 20 20 70 43 73 72 20 3d 20 28 50 72 61  r;.  pCsr = (Pra
11640 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 73  gmaVtabCursor*)s
11650 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
11660 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20 20  zeof(*pCsr));.  
11670 69 66 28 20 70 43 73 72 3d 3d 30 20 29 20 72 65  if( pCsr==0 ) re
11680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11690 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72  M;.  memset(pCsr
116a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61 67  , 0, sizeof(Prag
116b0 6d 61 56 74 61 62 43 75 72 73 6f 72 29 29 3b 0a  maVtabCursor));.
116c0 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74    pCsr->base.pVt
116d0 61 62 20 3d 20 70 56 74 61 62 3b 0a 20 20 2a 70  ab = pVtab;.  *p
116e0 70 43 75 72 73 6f 72 20 3d 20 26 70 43 73 72 2d  pCursor = &pCsr-
116f0 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20  >base;.  return 
11700 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11710 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6e 74 65   Clear all conte
11720 6e 74 20 66 72 6f 6d 20 70 72 61 67 6d 61 20 76  nt from pragma v
11730 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72  irtual table cur
11740 73 6f 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76  sor. */.static v
11750 6f 69 64 20 70 72 61 67 6d 61 56 74 61 62 43 75  oid pragmaVtabCu
11760 72 73 6f 72 43 6c 65 61 72 28 50 72 61 67 6d 61  rsorClear(Pragma
11770 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
11780 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
11790 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
117a0 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20  Csr->pPragma);. 
117b0 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20 3d   pCsr->pPragma =
117c0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
117d0 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72 2d  <ArraySize(pCsr-
117e0 3e 61 7a 41 72 67 29 3b 20 69 2b 2b 29 7b 0a 20  >azArg); i++){. 
117f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11800 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 29 3b  pCsr->azArg[i]);
11810 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67  .    pCsr->azArg
11820 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  [i] = 0;.  }.}..
11830 2f 2a 20 43 6c 6f 73 65 20 61 20 70 72 61 67 6d  /* Close a pragm
11840 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
11850 63 75 72 73 6f 72 20 2a 2f 0a 73 74 61 74 69 63  cursor */.static
11860 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43   int pragmaVtabC
11870 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61  lose(sqlite3_vta
11880 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a  b_cursor *cur){.
11890 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
118a0 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67  or *pCsr = (Prag
118b0 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 63 75  maVtabCursor*)cu
118c0 72 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43  r;.  pragmaVtabC
118d0 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29  ursorClear(pCsr)
118e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
118f0 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCsr);.  return
11900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11910 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 70 72  * Advance the pr
11920 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
11930 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  le cursor to the
11940 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 73 74 61   next row */.sta
11950 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
11960 61 62 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76  abNext(sqlite3_v
11970 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
11980 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67  bCursor){.  Prag
11990 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
119a0 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
119b0 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
119c0 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  sor;.  int rc = 
119d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
119e0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 78   Increment the x
119f0 52 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20  Rowid value */. 
11a00 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 2b 2b 3b   pCsr->iRowid++;
11a10 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
11a20 3e 70 50 72 61 67 6d 61 20 29 3b 0a 20 20 69 66  >pPragma );.  if
11a30 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71  ( SQLITE_ROW!=sq
11a40 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d  lite3_step(pCsr-
11a50 3e 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20 20  >pPragma) ){.   
11a60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
11a70 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72  nalize(pCsr->pPr
11a80 61 67 6d 61 29 3b 0a 20 20 20 20 70 43 73 72 2d  agma);.    pCsr-
11a90 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20  >pPragma = 0;.  
11aa0 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73    pragmaVtabCurs
11ab0 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20  orClear(pCsr);. 
11ac0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11ad0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61  }../* .** Pragma
11ae0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
11af0 6f 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d 65  odule xFilter me
11b00 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
11b10 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 46 69  int pragmaVtabFi
11b20 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  lter(.  sqlite3_
11b30 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
11b40 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74  abCursor, .  int
11b50 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63   idxNum, const c
11b60 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69  har *idxStr,.  i
11b70 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
11b80 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
11b90 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
11ba0 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
11bb0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
11bc0 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72  VtabCursor;.  Pr
11bd0 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d  agmaVtab *pTab =
11be0 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70   (PragmaVtab*)(p
11bf0 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
11c00 62 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  b);.  int rc;.  
11c10 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 53 74 72 41  int i, j;.  StrA
11c20 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72  ccum acc;.  char
11c30 20 2a 7a 53 71 6c 3b 0a 0a 20 20 55 4e 55 53 45   *zSql;..  UNUSE
11c40 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 78 4e  D_PARAMETER(idxN
11c50 75 6d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  um);.  UNUSED_PA
11c60 52 41 4d 45 54 45 52 28 69 64 78 53 74 72 29 3b  RAMETER(idxStr);
11c70 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72  .  pragmaVtabCur
11c80 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a  sorClear(pCsr);.
11c90 20 20 6a 20 3d 20 28 70 54 61 62 2d 3e 70 4e 61    j = (pTab->pNa
11ca0 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  me->mPragFlg & P
11cb0 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 29 21  ragFlg_Result1)!
11cc0 3d 30 20 3f 20 30 20 3a 20 31 3b 0a 20 20 66 6f  =0 ? 0 : 1;.  fo
11cd0 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
11ce0 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 61 73  ++, j++){.    as
11cf0 73 65 72 74 28 20 6a 3c 41 72 72 61 79 53 69 7a  sert( j<ArraySiz
11d00 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 20 29  e(pCsr->azArg) )
11d10 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72  ;.    pCsr->azAr
11d20 67 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  g[j] = sqlite3_m
11d30 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
11d40 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
11d50 61 72 67 76 5b 69 5d 29 29 3b 0a 20 20 20 20 69  argv[i]));.    i
11d60 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a  f( pCsr->azArg[j
11d70 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  ]==0 ){.      re
11d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11d90 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  M;.    }.  }.  s
11da0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
11db0 69 74 28 26 61 63 63 2c 20 30 2c 20 30 2c 20 30  it(&acc, 0, 0, 0
11dc0 2c 20 70 54 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d  , pTab->db->aLim
11dd0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
11de0 53 51 4c 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20  SQL_LENGTH]);.  
11df0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
11e00 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22  ppendAll(&acc, "
11e10 50 52 41 47 4d 41 20 22 29 3b 0a 20 20 69 66 28  PRAGMA ");.  if(
11e20 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 20   pCsr->azArg[1] 
11e30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50  ){.    sqlite3XP
11e40 72 69 6e 74 66 28 26 61 63 63 2c 20 22 25 51 2e  rintf(&acc, "%Q.
11e50 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31  ", pCsr->azArg[1
11e60 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
11e70 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
11e80 6c 6c 28 26 61 63 63 2c 20 70 54 61 62 2d 3e 70  ll(&acc, pTab->p
11e90 4e 61 6d 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Name->zName);.  
11ea0 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b  if( pCsr->azArg[
11eb0 30 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  0] ){.    sqlite
11ec0 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22  3XPrintf(&acc, "
11ed0 3d 25 51 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72  =%Q", pCsr->azAr
11ee0 67 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53 71  g[0]);.  }.  zSq
11ef0 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63  l = sqlite3StrAc
11f00 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b  cumFinish(&acc);
11f10 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
11f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11f30 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OMEM;.  rc = sql
11f40 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
11f50 70 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  pTab->db, zSql, 
11f60 2d 31 2c 20 26 70 43 73 72 2d 3e 70 50 72 61 67  -1, &pCsr->pPrag
11f70 6d 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ma, 0);.  sqlite
11f80 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
11f90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11fa0 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 62  K ){.    pTab->b
11fb0 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71  ase.zErrMsg = sq
11fc0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
11fd0 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
11fe0 73 67 28 70 54 61 62 2d 3e 64 62 29 29 3b 0a 20  sg(pTab->db));. 
11ff0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12000 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 61 67 6d  }.  return pragm
12010 61 56 74 61 62 4e 65 78 74 28 70 56 74 61 62 43  aVtabNext(pVtabC
12020 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ursor);.}../*.**
12030 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   Pragma virtual 
12040 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 45 6f  table module xEo
12050 66 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  f method..*/.sta
12060 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
12070 61 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74  abEof(sqlite3_vt
12080 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
12090 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d  Cursor){.  Pragm
120a0 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
120b0 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
120c0 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
120d0 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 43  or;.  return (pC
120e0 73 72 2d 3e 70 50 72 61 67 6d 61 3d 3d 30 29 3b  sr->pPragma==0);
120f0 0a 7d 0a 0a 2f 2a 20 54 68 65 20 78 43 6f 6c 75  .}../* The xColu
12100 6d 6e 20 6d 65 74 68 6f 64 20 73 69 6d 70 6c 79  mn method simply
12110 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 72   returns the cor
12120 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
12130 6e 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 50 52  n from.** the PR
12140 41 47 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  AGMA.  .*/.stati
12150 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
12160 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65  Column(.  sqlite
12170 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
12180 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 73  VtabCursor, .  s
12190 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
121a0 63 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b  ctx, .  int i.){
121b0 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
121c0 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
121d0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
121e0 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72  VtabCursor;.  Pr
121f0 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d  agmaVtab *pTab =
12200 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70   (PragmaVtab*)(p
12210 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
12220 62 29 3b 0a 20 20 69 66 28 20 69 3c 70 54 61 62  b);.  if( i<pTab
12230 2d 3e 69 48 69 64 64 65 6e 20 29 7b 0a 20 20 20  ->iHidden ){.   
12240 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
12250 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74  value(ctx, sqlit
12260 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
12270 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 69  pCsr->pPragma, i
12280 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
12290 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
122a0 74 65 78 74 28 63 74 78 2c 20 70 43 73 72 2d 3e  text(ctx, pCsr->
122b0 61 7a 41 72 67 5b 69 2d 70 54 61 62 2d 3e 69 48  azArg[i-pTab->iH
122c0 69 64 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54 45  idden],-1,SQLITE
122d0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
122e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
122f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50  _OK;.}../* .** P
12300 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
12310 62 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69  ble module xRowi
12320 64 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  d method..*/.sta
12330 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
12340 61 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f  abRowid(sqlite3_
12350 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
12360 61 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65  abCursor, sqlite
12370 5f 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 50 72  _int64 *p){.  Pr
12380 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a  agmaVtabCursor *
12390 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74  pCsr = (PragmaVt
123a0 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43  abCursor*)pVtabC
123b0 75 72 73 6f 72 3b 0a 20 20 2a 70 20 3d 20 70 43  ursor;.  *p = pC
123c0 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65  sr->iRowid;.  re
123d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
123e0 7d 0a 0a 2f 2a 20 54 68 65 20 70 72 61 67 6d 61  }../* The pragma
123f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f   virtual table o
12400 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20  bject */.static 
12410 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
12420 64 75 6c 65 20 70 72 61 67 6d 61 56 74 61 62 4d  dule pragmaVtabM
12430 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20  odule = {.  0,  
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
12460 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  sion */.  0,    
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12480 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
12490 65 20 2d 20 63 72 65 61 74 65 20 61 20 74 61 62  e - create a tab
124a0 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  le */.  pragmaVt
124b0 61 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20  abConnect,      
124c0 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74       /* xConnect
124d0 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e   - connect to an
124e0 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
124f0 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 42  */.  pragmaVtabB
12500 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20  estIndex,       
12510 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20    /* xBestIndex 
12520 2d 20 44 65 74 65 72 6d 69 6e 65 20 73 65 61 72  - Determine sear
12530 63 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20  ch strategy */. 
12540 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f   pragmaVtabDisco
12550 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a  nnect,        /*
12560 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44   xDisconnect - D
12570 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61  isconnect from a
12580 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20   table */.  0,  
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73           /* xDes
125b0 74 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74 61  troy - Drop a ta
125c0 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  ble */.  pragmaV
125d0 74 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  tabOpen,        
125e0 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d        /* xOpen -
125f0 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a   open a cursor *
12600 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6c  /.  pragmaVtabCl
12610 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
12620 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f   /* xClose - clo
12630 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  se a cursor */. 
12640 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65   pragmaVtabFilte
12650 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
12660 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69   xFilter - confi
12670 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72  gure scan constr
12680 61 69 6e 74 73 20 2a 2f 0a 20 20 70 72 61 67 6d  aints */.  pragm
12690 61 56 74 61 62 4e 65 78 74 2c 20 20 20 20 20 20  aVtabNext,      
126a0 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74          /* xNext
126b0 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72   - advance a cur
126c0 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  sor */.  pragmaV
126d0 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20 20  tabEof,         
126e0 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f        /* xEof */
126f0 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c  .  pragmaVtabCol
12700 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
12710 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61  /* xColumn - rea
12720 64 20 64 61 74 61 20 2a 2f 0a 20 20 70 72 61 67  d data */.  prag
12730 6d 61 56 74 61 62 52 6f 77 69 64 2c 20 20 20 20  maVtabRowid,    
12740 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77           /* xRow
12750 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  id - read data *
12760 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77 72   /* xUpdate - wr
12790 69 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c  ite data */.  0,
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42             /* xB
127c0 65 67 69 6e 20 2d 20 62 65 67 69 6e 20 74 72 61  egin - begin tra
127d0 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c  nsaction */.  0,
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
12800 79 6e 63 20 2d 20 73 79 6e 63 20 74 72 61 6e 73  ync - sync trans
12810 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  action */.  0,  
12820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12830 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d           /* xCom
12840 6d 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61  mit - commit tra
12850 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c  nsaction */.  0,
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
12880 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61  ollback - rollba
12890 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  ck transaction *
128a0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128c0 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69 6f   /* xFindFunctio
128d0 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  n - function ove
128e0 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 30 2c  rloading */.  0,
128f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
12910 65 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74  ename - rename t
12920 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c  he table */.  0,
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
12950 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c  avepoint */.  0,
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
12980 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20 20 20  elease */.  0   
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c           /* xRol
129b0 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f  lbackTo */.};../
129c0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
129d0 65 20 69 66 20 7a 54 61 62 4e 61 6d 65 20 69 73  e if zTabName is
129e0 20 72 65 61 6c 6c 79 20 74 68 65 20 6e 61 6d 65   really the name
129f0 20 6f 66 20 61 20 70 72 61 67 6d 61 2e 20 20 49   of a pragma.  I
12a00 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 65 6e  f it is,.** then
12a10 20 72 65 67 69 73 74 65 72 20 61 6e 20 65 70 6f   register an epo
12a20 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74  nymous virtual t
12a30 61 62 6c 65 20 66 6f 72 20 74 68 61 74 20 70 72  able for that pr
12a40 61 67 6d 61 20 61 6e 64 20 72 65 74 75 72 6e 0a  agma and return.
12a50 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
12a60 74 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a 65 63  the Module objec
12a70 74 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  t for the new vi
12a80 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
12a90 4d 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65 33 50  Module *sqlite3P
12aa0 72 61 67 6d 61 56 74 61 62 52 65 67 69 73 74 65  ragmaVtabRegiste
12ab0 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  r(sqlite3 *db, c
12ac0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
12ad0 29 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d  ){.  const Pragm
12ae0 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a 20 20  aName *pName;.  
12af0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12b00 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  strnicmp(zName, 
12b10 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30  "pragma_", 7)==0
12b20 20 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 70 72   );.  pName = pr
12b30 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61 6d 65  agmaLocate(zName
12b40 2b 37 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  +7);.  if( pName
12b50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
12b60 20 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e 6d 50    if( (pName->mP
12b70 72 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c  ragFlg & (PragFl
12b80 67 5f 52 65 73 75 6c 74 30 7c 50 72 61 67 46 6c  g_Result0|PragFl
12b90 67 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30 20 29  g_Result1))==0 )
12ba0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
12bb0 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68  ert( sqlite3Hash
12bc0 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Find(&db->aModul
12bd0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a  e, zName)==0 );.
12be0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12bf0 56 74 61 62 43 72 65 61 74 65 4d 6f 64 75 6c 65  VtabCreateModule
12c00 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 72 61  (db, zName, &pra
12c10 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c 20 28  gmaVtabModule, (
12c20 76 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30 29 3b  void*)pName, 0);
12c30 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
12c40 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12c50 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69  LTABLE */..#endi
12c60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12c70 5f 50 52 41 47 4d 41 20 2a 2f 0a                 _PRAGMA */.