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

Artifact 2ae4088e9c3ca0e63ffc3ada7f2d2d66e91f0b3db50c7f7ddb2f56e9e37fd638:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 74  esult row with t
2400: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 68 65 6c  he result.** hel
2410: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 65  d in register re
2420: 67 52 65 73 75 6c 74 2e 20 20 44 65 63 72 65 6d  gResult.  Decrem
2430: 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74 20 63  ent the result c
2440: 6f 75 6e 74 20 61 6e 64 20 68 61 6c 74 20 69 66  ount and halt if
2450: 0a 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  .** the maximum 
2460: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
2470: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
2480: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
2490: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
24a0: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24b0: 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 52 65  be *v, int regRe
24c0: 73 75 6c 74 29 7b 0a 20 20 69 6e 74 20 61 64 64  sult){.  int add
24d0: 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  r;.  sqlite3Vdbe
24e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
24f0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
2500: 74 2c 20 31 29 3b 0a 20 20 61 64 64 72 20 3d 20  t, 1);.  addr = 
2510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2520: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  3(v, OP_IfPos, 1
2530: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
2540: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 31  rentAddr(v)+2, 1
2550: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
2560: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
2570: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2580: 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 72  Halt, 0, 0);.  r
2590: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
25a0: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70  *.** Process a p
25b0: 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  ragma statement.
25c0: 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73    .**.** Pragmas
25d0: 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72   are of this for
25e0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52  m:.**.**      PR
25f0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 64  AGMA [schema.]id
2600: 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a   [= value].**.**
2610: 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   The identifier 
2620: 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
2630: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c  string.  The val
2640: 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  ue is a string, 
2650: 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  and.** identifie
2660: 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20  r, or a number. 
2670: 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73   If minusFlag is
2680: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
2690: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75  value is.** a nu
26a0: 6d 62 65 72 20 74 68 61 74 20 77 61 73 20 70 72  mber that was pr
26b0: 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75  eceded by a minu
26c0: 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  s sign..**.** If
26d0: 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 20 69   the left side i
26e0: 73 20 22 64 61 74 61 62 61 73 65 2e 69 64 22 20  s "database.id" 
26f0: 74 68 65 6e 20 70 49 64 31 20 69 73 20 74 68 65  then pId1 is the
2700: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
2710: 2a 20 61 6e 64 20 70 49 64 32 20 69 73 20 74 68  * and pId2 is th
2720: 65 20 69 64 2e 20 20 49 66 20 74 68 65 20 6c 65  e id.  If the le
2730: 66 74 20 73 69 64 65 20 69 73 20 6a 75 73 74 20  ft side is just 
2740: 22 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69  "id" then pId1 i
2750: 73 20 74 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20  s the.** id and 
2760: 70 49 64 32 20 69 73 20 61 6e 79 20 65 6d 70 74  pId2 is any empt
2770: 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  y string..*/.voi
2780: 64 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28  d sqlite3Pragma(
2790: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27a0: 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31  , .  Token *pId1
27b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ,        /* Firs
27c0: 74 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  t part of [schem
27d0: 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20  a.]id field */. 
27e0: 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c 20 20 20   Token *pId2,   
27f0: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
2800: 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d  art of [schema.]
2810: 69 64 20 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c  id field, or NUL
2820: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56  L */.  Token *pV
2830: 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f  alue,      /* To
2840: 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c  ken for <value>,
2850: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
2860: 74 20 6d 69 6e 75 73 46 6c 61 67 20 20 20 20 20  t minusFlag     
2870: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 27    /* True if a '
2880: 2d 27 20 73 69 67 6e 20 70 72 65 63 65 64 65 64  -' sign preceded
2890: 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20   <value> */.){. 
28a0: 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30   char *zLeft = 0
28b0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  ;       /* Nul-t
28c0: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
28d0: 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20  string <id> */. 
28e0: 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20   char *zRight = 
28f0: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  0;      /* Nul-t
2900: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
2910: 73 74 72 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20  string <value>, 
2920: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
2930: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
2940: 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
2950: 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f  ase name */.  To
2960: 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20 20 20 20  ken *pId;       
2970: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2980: 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f  to <id> token */
2990: 0a 20 20 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b  .  char *aFcntl[
29a0: 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 67  4];       /* Arg
29b0: 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f  ument to SQLITE_
29c0: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a  FCNTL_PRAGMA */.
29d0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
29e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
29f0: 62 61 73 65 20 69 6e 64 65 78 20 66 6f 72 20 3c  base index for <
2a00: 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a 20 20 69  database> */.  i
2a10: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
2a30: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 6d  eturn value form
2a40: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
2a50: 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c 69 74 65  AGMA */.  sqlite
2a60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2a70: 64 62 3b 20 20 20 20 2f 2a 20 54 68 65 20 64 61  db;    /* The da
2a80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a90: 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20  n */.  Db *pDb; 
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
2ac0: 66 69 63 20 64 61 74 61 62 61 73 65 20 62 65 69  fic database bei
2ad0: 6e 67 20 70 72 61 67 6d 61 65 64 20 2a 2f 0a 20  ng pragmaed */. 
2ae0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
2af0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2b00: 29 3b 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20  );  /* Prepared 
2b10: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
2b20: 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
2b30: 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f 2a 20 54  *pPragma;   /* T
2b40: 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 0a 20 20  he pragma */..  
2b50: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
2b60: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
2b70: 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76 29 3b 0a  RunOnlyOnce(v);.
2b80: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
2b90: 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 70   2;..  /* Interp
2ba0: 72 65 74 20 74 68 65 20 5b 73 63 68 65 6d 61 2e  ret the [schema.
2bb0: 5d 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72  ] part of the pr
2bc0: 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20  agma statement. 
2bd0: 69 44 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20  iDb is the.  ** 
2be0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
2bf0: 61 62 61 73 65 20 74 68 69 73 20 70 72 61 67 6d  abase this pragm
2c00: 61 20 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69  a is being appli
2c10: 65 64 20 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b  ed to in db.aDb[
2c20: 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  ]. */.  iDb = sq
2c30: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
2c40: 28 70 50 61 72 73 65 2c 20 70 49 64 31 2c 20 70  (pParse, pId1, p
2c50: 49 64 32 2c 20 26 70 49 64 29 3b 0a 20 20 69 66  Id2, &pId);.  if
2c60: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
2c70: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
2c80: 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 49  Db[iDb];..  /* I
2c90: 66 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  f the temp datab
2ca0: 61 73 65 20 68 61 73 20 62 65 65 6e 20 65 78 70  ase has been exp
2cb0: 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64 20 61 73  licitly named as
2cc0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 0a 20 20   part of the .  
2cd0: 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61 6b 65 20  ** pragma, make 
2ce0: 73 75 72 65 20 69 74 20 69 73 20 6f 70 65 6e 2e  sure it is open.
2cf0: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62   .  */.  if( iDb
2d00: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 4f 70  ==1 && sqlite3Op
2d10: 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
2d20: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
2d30: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 4c 65  turn;.  }..  zLe
2d40: 66 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ft = sqlite3Name
2d50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 49  FromToken(db, pI
2d60: 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c 65 66 74  d);.  if( !zLeft
2d70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2d80: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
2d90: 20 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74    zRight = sqlit
2da0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d  e3MPrintf(db, "-
2db0: 25 54 22 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  %T", pValue);.  
2dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68  }else{.    zRigh
2dd0: 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  t = sqlite3NameF
2de0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 56 61  romToken(db, pVa
2df0: 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  lue);.  }..  ass
2e00: 65 72 74 28 20 70 49 64 32 20 29 3b 0a 20 20 7a  ert( pId2 );.  z
2e10: 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e 30 20 3f  Db = pId2->n>0 ?
2e20: 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a   pDb->zDbSName :
2e30: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
2e40: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
2e50: 65 2c 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e, SQLITE_PRAGMA
2e60: 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 2c  , zLeft, zRight,
2e70: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 67 6f 74   zDb) ){.    got
2e80: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
2e90: 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20 61 6e 20  }..  /* Send an 
2ea0: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
2eb0: 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GMA file-control
2ec0: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
2ed0: 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e  ng VFS.  ** conn
2ee0: 65 63 74 69 6f 6e 2e 20 20 49 66 20 69 74 20 72  ection.  If it r
2ef0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2f00: 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68  , then assume th
2f10: 61 74 20 74 68 65 20 56 46 53 0a 20 20 2a 2a 20  at the VFS.  ** 
2f20: 68 61 6e 64 6c 65 64 20 74 68 65 20 70 72 61 67  handled the prag
2f30: 6d 61 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ma and generate 
2f40: 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61 72 65 64  a no-op prepared
2f50: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a   statement..  **
2f60: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
2f70: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32 32 33 38  TION-OF: R-12238
2f80: 2d 35 35 31 32 30 20 57 68 65 6e 65 76 65 72 20  -55120 Whenever 
2f90: 61 20 50 52 41 47 4d 41 20 73 74 61 74 65 6d 65  a PRAGMA stateme
2fa0: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 0a 20 20  nt is parsed,.  
2fb0: 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e  ** an SQLITE_FCN
2fc0: 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c 65 20 63  TL_PRAGMA file c
2fd0: 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e 74 20 74  ontrol is sent t
2fe0: 6f 20 74 68 65 20 6f 70 65 6e 20 73 71 6c 69 74  o the open sqlit
2ff0: 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a  e3_file.  ** obj
3000: 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
3010: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
3020: 65 20 66 69 6c 65 20 74 6f 20 77 68 69 63 68 20  e file to which 
3030: 74 68 65 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20  the pragma.  ** 
3040: 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 73  statement refers
3050: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
3060: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
3070: 2d 32 39 38 37 35 2d 33 31 36 37 38 20 54 68 65  -29875-31678 The
3080: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3090: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
30a0: 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c 65 20 63  AGMA.  ** file c
30b0: 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20 61 72 72  ontrol is an arr
30c0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
30d0: 6f 20 73 74 72 69 6e 67 73 20 28 63 68 61 72 2a  o strings (char*
30e0: 2a 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a  *) in which the.
30f0: 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d    ** second elem
3100: 65 6e 74 20 6f 66 20 74 68 65 20 61 72 72 61 79  ent of the array
3110: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
3120: 74 68 65 20 70 72 61 67 6d 61 20 61 6e 64 20 74  the pragma and t
3130: 68 65 20 74 68 69 72 64 0a 20 20 2a 2a 20 65 6c  he third.  ** el
3140: 65 6d 65 6e 74 20 69 73 20 74 68 65 20 61 72 67  ement is the arg
3150: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 61  ument to the pra
3160: 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  gma or NULL if t
3170: 68 65 20 70 72 61 67 6d 61 20 68 61 73 20 6e 6f  he pragma has no
3180: 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  .  ** argument..
3190: 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d    */.  aFcntl[0]
31a0: 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31   = 0;.  aFcntl[1
31b0: 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63  ] = zLeft;.  aFc
31c0: 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b  ntl[2] = zRight;
31d0: 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30  .  aFcntl[3] = 0
31e0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
31f0: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
3200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
3210: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
3220: 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
3230: 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29  _PRAGMA, (void*)
3240: 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72  aFcntl);.  if( r
3250: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3270: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b  etNumCols(v, 1);
3280: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3290: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c  SetColName(v, 0,
32a0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61   COLNAME_NAME, a
32b0: 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c 49 54 45  Fcntl[0], SQLITE
32c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
32d0: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
32e0: 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b  t(v, aFcntl[0]);
32f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
3300: 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20  e(aFcntl[0]);.  
3310: 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75    goto pragma_ou
3320: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  t;.  }.  if( rc!
3330: 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
3340: 20 29 7b 0a 20 20 20 20 69 66 28 20 61 46 63 6e   ){.    if( aFcn
3350: 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  tl[0] ){.      s
3360: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3370: 50 61 72 73 65 2c 20 22 25 73 22 2c 20 61 46 63  Parse, "%s", aFc
3380: 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73  ntl[0]);.      s
3390: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e  qlite3_free(aFcn
33a0: 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  tl[0]);.    }.  
33b0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
33c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
33d0: 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20   = rc;.    goto 
33e0: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a  pragma_out;.  }.
33f0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
3400: 20 70 72 61 67 6d 61 20 69 6e 20 74 68 65 20 6c   pragma in the l
3410: 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a 2f 0a 20  ookup table */. 
3420: 20 70 50 72 61 67 6d 61 20 3d 20 70 72 61 67 6d   pPragma = pragm
3430: 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74 29 3b 0a  aLocate(zLeft);.
3440: 20 20 69 66 28 20 70 50 72 61 67 6d 61 3d 3d 30    if( pPragma==0
3450: 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f   ) goto pragma_o
3460: 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ut;..  /* Make s
3470: 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
3480: 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65   schema is loade
3490: 64 20 69 66 20 74 68 65 20 70 72 61 67 6d 61 20  d if the pragma 
34a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 2a 2f  requires that */
34b0: 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d  .  if( (pPragma-
34c0: 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
34d0: 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d 61 29 21  Flg_NeedSchema)!
34e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
34f0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
3500: 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70  pParse) ) goto p
3510: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  ragma_out;.  }..
3520: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
3530: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
3540: 6e 61 6d 65 73 20 66 6f 72 20 70 72 61 67 6d 61  names for pragma
3550: 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 72 65  s that return re
3560: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66 28 20 28  sults */.  if( (
3570: 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
3580: 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f  g & PragFlg_NoCo
3590: 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20 20 26 26  lumns)==0 .   &&
35a0: 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61   ((pPragma->mPra
35b0: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
35c0: 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c  oColumns1)==0 ||
35d0: 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20 20 29 7b   zRight==0).  ){
35e0: 0a 20 20 20 20 73 65 74 50 72 61 67 6d 61 52 65  .    setPragmaRe
35f0: 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  sultColumnNames(
3600: 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d  v, pPragma);.  }
3610: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
3620: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
3630: 72 61 67 6d 61 20 68 61 6e 64 6c 65 72 20 2a 2f  ragma handler */
3640: 0a 20 20 73 77 69 74 63 68 28 20 70 50 72 61 67  .  switch( pPrag
3650: 6d 61 2d 3e 65 50 72 61 67 54 79 70 20 29 7b 0a  ma->ePragTyp ){.
3660: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
3670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
3680: 52 5f 50 52 41 47 4d 41 53 29 20 26 26 20 21 64  R_PRAGMAS) && !d
3690: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
36a0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20  IT_DEPRECATED). 
36b0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
36c0: 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c   [schema.]defaul
36d0: 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a  t_cache_size.  *
36e0: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
36f0: 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65  a.]default_cache
3700: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
3710: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
3720: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
3730: 72 65 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20  rent persistent 
3740: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
3750: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
3760: 73 69 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65  size.  The value
3770: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
3780: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
3790: 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e  of.  ** pages in
37a0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
37b0: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
37c0: 6d 20 73 65 74 73 20 62 6f 74 68 20 74 68 65 20  m sets both the 
37d0: 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67  current.  ** pag
37e0: 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
37f0: 75 65 20 61 6e 64 20 74 68 65 20 70 65 72 73 69  ue and the persi
3800: 73 74 65 6e 74 20 70 61 67 65 20 63 61 63 68 65  stent page cache
3810: 20 73 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a   size value.  **
3820: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
3830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
3840: 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65  **.  ** Older ve
3850: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
3860: 20 77 6f 75 6c 64 20 73 65 74 20 74 68 65 20 64   would set the d
3870: 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a  efault cache siz
3880: 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61  e to a.  ** nega
3890: 74 69 76 65 20 6e 75 6d 62 65 72 20 74 6f 20 69  tive number to i
38a0: 6e 64 69 63 61 74 65 20 73 79 6e 63 68 72 6f 6e  ndicate synchron
38b0: 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65 73 65 20  ous=OFF.  These 
38c0: 64 61 79 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75  days, synchronou
38d0: 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  s.  ** is always
38e0: 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 72   on by default r
38f0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
3900: 20 73 69 67 6e 20 6f 66 20 74 68 65 20 64 65 66   sign of the def
3910: 61 75 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20  ault cache.  ** 
3920: 73 69 7a 65 2e 20 20 42 75 74 20 63 6f 6e 74 69  size.  But conti
3930: 6e 75 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  nue to take the 
3940: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
3950: 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61  f the default ca
3960: 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  che.  ** size of
3970: 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
3980: 61 74 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a  atibility..  */.
3990: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44    case PragTyp_D
39a0: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
39b0: 45 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  E: {.    static 
39c0: 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20  const int iLn = 
39d0: 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45  VDBE_OFFSET_LINE
39e0: 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69  NO(2);.    stati
39f0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
3a00: 73 74 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  st getCacheSize[
3a10: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
3a20: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c  _Transaction, 0,
3a30: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20         /* 0 */. 
3a60: 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f       { OP_ReadCo
3a70: 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20 20 20 20  okie,  0, 1,    
3a80: 20 20 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c      BTREE_DEFAUL
3a90: 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20  T_CACHE_SIZE},  
3aa0: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
3ab0: 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20  OP_IfPos,       
3ac0: 31 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 8,        0},
3ad0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
3ae0: 67 65 72 2c 20 20 20 20 20 30 2c 20 32 2c 20 20  ger,     0, 2,  
3af0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3b00: 7b 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 20  { OP_Subtract,  
3b10: 20 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20 31    1, 2,        1
3b20: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66  },.      { OP_If
3b30: 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c  Pos,       1, 8,
3b40: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
3b50: 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
3b60: 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20      0, 1,       
3b70: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20   0},            
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b90: 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  6 */.      { OP_
3ba0: 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 30 2c 20  Noop,        0, 
3bb0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
3bc0: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
3bd0: 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  ow,   1, 1,     
3be0: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
3bf0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
3c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
3c10: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
3c20: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
3c30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
3c40: 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20  ->nMem += 2;.   
3c50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
3c60: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
3c70: 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a  ired(v, ArraySiz
3c80: 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 29  e(getCacheSize))
3c90: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
3ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
3cb0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
3cc0: 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67  getCacheSize), g
3cd0: 65 74 43 61 63 68 65 53 69 7a 65 2c 20 69 4c 6e  etCacheSize, iLn
3ce0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c  );.      if( ONL
3cf0: 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  Y_IF_REALLOC_STR
3d00: 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72  ESS(aOp==0) ) br
3d10: 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30  eak;.      aOp[0
3d20: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
3d30: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
3d40: 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 36 5d 2e  b;.      aOp[6].
3d50: 70 31 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  p1 = SQLITE_DEFA
3d60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a  ULT_CACHE_SIZE;.
3d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3d80: 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69   int size = sqli
3d90: 74 65 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69  te3AbsInt32(sqli
3da0: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29  te3Atoi(zRight))
3db0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3dc0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
3dd0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
3de0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
3df0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3e00: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
3e10: 2c 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f  , BTREE_DEFAULT_
3e20: 43 41 43 48 45 5f 53 49 5a 45 2c 20 73 69 7a 65  CACHE_SIZE, size
3e30: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3e40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3e50: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3e60: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 44 62   0) );.      pDb
3e70: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
3e80: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
3e90: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
3ea0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62  SetCacheSize(pDb
3eb0: 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68  ->pBt, pDb->pSch
3ec0: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29  ema->cache_size)
3ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
3ee0: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
3ef0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41   !SQLITE_OMIT_PA
3f00: 47 45 52 5f 50 52 41 47 4d 41 53 20 26 26 20 21  GER_PRAGMAS && !
3f10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
3f20: 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69 66 20 21  ECATED */..#if !
3f30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3f40: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
3f50: 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  S).  /*.  **  PR
3f60: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f70: 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  ge_size.  **  PR
3f80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f90: 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  ge_size=N.  **. 
3fa0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
3fb0: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
3fc0: 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66  urrent setting f
3fd0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  or the.  ** data
3fe0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 69  base page size i
3ff0: 6e 20 62 79 74 65 73 2e 20 20 54 68 65 20 73 65  n bytes.  The se
4000: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
4010: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
4020: 20 70 61 67 65 20 73 69 7a 65 20 76 61 6c 75 65   page size value
4030: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 63 61 6e  .  The value can
4040: 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 0a   only be set if.
4050: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
4060: 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
4070: 65 6e 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  en created..  */
4080: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4090: 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  PAGE_SIZE: {.   
40a0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
40b0: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  b->pBt;.    asse
40c0: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
40d0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
40e0: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
40f0: 3d 20 41 4c 57 41 59 53 28 70 42 74 29 20 3f 20  = ALWAYS(pBt) ? 
4100: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
4110: 61 67 65 53 69 7a 65 28 70 42 74 29 20 3a 20 30  ageSize(pBt) : 0
4120: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
4130: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69 7a 65 29  ngleInt(v, size)
4140: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4150: 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79     /* Malloc may
4160: 20 66 61 69 6c 20 77 68 65 6e 20 73 65 74 74 69   fail when setti
4170: 6e 67 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  ng the page-size
4180: 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 61 6e  , as there is an
4190: 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20   internal.      
41a0: 2a 2a 20 62 75 66 66 65 72 20 74 68 61 74 20 74  ** buffer that t
41b0: 68 65 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20  he pager module 
41c0: 72 65 73 69 7a 65 73 20 75 73 69 6e 67 20 73 71  resizes using sq
41d0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e  lite3_realloc().
41e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
41f0: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4200: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
4210: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66  Right);.      if
4220: 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
4230: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
4240: 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
4250: 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 2d 31  >nextPagesize,-1
4260: 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ,0) ){.        s
4270: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
4280: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
4290: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
42a0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
42b0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63  GMA [schema.]sec
42c0: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
42d0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
42e0: 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f  ]secure_delete=O
42f0: 4e 2f 4f 46 46 2f 46 41 53 54 0a 20 20 2a 2a 0a  N/OFF/FAST.  **.
4300: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
4310: 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20  orm reports the 
4320: 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
4330: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 65 63  for the.  ** sec
4340: 75 72 65 5f 64 65 6c 65 74 65 20 66 6c 61 67 2e  ure_delete flag.
4350: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
4360: 6d 20 63 68 61 6e 67 65 73 20 74 68 65 20 73 65  m changes the se
4370: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a  cure_delete.  **
4380: 20 66 6c 61 67 20 73 65 74 74 69 6e 67 20 61 6e   flag setting an
4390: 64 20 72 65 70 6f 72 74 73 20 74 68 65 20 6e 65  d reports the ne
43a0: 77 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  w value..  */.  
43b0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 45 43  case PragTyp_SEC
43c0: 55 52 45 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20  URE_DELETE: {.  
43d0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
43e0: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 69 6e 74  Db->pBt;.    int
43f0: 20 62 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73   b = -1;.    ass
4400: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
4410: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
4420: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
4430: 65 33 5f 73 74 72 69 63 6d 70 28 7a 52 69 67 68  e3_stricmp(zRigh
4440: 74 2c 20 22 66 61 73 74 22 29 3d 3d 30 20 29 7b  t, "fast")==0 ){
4450: 0a 20 20 20 20 20 20 20 20 62 20 3d 20 32 3b 0a  .        b = 2;.
4460: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4470: 20 20 20 20 20 62 20 3d 20 73 71 6c 69 74 65 33       b = sqlite3
4480: 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  GetBoolean(zRigh
4490: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
44a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
44b0: 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e 3d 30 20  2->n==0 && b>=0 
44c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
44d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
44e0: 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b   ii<db->nDb; ii+
44f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
4500: 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
4510: 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b 69 69 5d  lete(db->aDb[ii]
4520: 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20 20 20 20  .pBt, b);.      
4530: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 20 3d 20  }.    }.    b = 
4540: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
4550: 72 65 44 65 6c 65 74 65 28 70 42 74 2c 20 62 29  reDelete(pBt, b)
4560: 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  ;.    returnSing
4570: 6c 65 49 6e 74 28 76 2c 20 62 29 3b 0a 20 20 20  leInt(v, b);.   
4580: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
4590: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
45a0: 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61 67 65  schema.]max_page
45b0: 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 50 52 41  _count.  **  PRA
45c0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78  GMA [schema.]max
45d0: 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e 0a 20 20  _page_count=N.  
45e0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
45f0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
4600: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
4610: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
4620: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
4630: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
4640: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
4650: 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20  he .  ** second 
4660: 66 6f 72 6d 20 61 74 74 65 6d 70 74 73 20 74 6f  form attempts to
4670: 20 63 68 61 6e 67 65 20 74 68 69 73 20 73 65 74   change this set
4680: 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20 20 2a 2a  ting.  Both.  **
4690: 20 66 6f 72 6d 73 20 72 65 74 75 72 6e 20 74 68   forms return th
46a0: 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
46b0: 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  g..  **.  ** The
46c0: 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20   absolute value 
46d0: 6f 66 20 4e 20 69 73 20 75 73 65 64 2e 20 20 54  of N is used.  T
46e0: 68 69 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e  his is undocumen
46f0: 74 65 64 20 61 6e 64 20 6d 69 67 68 74 0a 20 20  ted and might.  
4700: 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20  ** change.  The 
4710: 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73 20  only purpose is 
4720: 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 61  to provide an ea
4730: 73 79 20 77 61 79 20 74 6f 20 74 65 73 74 0a 20  sy way to test. 
4740: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 41   ** the sqlite3A
4750: 62 73 49 6e 74 33 32 28 29 20 66 75 6e 63 74 69  bsInt32() functi
4760: 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 50  on..  **.  **  P
4770: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70  RAGMA [schema.]p
4780: 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20  age_count.  **. 
4790: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
47a0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
47b0: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
47c0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
47d0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 41   case PragTyp_PA
47e0: 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20 20 20  GE_COUNT: {.    
47f0: 69 6e 74 20 69 52 65 67 3b 0a 20 20 20 20 73 71  int iReg;.    sq
4800: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
4810: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
4820: 62 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 2b  b);.    iReg = +
4830: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
4840: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 6f     if( sqlite3To
4850: 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d  lower(zLeft[0])=
4860: 3d 27 70 27 20 29 7b 0a 20 20 20 20 20 20 73 71  ='p' ){.      sq
4870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4880: 76 2c 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74 2c  v, OP_Pagecount,
4890: 20 69 44 62 2c 20 69 52 65 67 29 3b 0a 20 20 20   iDb, iReg);.   
48a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
48b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
48c0: 76 2c 20 4f 50 5f 4d 61 78 50 67 63 6e 74 2c 20  v, OP_MaxPgcnt, 
48d0: 69 44 62 2c 20 69 52 65 67 2c 20 0a 20 20 20 20  iDb, iReg, .    
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48f0: 20 20 20 20 73 71 6c 69 74 65 33 41 62 73 49 6e      sqlite3AbsIn
4900: 74 33 32 28 73 71 6c 69 74 65 33 41 74 6f 69 28  t32(sqlite3Atoi(
4910: 7a 52 69 67 68 74 29 29 29 3b 0a 20 20 20 20 7d  zRight)));.    }
4920: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4930: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
4940: 75 6c 74 52 6f 77 2c 20 69 52 65 67 2c 20 31 29  ultRow, iReg, 1)
4950: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
4960: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
4970: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63  GMA [schema.]loc
4980: 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20  king_mode.  **  
4990: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
49a0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 28  locking_mode = (
49b0: 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73 69 76 65  normal|exclusive
49c0: 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ).  */.  case Pr
49d0: 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  agTyp_LOCKING_MO
49e0: 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  DE: {.    const 
49f0: 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 22 6e 6f  char *zRet = "no
4a00: 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e 74 20 65  rmal";.    int e
4a10: 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63 6b 69 6e  Mode = getLockin
4a20: 67 4d 6f 64 65 28 7a 52 69 67 68 74 29 3b 0a 0a  gMode(zRight);..
4a30: 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d      if( pId2->n=
4a40: 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d 50 41 47  =0 && eMode==PAG
4a50: 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
4a60: 55 45 52 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a  UERY ){.      /*
4a70: 20 53 69 6d 70 6c 65 20 22 50 52 41 47 4d 41 20   Simple "PRAGMA 
4a80: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b 22 20 73  locking_mode;" s
4a90: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
4aa0: 73 20 61 20 71 75 65 72 79 20 66 6f 72 0a 20 20  s a query for.  
4ab0: 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
4ac0: 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  nt default locki
4ad0: 6e 67 20 6d 6f 64 65 20 28 77 68 69 63 68 20 6d  ng mode (which m
4ae0: 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
4af0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
4b00: 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6f 66 20  locking-mode of 
4b10: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
4b20: 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e)..      */.   
4b30: 20 20 20 65 4d 6f 64 65 20 3d 20 64 62 2d 3e 64     eMode = db->d
4b40: 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a 20 20 20  fltLockMode;.   
4b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 61   }else{.      Pa
4b60: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
4b70: 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d     if( pId2->n==
4b80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
4b90: 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 74  This indicates t
4ba0: 68 61 74 20 6e 6f 20 64 61 74 61 62 61 73 65 20  hat no database 
4bb0: 6e 61 6d 65 20 77 61 73 20 73 70 65 63 69 66 69  name was specifi
4bc0: 65 64 20 61 73 20 70 61 72 74 0a 20 20 20 20 20  ed as part.     
4bd0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 52 41     ** of the PRA
4be0: 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20  GMA command. In 
4bf0: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6c 6f  this case the lo
4c00: 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75 73 74 20  cking-mode must 
4c10: 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  be.        ** se
4c20: 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  t on all attache
4c30: 64 20 64 61 74 61 62 61 73 65 73 2c 20 61 73 20  d databases, as 
4c40: 77 65 6c 6c 20 61 73 20 74 68 65 20 6d 61 69 6e  well as the main
4c50: 20 64 62 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   db file..      
4c60: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
4c70: 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c 69 74 65  Also, the sqlite
4c80: 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 76  3.dfltLockMode v
4c90: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 73  ariable is set s
4ca0: 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  o that.        *
4cb0: 2a 20 61 6e 79 20 73 75 62 73 65 71 75 65 6e 74  * any subsequent
4cc0: 6c 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ly attached data
4cd0: 62 61 73 65 73 20 61 6c 73 6f 20 75 73 65 20 74  bases also use t
4ce0: 68 65 20 73 70 65 63 69 66 69 65 64 0a 20 20 20  he specified.   
4cf0: 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20       ** locking 
4d00: 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  mode..        */
4d10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
4d20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
4d30: 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62 5b 30 5d  pDb==&db->aDb[0]
4d40: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
4d50: 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=2; ii<db->nDb;
4d60: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
4d70: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
4d80: 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d  e3BtreePager(db-
4d90: 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29 3b 0a 20  >aDb[ii].pBt);. 
4da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4db0: 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
4dc0: 28 70 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b  (pPager, eMode);
4dd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4de0: 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d     db->dfltLockM
4df0: 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b  ode = (u8)eMode;
4e00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
4e10: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
4e20: 74 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70  treePager(pDb->p
4e30: 42 74 29 3b 0a 20 20 20 20 20 20 65 4d 6f 64 65  Bt);.      eMode
4e40: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
4e50: 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61 67 65  ockingMode(pPage
4e60: 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  r, eMode);.    }
4e70: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4d  ..    assert( eM
4e80: 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
4e90: 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20  NGMODE_NORMAL.  
4ea0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
4eb0: 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
4ec0: 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
4ed0: 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  );.    if( eMode
4ee0: 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
4ef0: 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  ODE_EXCLUSIVE ){
4f00: 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20 22 65  .      zRet = "e
4f10: 78 63 6c 75 73 69 76 65 22 3b 0a 20 20 20 20 7d  xclusive";.    }
4f20: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
4f30: 65 54 65 78 74 28 76 2c 20 7a 52 65 74 29 3b 0a  eText(v, zRet);.
4f40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4f50: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
4f60: 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e  A [schema.]journ
4f70: 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20 50 52  al_mode.  **  PR
4f80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f  AGMA [schema.]jo
4f90: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a 20 20 2a  urnal_mode =.  *
4fa0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
4fb0: 20 20 20 20 20 20 20 28 64 65 6c 65 74 65 7c 70         (delete|p
4fc0: 65 72 73 69 73 74 7c 6f 66 66 7c 74 72 75 6e 63  ersist|off|trunc
4fd0: 61 74 65 7c 6d 65 6d 6f 72 79 7c 77 61 6c 7c 6f  ate|memory|wal|o
4fe0: 66 66 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ff).  */.  case 
4ff0: 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f  PragTyp_JOURNAL_
5000: 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20  MODE: {.    int 
5010: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a  eMode;        /*
5020: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
5030: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58  R_JOURNALMODE_XX
5040: 58 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 20  X symbols */.   
5050: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
5060: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
5070: 65 72 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a  er */..    if( z
5080: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
5090: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
50a0: 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70 61 72 74   no "=MODE" part
50b0: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 2c 20   of the pragma, 
50c0: 64 6f 20 61 20 71 75 65 72 79 20 66 6f 72 20 74  do a query for t
50d0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  he.      ** curr
50e0: 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ent mode */.    
50f0: 20 20 65 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f    eMode = PAGER_
5100: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
5110: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
5120: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5130: 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20 69 6e 74  zMode;.      int
5140: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
5150: 65 6e 33 30 28 7a 52 69 67 68 74 29 3b 0a 20 20  en30(zRight);.  
5160: 20 20 20 20 66 6f 72 28 65 4d 6f 64 65 3d 30 3b      for(eMode=0;
5170: 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65   (zMode = sqlite
5180: 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65  3JournalModename
5190: 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20 65 4d 6f  (eMode))!=0; eMo
51a0: 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  de++){.        i
51b0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
51c0: 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d 6f 64 65  mp(zRight, zMode
51d0: 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  , n)==0 ) break;
51e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
51f0: 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a 20 20 20  f( !zMode ){.   
5200: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 22       /* If the "
5210: 3d 4d 4f 44 45 22 20 70 61 72 74 20 64 6f 65 73  =MODE" part does
5220: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 6b   not match any k
5230: 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  nown journal mod
5240: 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  e,.        ** th
5250: 65 6e 20 64 6f 20 61 20 71 75 65 72 79 20 2a 2f  en do a query */
5260: 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
5270: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
5280: 44 45 5f 51 55 45 52 59 3b 0a 20 20 20 20 20 20  DE_QUERY;.      
5290: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
52a0: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
52b0: 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 26  RNALMODE_QUERY &
52c0: 26 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a  & pId2->n==0 ){.
52d0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
52e0: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
52f0: 5f 6d 6f 64 65 22 20 69 6e 74 6f 20 22 50 52 41  _mode" into "PRA
5300: 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c  GMA main.journal
5310: 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20 20 20 20 20  _mode" */.      
5320: 69 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  iDb = 0;.      p
5330: 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20 20 20 20  Id2->n = 1;.    
5340: 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d  }.    for(ii=db-
5350: 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69  >nDb-1; ii>=0; i
5360: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i--){.      if( 
5370: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20  db->aDb[ii].pBt 
5380: 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70  && (ii==iDb || p
5390: 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20  Id2->n==0) ){.  
53a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
53b0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 69  eUsesBtree(v, ii
53c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
53d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
53e0: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 2c 20  OP_JournalMode, 
53f0: 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29 3b 0a 20  ii, 1, eMode);. 
5400: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5410: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5420: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
5430: 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 62  ow, 1, 1);.    b
5440: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
5450: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
5460: 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69  hema.]journal_si
5470: 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 50  ze_limit.  **  P
5480: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
5490: 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69  ournal_size_limi
54a0: 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47 65  t=N.  **.  ** Ge
54b0: 74 20 6f 72 20 73 65 74 20 74 68 65 20 73 69 7a  t or set the siz
54c0: 65 20 6c 69 6d 69 74 20 6f 6e 20 72 6f 6c 6c 62  e limit on rollb
54d0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
54e0: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  s..  */.  case P
54f0: 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f 53  ragTyp_JOURNAL_S
5500: 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20  IZE_LIMIT: {.   
5510: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
5520: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
5530: 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  er(pDb->pBt);.  
5540: 20 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 2d    i64 iLimit = -
5550: 32 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  2;.    if( zRigh
5560: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
5570: 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
5580: 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29  zRight, &iLimit)
5590: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d  ;.      if( iLim
55a0: 69 74 3c 2d 31 20 29 20 69 4c 69 6d 69 74 20 3d  it<-1 ) iLimit =
55b0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   -1;.    }.    i
55c0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
55d0: 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c  agerJournalSizeL
55e0: 69 6d 69 74 28 70 50 61 67 65 72 2c 20 69 4c 69  imit(pPager, iLi
55f0: 6d 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  mit);.    return
5600: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 69 4c 69  SingleInt(v, iLi
5610: 6d 69 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  mit);.    break;
5620: 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  .  }..#endif /* 
5630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
5640: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 20 20  R_PRAGMAS */..  
5650: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
5660: 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61  [schema.]auto_va
5670: 63 75 75 6d 0a 20 20 2a 2a 20 20 50 52 41 47 4d  cuum.  **  PRAGM
5680: 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f 5f  A [schema.]auto_
5690: 76 61 63 75 75 6d 3d 4e 0a 20 20 2a 2a 0a 20 20  vacuum=N.  **.  
56a0: 2a 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68  ** Get or set th
56b0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
56c0: 61 74 61 62 61 73 65 20 27 61 75 74 6f 2d 76 61  atabase 'auto-va
56d0: 63 75 75 6d 27 20 70 61 72 61 6d 65 74 65 72 2e  cuum' parameter.
56e0: 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
56f0: 69 73 20 6f 6e 65 20 6f 66 3a 20 20 30 20 4e 4f  is one of:  0 NO
5700: 4e 45 20 31 20 46 55 4c 4c 20 32 20 49 4e 43 52  NE 1 FULL 2 INCR
5710: 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f 0a 23 69 66  EMENTAL.  */.#if
5720: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5730: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 63 61  _AUTOVACUUM.  ca
5740: 73 65 20 50 72 61 67 54 79 70 5f 41 55 54 4f 5f  se PragTyp_AUTO_
5750: 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 42 74  VACUUM: {.    Bt
5760: 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e  ree *pBt = pDb->
5770: 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
5780: 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69   pBt!=0 );.    i
5790: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
57a0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
57b0: 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 42 74  Int(v, sqlite3Bt
57c0: 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
57d0: 28 70 42 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  (pBt));.    }els
57e0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 41 75  e{.      int eAu
57f0: 74 6f 20 3d 20 67 65 74 41 75 74 6f 56 61 63 75  to = getAutoVacu
5800: 75 6d 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  um(zRight);.    
5810: 20 20 61 73 73 65 72 74 28 20 65 41 75 74 6f 3e    assert( eAuto>
5820: 3d 30 20 26 26 20 65 41 75 74 6f 3c 3d 32 20 29  =0 && eAuto<=2 )
5830: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74  ;.      db->next
5840: 41 75 74 6f 76 61 63 20 3d 20 28 75 38 29 65 41  Autovac = (u8)eA
5850: 75 74 6f 3b 0a 20 20 20 20 20 20 2f 2a 20 43 61  uto;.      /* Ca
5860: 6c 6c 20 53 65 74 41 75 74 6f 56 61 63 75 75 6d  ll SetAutoVacuum
5870: 28 29 20 74 6f 20 73 65 74 20 69 6e 69 74 69 61  () to set initia
5880: 6c 69 7a 65 20 74 68 65 20 69 6e 74 65 72 6e 61  lize the interna
5890: 6c 20 61 75 74 6f 20 61 6e 64 0a 20 20 20 20 20  l auto and.     
58a0: 20 2a 2a 20 69 6e 63 72 2d 76 61 63 75 75 6d 20   ** incr-vacuum 
58b0: 66 6c 61 67 73 2e 20 54 68 69 73 20 69 73 20 72  flags. This is r
58c0: 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20  equired in case 
58d0: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  this connection.
58e0: 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 73        ** creates
58f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5900: 6c 65 2e 20 49 74 20 69 73 20 69 6d 70 6f 72 74  le. It is import
5910: 61 6e 74 20 74 68 61 74 20 69 74 20 69 73 20 63  ant that it is c
5920: 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  reated.      ** 
5930: 61 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  as an auto-vacuu
5940: 6d 20 63 61 70 61 62 6c 65 20 64 62 2e 0a 20 20  m capable db..  
5950: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
5960: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  = sqlite3BtreeSe
5970: 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74 2c  tAutoVacuum(pBt,
5980: 20 65 41 75 74 6f 29 3b 0a 20 20 20 20 20 20 69   eAuto);.      i
5990: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
59a0: 20 26 26 20 28 65 41 75 74 6f 3d 3d 31 20 7c 7c   && (eAuto==1 ||
59b0: 20 65 41 75 74 6f 3d 3d 32 29 20 29 7b 0a 20 20   eAuto==2) ){.  
59c0: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 73 65        /* When se
59d0: 74 74 69 6e 67 20 74 68 65 20 61 75 74 6f 5f 76  tting the auto_v
59e0: 61 63 75 75 6d 20 6d 6f 64 65 20 74 6f 20 65 69  acuum mode to ei
59f0: 74 68 65 72 20 22 66 75 6c 6c 22 20 6f 72 20 0a  ther "full" or .
5a00: 20 20 20 20 20 20 20 20 2a 2a 20 22 69 6e 63 72          ** "incr
5a10: 65 6d 65 6e 74 61 6c 22 2c 20 77 72 69 74 65 20  emental", write 
5a20: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74  the value of met
5a30: 61 5b 36 5d 20 69 6e 20 74 68 65 20 64 61 74 61  a[6] in the data
5a40: 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  base.        ** 
5a50: 66 69 6c 65 2e 20 42 65 66 6f 72 65 20 77 72 69  file. Before wri
5a60: 74 69 6e 67 20 74 6f 20 6d 65 74 61 5b 36 5d 2c  ting to meta[6],
5a70: 20 63 68 65 63 6b 20 74 68 61 74 20 6d 65 74 61   check that meta
5a80: 5b 33 5d 20 69 6e 64 69 63 61 74 65 73 0a 20 20  [3] indicates.  
5a90: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
5aa0: 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  is really is an 
5ab0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
5ac0: 62 6c 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ble database..  
5ad0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
5ae0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
5af0: 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46  t iLn = VDBE_OFF
5b00: 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20  SET_LINENO(2);. 
5b10: 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
5b20: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73  nst VdbeOpList s
5b30: 65 74 4d 65 74 61 36 5b 5d 20 3d 20 7b 0a 20 20  etMeta6[] = {.  
5b40: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61          { OP_Tra
5b50: 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20  nsaction,    0, 
5b60: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5b70: 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20             0},  
5b80: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
5b90: 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f      { OP_ReadCoo
5ba0: 6b 69 65 2c 20 20 20 20 20 30 2c 20 20 20 20 20  kie,     0,     
5bb0: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 42      1,         B
5bc0: 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f  TREE_LARGEST_ROO
5bd0: 54 5f 50 41 47 45 7d 2c 0a 20 20 20 20 20 20 20  T_PAGE},.       
5be0: 20 20 20 7b 20 4f 50 5f 49 66 2c 20 20 20 20 20     { OP_If,     
5bf0: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5c00: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
5c10: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c20: 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  2 */.          {
5c30: 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20 20 20 20   OP_Halt,       
5c40: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f      SQLITE_OK, O
5c50: 45 5f 41 62 6f 72 74 2c 20 20 20 20 20 20 20 20  E_Abort,        
5c60: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f    0},    /* 3 */
5c70: 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  .          { OP_
5c80: 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20  SetCookie,      
5c90: 30 2c 20 20 20 20 20 20 20 20 20 42 54 52 45 45  0,         BTREE
5ca0: 5f 49 4e 43 52 5f 56 41 43 55 55 4d 2c 20 30 7d  _INCR_VACUUM, 0}
5cb0: 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20  ,    /* 4 */.   
5cc0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20       };.        
5cd0: 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20  VdbeOp *aOp;.   
5ce0: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
5cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
5d00: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
5d10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56      sqlite3VdbeV
5d20: 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71  erifyNoMallocReq
5d30: 75 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69  uired(v, ArraySi
5d40: 7a 65 28 73 65 74 4d 65 74 61 36 29 29 3b 0a 20  ze(setMeta6));. 
5d50: 20 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c         aOp = sql
5d60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
5d70: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  t(v, ArraySize(s
5d80: 65 74 4d 65 74 61 36 29 2c 20 73 65 74 4d 65 74  etMeta6), setMet
5d90: 61 36 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20  a6, iLn);.      
5da0: 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45    if( ONLY_IF_RE
5db0: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70  ALLOC_STRESS(aOp
5dc0: 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ==0) ) break;.  
5dd0: 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20        aOp[0].p1 
5de0: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 61  = iDb;.        a
5df0: 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[1].p1 = iDb;.
5e00: 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70          aOp[2].p
5e10: 32 20 3d 20 69 41 64 64 72 2b 34 3b 0a 20 20 20  2 = iAddr+4;.   
5e20: 20 20 20 20 20 61 4f 70 5b 34 5d 2e 70 31 20 3d       aOp[4].p1 =
5e30: 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f   iDb;.        aO
5e40: 70 5b 34 5d 2e 70 33 20 3d 20 65 41 75 74 6f 20  p[4].p3 = eAuto 
5e50: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  - 1;.        sql
5e60: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
5e70: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  e(v, iDb);.     
5e80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
5e90: 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ak;.  }.#endif..
5ea0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
5eb0: 41 20 5b 73 63 68 65 6d 61 2e 5d 69 6e 63 72 65  A [schema.]incre
5ec0: 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28 4e 29  mental_vacuum(N)
5ed0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 4e 20  .  **.  ** Do N 
5ee0: 73 74 65 70 73 20 6f 66 20 69 6e 63 72 65 6d 65  steps of increme
5ef0: 6e 74 61 6c 20 76 61 63 75 75 6d 69 6e 67 20 6f  ntal vacuuming o
5f00: 6e 20 61 20 64 61 74 61 62 61 73 65 2e 0a 20 20  n a database..  
5f10: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
5f20: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
5f30: 4d 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  M.  case PragTyp
5f40: 5f 49 4e 43 52 45 4d 45 4e 54 41 4c 5f 56 41 43  _INCREMENTAL_VAC
5f50: 55 55 4d 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  UUM: {.    int i
5f60: 4c 69 6d 69 74 2c 20 61 64 64 72 3b 0a 20 20 20  Limit, addr;.   
5f70: 20 69 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 7c   if( zRight==0 |
5f80: 7c 20 21 73 71 6c 69 74 65 33 47 65 74 49 6e 74  | !sqlite3GetInt
5f90: 33 32 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d  32(zRight, &iLim
5fa0: 69 74 29 20 7c 7c 20 69 4c 69 6d 69 74 3c 3d 30  it) || iLimit<=0
5fb0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
5fc0: 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   = 0x7fffffff;. 
5fd0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5fe0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
5ff0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
6000: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
6010: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6020: 5f 49 6e 74 65 67 65 72 2c 20 69 4c 69 6d 69 74  _Integer, iLimit
6030: 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  , 1);.    addr =
6040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6050: 70 31 28 76 2c 20 4f 50 5f 49 6e 63 72 56 61 63  p1(v, OP_IncrVac
6060: 75 75 6d 2c 20 69 44 62 29 3b 20 56 64 62 65 43  uum, iDb); VdbeC
6070: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6090: 31 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  1(v, OP_ResultRo
60a0: 77 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  w, 1);.    sqlit
60b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
60c0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31  OP_AddImm, 1, -1
60d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
60e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
60f0: 66 50 6f 73 2c 20 31 2c 20 61 64 64 72 29 3b 20  fPos, 1, addr); 
6100: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6110: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6120: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6130: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
6140: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
6150: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
6160: 47 45 52 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a  GER_PRAGMAS.  /*
6170: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
6180: 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a  chema.]cache_siz
6190: 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  e.  **  PRAGMA [
61a0: 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 69  schema.]cache_si
61b0: 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ze=N.  **.  ** T
61c0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
61d0: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
61e0: 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20  t local setting 
61f0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
6200: 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20 54 68  e cache size. Th
6210: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
6220: 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a 20 20 2a  ts the local.  *
6230: 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  * page cache siz
6240: 65 20 76 61 6c 75 65 2e 20 20 49 66 20 4e 20 69  e value.  If N i
6250: 73 20 70 6f 73 69 74 69 76 65 20 74 68 65 6e 20  s positive then 
6260: 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 2a 2a  that is the.  **
6270: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
6280: 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 20 20   in the cache.  
6290: 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65  If N is negative
62a0: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
62b0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
62c0: 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f 20 74  is adjusted so t
62d0: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 75 73  hat the cache us
62e0: 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65 73 0a  es -N kibibytes.
62f0: 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a    ** of memory..
6300: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
6310: 54 79 70 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20  Typ_CACHE_SIZE: 
6320: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
6330: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
6340: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
6350: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69   );.    if( !zRi
6360: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ght ){.      ret
6370: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
6380: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
6390: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
63a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
63b0: 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74  size = sqlite3At
63c0: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
63d0: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e    pDb->pSchema->
63e0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a  cache_size = siz
63f0: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
6400: 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
6410: 65 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d  e(pDb->pBt, pDb-
6420: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
6430: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  size);.    }.   
6440: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
6450: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
6460: 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70  schema.]cache_sp
6470: 69 6c 6c 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ill.  **  PRAGMA
6480: 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d 42 4f 4f   cache_spill=BOO
6490: 4c 45 41 4e 0a 20 20 2a 2a 20 20 50 52 41 47 4d  LEAN.  **  PRAGM
64a0: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
64b0: 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a 2a 0a 20 20  _spill=N.  **.  
64c0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
64d0: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
64e0: 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74  rrent local sett
64f0: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
6500: 20 70 61 67 65 20 63 61 63 68 65 20 73 70 69 6c   page cache spil
6510: 6c 20 73 69 7a 65 2e 20 54 68 65 20 73 65 63 6f  l size. The seco
6520: 6e 64 20 66 6f 72 6d 20 74 75 72 6e 73 20 63 61  nd form turns ca
6530: 63 68 65 20 73 70 69 6c 6c 20 6f 6e 0a 20 20 2a  che spill on.  *
6540: 2a 20 6f 72 20 6f 66 66 2e 20 20 57 68 65 6e 20  * or off.  When 
6550: 74 75 72 6e 6e 69 6e 67 20 63 61 63 68 65 20 73  turnning cache s
6560: 70 69 6c 6c 20 6f 6e 2c 20 74 68 65 20 73 69 7a  pill on, the siz
6570: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  e is set to the.
6580: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 63 61 63    ** current cac
6590: 68 65 5f 73 69 7a 65 2e 20 20 54 68 65 20 74 68  he_size.  The th
65a0: 69 72 64 20 66 6f 72 6d 20 73 65 74 73 20 61 20  ird form sets a 
65b0: 73 70 69 6c 6c 20 73 69 7a 65 20 74 68 61 74 0a  spill size that.
65c0: 20 20 2a 2a 20 6d 61 79 20 62 65 20 64 69 66 66    ** may be diff
65d0: 65 72 65 6e 74 20 66 6f 72 6d 20 74 68 65 20 63  erent form the c
65e0: 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 2a 2a 20  ache size..  ** 
65f0: 49 66 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65  If N is positive
6600: 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 74 68   then that is th
6610: 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  e.  ** number of
6620: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
6630: 63 68 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65  che.  If N is ne
6640: 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65  gative, then the
6650: 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
6660: 70 61 67 65 73 20 69 73 20 61 64 6a 75 73 74 65  pages is adjuste
6670: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  d so that the ca
6680: 63 68 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69  che uses -N kibi
6690: 62 79 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65  bytes.  ** of me
66a0: 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mory..  **.  ** 
66b0: 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
66c0: 20 63 61 63 68 65 5f 73 70 69 6c 6c 20 70 61 67   cache_spill pag
66d0: 65 73 20 69 73 20 6c 65 73 73 20 74 68 65 6e 20  es is less then 
66e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
66f0: 2a 2a 20 63 61 63 68 65 5f 73 69 7a 65 20 70 61  ** cache_size pa
6700: 67 65 73 2c 20 6e 6f 20 73 70 69 6c 6c 69 6e 67  ges, no spilling
6710: 20 6f 63 63 75 72 73 20 75 6e 74 69 6c 20 74 68   occurs until th
6720: 65 20 70 61 67 65 20 63 6f 75 6e 74 20 65 78 63  e page count exc
6730: 65 65 64 73 0a 20 20 2a 2a 20 74 68 65 20 6e 75  eeds.  ** the nu
6740: 6d 62 65 72 20 6f 66 20 63 61 63 68 65 5f 73 69  mber of cache_si
6750: 7a 65 20 70 61 67 65 73 2e 0a 20 20 2a 2a 0a 20  ze pages..  **. 
6760: 20 2a 2a 20 54 68 65 20 63 61 63 68 65 5f 73 70   ** The cache_sp
6770: 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20 73 65 74 74  ill=BOOLEAN sett
6780: 69 6e 67 20 61 70 70 6c 69 65 73 20 74 6f 20 61  ing applies to a
6790: 6c 6c 20 61 74 74 61 63 68 65 64 20 73 63 68 65  ll attached sche
67a0: 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 6a 75  mas,.  ** not ju
67b0: 73 74 20 74 68 65 20 73 63 68 65 6d 61 20 73 70  st the schema sp
67c0: 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20  ecified..  */.  
67d0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 43  case PragTyp_CAC
67e0: 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20  HE_SPILL: {.    
67f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
6800: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
6810: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
6820: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
6830: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
6840: 67 6c 65 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  gleInt(v,.      
6850: 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20     (db->flags & 
6860: 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c  SQLITE_CacheSpil
6870: 6c 29 3d 3d 30 20 3f 20 30 20 3a 20 0a 20 20 20  l)==0 ? 0 : .   
6880: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6890: 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a  BtreeSetSpillSiz
68a0: 65 28 70 44 62 2d 3e 70 42 74 2c 30 29 29 3b 0a  e(pDb->pBt,0));.
68b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
68c0: 20 69 6e 74 20 73 69 7a 65 20 3d 20 31 3b 0a 20   int size = 1;. 
68d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
68e0: 47 65 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c  GetInt32(zRight,
68f0: 20 26 73 69 7a 65 29 20 29 7b 0a 20 20 20 20 20   &size) ){.     
6900: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
6910: 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44 62 2d  etSpillSize(pDb-
6920: 3e 70 42 74 2c 20 73 69 7a 65 29 3b 0a 20 20 20  >pBt, size);.   
6930: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
6940: 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e  qlite3GetBoolean
6950: 28 7a 52 69 67 68 74 2c 20 73 69 7a 65 21 3d 30  (zRight, size!=0
6960: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  ) ){.        db-
6970: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
6980: 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20  _CacheSpill;.   
6990: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
69a0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
69b0: 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c  SQLITE_CacheSpil
69c0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
69d0: 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67   setAllPagerFlag
69e0: 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  s(db);.    }.   
69f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
6a00: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
6a10: 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73 69 7a  schema.]mmap_siz
6a20: 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55  e(N).  **.  ** U
6a30: 73 65 64 20 74 6f 20 73 65 74 20 6d 61 70 70 69  sed to set mappi
6a40: 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20 54  ng size limit. T
6a50: 68 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  he mapping size 
6a60: 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a 20 75 73  limit is.  ** us
6a70: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6a80: 61 67 67 72 65 67 61 74 65 20 73 69 7a 65 20 6f  aggregate size o
6a90: 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d 61 70  f all memory map
6aa0: 70 65 64 20 72 65 67 69 6f 6e 73 20 6f 66 20 74  ped regions of t
6ab0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
6ac0: 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20 70   file. If this p
6ad0: 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20  arameter is set 
6ae0: 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6d 65  to zero, then me
6af0: 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a 20 20 2a  mory mapping.  *
6b00: 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 20 61 74  * is not used at
6b10: 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69 73 20 6e   all.  If N is n
6b20: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68  egative, then th
6b30: 65 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79  e default memory
6b40: 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d 69 74 20   map.  ** limit 
6b50: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 73 71  determined by sq
6b60: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
6b70: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f  ITE_CONFIG_MMAP_
6b80: 53 49 5a 45 29 20 69 73 20 73 65 74 2e 0a 20 20  SIZE) is set..  
6b90: 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ** The parameter
6ba0: 20 4e 20 69 73 20 6d 65 61 73 75 72 65 64 20 69   N is measured i
6bb0: 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a 0a 20 20  n bytes..  **.  
6bc0: 2a 2a 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  ** This value is
6bd0: 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68 65 20   advisory.  The 
6be0: 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20 69  underlying VFS i
6bf0: 73 20 66 72 65 65 20 74 6f 20 6d 65 6d 6f 72 79  s free to memory
6c00: 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20 6c 69 74   map.  ** as lit
6c10: 74 6c 65 20 6f 72 20 61 73 20 6d 75 63 68 20 61  tle or as much a
6c20: 73 20 69 74 20 77 61 6e 74 73 2e 20 20 45 78 63  s it wants.  Exc
6c30: 65 70 74 2c 20 69 66 20 4e 20 69 73 20 73 65 74  ept, if N is set
6c40: 20 74 6f 20 30 20 74 68 65 6e 20 74 68 65 0a 20   to 0 then the. 
6c50: 20 2a 2a 20 75 70 70 65 72 20 6c 61 79 65 72 73   ** upper layers
6c60: 20 77 69 6c 6c 20 6e 65 76 65 72 20 69 6e 76 6f   will never invo
6c70: 6b 65 20 74 68 65 20 78 46 65 74 63 68 20 69 6e  ke the xFetch in
6c80: 74 65 72 66 61 63 65 73 20 74 6f 20 74 68 65 20  terfaces to the 
6c90: 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  VFS..  */.  case
6ca0: 20 50 72 61 67 54 79 70 5f 4d 4d 41 50 5f 53 49   PragTyp_MMAP_SI
6cb0: 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  ZE: {.    sqlite
6cc0: 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23 69 66 20  3_int64 sz;.#if 
6cd0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
6ce0: 53 49 5a 45 3e 30 0a 20 20 20 20 61 73 73 65 72  SIZE>0.    asser
6cf0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
6d00: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
6d10: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28  b, 0) );.    if(
6d20: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
6d30: 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 73   int ii;.      s
6d40: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
6d50: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 73 7a 29  I64(zRight, &sz)
6d60: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c 30  ;.      if( sz<0
6d70: 20 29 20 73 7a 20 3d 20 73 71 6c 69 74 65 33 47   ) sz = sqlite3G
6d80: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
6d90: 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ap;.      if( pI
6da0: 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e 73  d2->n==0 ) db->s
6db0: 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20 20 20 20  zMmap = sz;.    
6dc0: 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62    for(ii=db->nDb
6dd0: 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29  -1; ii>=0; ii--)
6de0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
6df0: 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26  ->aDb[ii].pBt &&
6e00: 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64   (ii==iDb || pId
6e10: 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20  2->n==0) ){.    
6e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
6e30: 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 64  eeSetMmapLimit(d
6e40: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20  b->aDb[ii].pBt, 
6e50: 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  sz);.        }. 
6e60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6e70: 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 72 63   sz = -1;.    rc
6e80: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
6e90: 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c  control(db, zDb,
6ea0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
6eb0: 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 23  AP_SIZE, &sz);.#
6ec0: 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d 20 30 3b  else.    sz = 0;
6ed0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
6ee0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  _OK;.#endif.    
6ef0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6f00: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
6f10: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 7a  nSingleInt(v, sz
6f20: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6f30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
6f40: 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 70 50  OUND ){.      pP
6f50: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
6f60: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
6f70: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62   rc;.    }.    b
6f80: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
6f90: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65    **   PRAGMA te
6fa0: 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a 20 20 20  mp_store.  **   
6fb0: 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
6fc0: 65 20 3d 20 22 64 65 66 61 75 6c 74 22 7c 22 6d  e = "default"|"m
6fd0: 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22 0a 20 20  emory"|"file".  
6fe0: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
6ff0: 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  r set the local 
7000: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65 6d  value of the tem
7010: 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e 20 20 43  p_store flag.  C
7020: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
7030: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65   local value doe
7040: 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67  s not make chang
7050: 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66  es to the disk f
7060: 69 6c 65 20 61 6e 64 20 74 68 65 20 64 65 66 61  ile and the defa
7070: 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20 77  ult.  ** value w
7080: 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20  ill be restored 
7090: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  the next time th
70a0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  e database is op
70b0: 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ened..  **.  ** 
70c0: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
70d0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
70e0: 20 6c 69 62 72 61 72 79 20 63 6f 6d 70 69 6c 65   library compile
70f0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 6f  -time options to
7100: 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64 65 20 74  .  ** override t
7110: 68 69 73 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  his setting.  */
7120: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
7130: 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a 20 20  TEMP_STORE: {.  
7140: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
7150: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
7160: 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 74 65  gleInt(v, db->te
7170: 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20 20 20 7d  mp_store);.    }
7180: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 6e  else{.      chan
7190: 67 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50  geTempStorage(pP
71a0: 61 72 73 65 2c 20 7a 52 69 67 68 74 29 3b 0a 20  arse, zRight);. 
71b0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
71c0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
71d0: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
71e0: 72 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a  re_directory.  *
71f0: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
7200: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
7210: 3d 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f  = ""|"directory_
7220: 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  name".  **.  ** 
7230: 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68  Return or set th
7240: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66  e local value of
7250: 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65 5f   the temp_store_
7260: 64 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20  directory flag. 
7270: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
7280: 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20  he value sets a 
7290: 73 70 65 63 69 66 69 63 20 64 69 72 65 63 74 6f  specific directo
72a0: 72 79 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ry to be used fo
72b0: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
72c0: 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69 6e 67 20  s..  ** Setting 
72d0: 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67  to a null string
72e0: 20 72 65 76 65 72 74 73 20 74 6f 20 74 68 65 20   reverts to the 
72f0: 64 65 66 61 75 6c 74 20 74 65 6d 70 6f 72 61 72  default temporar
7300: 79 20 64 69 72 65 63 74 6f 72 79 20 73 65 61 72  y directory sear
7310: 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74 65 6d 70  ch..  ** If temp
7320: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
7330: 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
7340: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
7350: 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a  torage..  **.  *
7360: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
7370: 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44 49 52 45  _TEMP_STORE_DIRE
7380: 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66 28  CTORY: {.    if(
7390: 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20   !zRight ){.    
73a0: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65    returnSingleTe
73b0: 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 74 65  xt(v, sqlite3_te
73c0: 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
73d0: 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65     }else{.#ifnde
73e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53  f SQLITE_OMIT_WS
73f0: 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  D.      if( zRig
7400: 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ht[0] ){.       
7410: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
7420: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7430: 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73 2c  Access(db->pVfs,
7440: 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45 5f   zRight, SQLITE_
7450: 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
7460: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  , &res);.       
7470: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7480: 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a  OK || res==0 ){.
7490: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
74a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
74b0: 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62 6c  , "not a writabl
74c0: 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a 20  e directory");. 
74d0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72           goto pr
74e0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
74f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7500: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 45 4d    if( SQLITE_TEM
7510: 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20 20  P_STORE==0.     
7520: 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d    || (SQLITE_TEM
7530: 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20 64 62  P_STORE==1 && db
7540: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31 29  ->temp_store<=1)
7550: 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49  .       || (SQLI
7560: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32  TE_TEMP_STORE==2
7570: 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f   && db->temp_sto
7580: 72 65 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b 0a  re==1).      ){.
7590: 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
75a0: 74 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50  teTempStorage(pP
75b0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
75c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
75d0: 65 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  e(sqlite3_temp_d
75e0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20  irectory);.     
75f0: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
7600: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7610: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
7620: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7630: 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29  tf("%s", zRight)
7640: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
7660: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
7670: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  0;.      }.#endi
7680: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7690: 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  _WSD */.    }.  
76a0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69    break;.  }..#i
76b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
76c0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
76d0: 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  MA data_store_di
76e0: 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50  rectory.  **   P
76f0: 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65  RAGMA data_store
7700: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c  _directory = ""|
7710: 22 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22  "directory_name"
7720: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
7730: 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63  n or set the loc
7740: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
7750: 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
7760: 74 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e  tory flag.  Chan
7770: 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61  ging.  ** the va
7780: 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63 69  lue sets a speci
7790: 66 69 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f  fic directory to
77a0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61 74   be used for dat
77b0: 61 62 61 73 65 20 66 69 6c 65 73 20 74 68 61 74  abase files that
77c0: 0a 20 20 2a 2a 20 77 65 72 65 20 73 70 65 63 69  .  ** were speci
77d0: 66 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61  fied with a rela
77e0: 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 20  tive pathname.  
77f0: 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75 6c  Setting to a nul
7800: 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74 73  l string reverts
7810: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 65 66  .  ** to the def
7820: 61 75 6c 74 20 64 61 74 61 62 61 73 65 20 64 69  ault database di
7830: 72 65 63 74 6f 72 79 2c 20 77 68 69 63 68 20 66  rectory, which f
7840: 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  or database file
7850: 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74 68  s specified with
7860: 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74 69 76 65  .  ** a relative
7870: 20 70 61 74 68 20 77 69 6c 6c 20 70 72 6f 62 61   path will proba
7880: 62 6c 79 20 62 65 20 62 61 73 65 64 20 6f 6e 20  bly be based on 
7890: 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72 65  the current dire
78a0: 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a 20 20  ctory for the.  
78b0: 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20 44 61 74  ** process.  Dat
78c0: 61 62 61 73 65 20 66 69 6c 65 20 73 70 65 63 69  abase file speci
78d0: 66 69 65 64 20 77 69 74 68 20 61 6e 20 61 62 73  fied with an abs
78e0: 6f 6c 75 74 65 20 70 61 74 68 20 61 72 65 20 6e  olute path are n
78f0: 6f 74 20 69 6d 70 61 63 74 65 64 0a 20 20 2a 2a  ot impacted.  **
7900: 20 62 79 20 74 68 69 73 20 73 65 74 74 69 6e 67   by this setting
7910: 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
7920: 69 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a 0a  its value..  **.
7930: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7940: 54 79 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f 44  Typ_DATA_STORE_D
7950: 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20  IRECTORY: {.    
7960: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
7970: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
7980: 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33  eText(v, sqlite3
7990: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 29  _data_directory)
79a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
79b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
79c0: 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a  _WSD.      if( z
79d0: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
79e0: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
79f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7a00: 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56  3OsAccess(db->pV
7a10: 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49  fs, zRight, SQLI
7a20: 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
7a30: 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  ITE, &res);.    
7a40: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7a50: 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20  TE_OK || res==0 
7a60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7a70: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7a80: 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74  rse, "not a writ
7a90: 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29  able directory")
7aa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
7ab0: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20   pragma_out;.   
7ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7ae0: 65 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  e(sqlite3_data_d
7af0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20  irectory);.     
7b00: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
7b10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7b20: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7b30: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7b40: 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29  tf("%s", zRight)
7b50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
7b70: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
7b80: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  0;.      }.#endi
7b90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7ba0: 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  _WSD */.    }.  
7bb0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
7bc0: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
7bd0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
7be0: 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  TYLE.  /*.  **  
7bf0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
7c00: 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
7c10: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
7c20: 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f  schema.]lock_pro
7c30: 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61 75 74 6f  xy_file = ":auto
7c40: 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f 70 61  :"|"lock_file_pa
7c50: 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  th".  **.  ** Re
7c60: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
7c70: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 63  value of the loc
7c80: 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20 66 6c 61  k_proxy_file fla
7c90: 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
7ca0: 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73  * the value sets
7cb0: 20 61 20 73 70 65 63 69 66 69 63 20 66 69 6c 65   a specific file
7cc0: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
7cd0: 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
7ce0: 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  locks..  **.  */
7cf0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
7d00: 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49 4c 45 3a  LOCK_PROXY_FILE:
7d10: 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67   {.    if( !zRig
7d20: 68 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  ht ){.      Page
7d30: 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69  r *pPager = sqli
7d40: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
7d50: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 63  b->pBt);.      c
7d60: 68 61 72 20 2a 70 72 6f 78 79 5f 66 69 6c 65 5f  har *proxy_file_
7d70: 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  path = NULL;.   
7d80: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
7d90: 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *pFile = sqlite3
7da0: 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
7db0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7dc0: 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
7dd0: 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  t(pFile, SQLITE_
7de0: 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
7df0: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
7e10: 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29  proxy_file_path)
7e20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
7e30: 6e 67 6c 65 54 65 78 74 28 76 2c 20 70 72 6f 78  ngleText(v, prox
7e40: 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20  y_file_path);.  
7e50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
7e60: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
7e70: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
7e80: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
7e90: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ea0: 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
7eb0: 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29  agerFile(pPager)
7ec0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b  ;.      int res;
7ed0: 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68  .      if( zRigh
7ee0: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  t[0] ){.        
7ef0: 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c  res=sqlite3OsFil
7f00: 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20  eControl(pFile, 
7f10: 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
7f20: 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20  ROXYFILE, .     
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d  zRight);.      }
7f60: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
7f70: 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c  res=sqlite3OsFil
7f80: 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20  eControl(pFile, 
7f90: 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
7fa0: 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20  ROXYFILE, .     
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fd0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
7fe0: 20 20 20 20 20 69 66 28 20 72 65 73 21 3d 53 51       if( res!=SQ
7ff0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8000: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8010: 73 67 28 70 50 61 72 73 65 2c 20 22 66 61 69 6c  sg(pParse, "fail
8020: 65 64 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20 70  ed to set lock p
8030: 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a 20 20 20  roxy file");.   
8040: 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61       goto pragma
8050: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
8060: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8070: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8080: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
8090: 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20 20  NG_STYLE */     
80a0: 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a   .    .  /*.  **
80b0: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
80c0: 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  a.]synchronous. 
80d0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
80e0: 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75  hema.]synchronou
80f0: 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c 7c  s=OFF|ON|NORMAL|
8100: 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20 2a 2a 0a  FULL|EXTRA.  **.
8110: 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73    ** Return or s
8120: 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c  et the local val
8130: 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68 72  ue of the synchr
8140: 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68 61  onous flag.  Cha
8150: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c  nging.  ** the l
8160: 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20  ocal value does 
8170: 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73  not make changes
8180: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c   to the disk fil
8190: 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 64  e and the.  ** d
81a0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c  efault value wil
81b0: 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 68  l be restored th
81c0: 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
81d0: 64 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a 2a  database is.  **
81e0: 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
81f0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 59 4e  case PragTyp_SYN
8200: 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20 20 20  CHRONOUS: {.    
8210: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
8220: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
8230: 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e 73 61 66  eInt(v, pDb->saf
8240: 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a 20 20  ety_level-1);.  
8250: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
8260: 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  f( !db->autoComm
8270: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  it ){.        sq
8280: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8290: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
82a0: 20 20 20 22 53 61 66 65 74 79 20 6c 65 76 65 6c     "Safety level
82b0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e   may not be chan
82c0: 67 65 64 20 69 6e 73 69 64 65 20 61 20 74 72 61  ged inside a tra
82d0: 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20  nsaction");.    
82e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 44 62 21    }else if( iDb!
82f0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =1 ){.        in
8300: 74 20 69 4c 65 76 65 6c 20 3d 20 28 67 65 74 53  t iLevel = (getS
8310: 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67 68  afetyLevel(zRigh
8320: 74 2c 30 2c 31 29 2b 31 29 20 26 20 50 41 47 45  t,0,1)+1) & PAGE
8330: 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
8340: 53 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  SK;.        if( 
8350: 69 4c 65 76 65 6c 3d 3d 30 20 29 20 69 4c 65 76  iLevel==0 ) iLev
8360: 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  el = 1;.        
8370: 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
8380: 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20 20  l = iLevel;.    
8390: 20 20 20 20 70 44 62 2d 3e 62 53 79 6e 63 53 65      pDb->bSyncSe
83a0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  t = 1;.        s
83b0: 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28  etAllPagerFlags(
83c0: 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
83d0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
83e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
83f0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
8400: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
8410: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
8420: 41 47 5f 50 52 41 47 4d 41 53 0a 20 20 63 61 73  AG_PRAGMAS.  cas
8430: 65 20 50 72 61 67 54 79 70 5f 46 4c 41 47 3a 20  e PragTyp_FLAG: 
8440: 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
8450: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74  ==0 ){.      set
8460: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
8470: 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50 72 61 67  mnNames(v, pPrag
8480: 6d 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ma);.      retur
8490: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 28 64  nSingleInt(v, (d
84a0: 62 2d 3e 66 6c 61 67 73 20 26 20 70 50 72 61 67  b->flags & pPrag
84b0: 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20 29 3b 0a  ma->iArg)!=0 );.
84c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
84d0: 20 69 6e 74 20 6d 61 73 6b 20 3d 20 70 50 72 61   int mask = pPra
84e0: 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20 20 2f 2a  gma->iArg;    /*
84f0: 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74 6f   Mask of bits to
8500: 20 73 65 74 20 6f 72 20 63 6c 65 61 72 2e 20 2a   set or clear. *
8510: 2f 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  /.      if( db->
8520: 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  autoCommit==0 ){
8530: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 65  .        /* Fore
8540: 69 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74 20  ign key support 
8550: 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e 61 62 6c  may not be enabl
8560: 65 64 20 6f 72 20 64 69 73 61 62 6c 65 64 20 77  ed or disabled w
8570: 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20 20  hile not.       
8580: 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d   ** in auto-comm
8590: 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 20  it mode.  */.   
85a0: 20 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53       mask &= ~(S
85b0: 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
85c0: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  s);.      }.#if 
85d0: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
85e0: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20  ENTICATION.     
85f0: 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75   if( db->auth.au
8600: 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f 55  thLevel==UAUTH_U
8610: 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ser ){.        /
8620: 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6e  * Do not allow n
8630: 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72 73 20 74  on-admin users t
8640: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63 68  o modify the sch
8650: 65 6d 61 20 61 72 62 69 74 72 61 72 69 6c 79 20  ema arbitrarily 
8660: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  */.        mask 
8670: 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57 72 69 74  &= ~(SQLITE_Writ
8680: 65 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  eSchema);.      
8690: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
86a0: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f  if( sqlite3GetBo
86b0: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29  olean(zRight, 0)
86c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   ){.        db->
86d0: 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20  flags |= mask;. 
86e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
86f0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
8700: 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20   ~mask;.        
8710: 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c 49 54 45  if( mask==SQLITE
8720: 5f 44 65 66 65 72 46 4b 73 20 29 20 64 62 2d 3e  _DeferFKs ) db->
8730: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
8740: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
8750: 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20 6f 66 20       /* Many of 
8760: 74 68 65 20 66 6c 61 67 2d 70 72 61 67 6d 61 73  the flag-pragmas
8770: 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 64 65   modify the code
8780: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
8790: 65 20 53 51 4c 20 0a 20 20 20 20 20 20 2a 2a 20  e SQL .      ** 
87a0: 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e 20 63 6f  compiler (eg. co
87b0: 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e 20 53 6f  unt_changes). So
87c0: 20 61 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   add an opcode t
87d0: 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a 20 20 20  o expire all.   
87e0: 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 53     ** compiled S
87f0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61 66  QL statements af
8800: 74 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20  ter modifying a 
8810: 70 72 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20 20  pragma value..  
8820: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
8830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
8840: 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20  , OP_Expire);.  
8850: 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46      setAllPagerF
8860: 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  lags(db);.    }.
8870: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
8880: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8890: 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41  OMIT_FLAG_PRAGMA
88a0: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
88b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41  LITE_OMIT_SCHEMA
88c0: 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20  _PRAGMAS.  /*.  
88d0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 61 62 6c  **   PRAGMA tabl
88e0: 65 5f 69 6e 66 6f 28 3c 74 61 62 6c 65 3e 29 0a  e_info(<table>).
88f0: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
8900: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 6f   a single row fo
8910: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
8920: 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
8930: 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  . The columns of
8940: 0a 20 20 2a 2a 20 74 68 65 20 72 65 74 75 72 6e  .  ** the return
8950: 65 64 20 64 61 74 61 20 73 65 74 20 61 72 65 3a  ed data set are:
8960: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a 20  .  **.  ** cid: 
8970: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 69 64         Column id
8980: 20 28 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20   (numbered from 
8990: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 73  left to right, s
89a0: 74 61 72 74 69 6e 67 20 61 74 20 30 29 0a 20 20  tarting at 0).  
89b0: 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20 20 20 43  ** name:       C
89c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a 20  olumn name.  ** 
89d0: 74 79 70 65 3a 20 20 20 20 20 20 20 43 6f 6c 75  type:       Colu
89e0: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  mn declaration t
89f0: 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75 6c  ype..  ** notnul
8a00: 6c 3a 20 20 20 20 54 72 75 65 20 69 66 20 27 4e  l:    True if 'N
8a10: 4f 54 20 4e 55 4c 4c 27 20 69 73 20 70 61 72 74  OT NULL' is part
8a20: 20 6f 66 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61   of column decla
8a30: 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c 74  ration.  ** dflt
8a40: 5f 76 61 6c 75 65 3a 20 54 68 65 20 64 65 66 61  _value: The defa
8a50: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
8a60: 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e 79  e column, if any
8a70: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
8a80: 61 67 54 79 70 5f 54 41 42 4c 45 5f 49 4e 46 4f  agTyp_TABLE_INFO
8a90: 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a  : if( zRight ){.
8aa0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8ab0: 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
8ac0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
8ad0: 50 61 72 73 65 2c 20 4c 4f 43 41 54 45 5f 4e 4f  Parse, LOCATE_NO
8ae0: 45 52 52 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  ERR, zRight, zDb
8af0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
8b00: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  ){.      int i, 
8b10: 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69  k;.      int nHi
8b20: 64 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  dden = 0;.      
8b30: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
8b40: 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
8b50: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
8b60: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
8b70: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
8b80: 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 73 71 6c  m = 6;.      sql
8b90: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
8ba0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
8bb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8bc0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
8bd0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
8be0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
8bf0: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
8c00: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
8c10: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
8c20: 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
8c30: 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f 6c 29 20 29  enColumn(pCol) )
8c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69 64  {.          nHid
8c50: 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  den++;.         
8c60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8c70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8c80: 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73   (pCol->colFlags
8c90: 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b   & COLFLAG_PRIMK
8ca0: 45 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  EY)==0 ){.      
8cb0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20      k = 0;.     
8cc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b     }else if( pPk
8cd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8ce0: 20 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20   k = 1;.        
8cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8d00: 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61   for(k=1; k<=pTa
8d10: 62 2d 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e  b->nCol && pPk->
8d20: 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69  aiColumn[k-1]!=i
8d30: 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  ; k++){}.       
8d40: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
8d50: 74 28 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d  t( pCol->pDflt==
8d60: 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  0 || pCol->pDflt
8d70: 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b  ->op==TK_SPAN );
8d80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8d90: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
8da0: 20 31 2c 20 22 69 73 73 69 73 69 22 2c 0a 20 20   1, "issisi",.  
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2d 6e               i-n
8dc0: 48 69 64 64 65 6e 2c 0a 20 20 20 20 20 20 20 20  Hidden,.        
8dd0: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61         pCol->zNa
8de0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
8df0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
8e00: 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 0a 20  Type(pCol,""),. 
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
8e20: 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20  ol->notNull ? 1 
8e30: 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : 0,.           
8e40: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
8e50: 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75  ? pCol->pDflt->u
8e60: 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c 0a 20 20 20  .zToken : 0,.   
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 6b 29 3b 0a              k);.
8e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8e90: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64  }.  break;..#ifd
8ea0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8eb0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53    case PragTyp_S
8ec0: 54 41 54 53 3a 20 7b 0a 20 20 20 20 49 6e 64 65  TATS: {.    Inde
8ed0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 48 61 73  x *pIdx;.    Has
8ee0: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 20 20 70 50  hElem *i;.    pP
8ef0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a  arse->nMem = 5;.
8f00: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
8f10: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
8f20: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 66 6f  se, iDb);.    fo
8f30: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
8f40: 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
8f50: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20  a->tblHash); i; 
8f60: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
8f70: 28 69 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  (i)){.      Tabl
8f80: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
8f90: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
8fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
8fb0: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
8fc0: 73 69 69 69 22 2c 0a 20 20 20 20 20 20 20 20 20  siii",.         
8fd0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
8fe0: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
8ff0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 73 7a          pTab->sz
9000: 54 61 62 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  TabRow,.        
9010: 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
9020: 45 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Est,.           
9030: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 29 3b  pTab->tabFlags);
9040: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
9050: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
9060: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
9070: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73  Next){.        s
9080: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
9090: 6f 61 64 28 76 2c 20 32 2c 20 22 73 69 69 69 58  oad(v, 2, "siiiX
90a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  ",.           pI
90b0: 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  dx->zName,.     
90c0: 20 20 20 20 20 20 70 49 64 78 2d 3e 73 7a 49 64        pIdx->szId
90d0: 78 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  xRow,.          
90e0: 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45   pIdx->aiRowLogE
90f0: 73 74 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  st[0],.         
9100: 20 20 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31    pIdx->hasStat1
9110: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9120: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9130: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
9140: 20 35 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   5);.      }.   
9150: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9160: 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65 20 50  #endif..  case P
9170: 72 61 67 54 79 70 5f 49 4e 44 45 58 5f 49 4e 46  ragTyp_INDEX_INF
9180: 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b  O: if( zRight ){
9190: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
91a0: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
91b0: 62 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71  b;.    pIdx = sq
91c0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
91d0: 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  b, zRight, zDb);
91e0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b  .    if( pIdx ){
91f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
9200: 20 20 20 20 69 6e 74 20 6d 78 3b 0a 20 20 20 20      int mx;.    
9210: 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69    if( pPragma->i
9220: 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Arg ){.        /
9230: 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78  * PRAGMA index_x
9240: 69 6e 66 6f 20 28 6e 65 77 65 72 20 76 65 72 73  info (newer vers
9250: 69 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20 72 6f  ion with more ro
9260: 77 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 29 20  ws and columns) 
9270: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20  */.        mx = 
9280: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
9290: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
92a0: 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 7d  Mem = 6;.      }
92b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
92c0: 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 69 6e   PRAGMA index_in
92d0: 66 6f 20 28 6c 65 67 61 63 79 20 76 65 72 73 69  fo (legacy versi
92e0: 6f 6e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  on) */.        m
92f0: 78 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  x = pIdx->nKeyCo
9300: 6c 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  l;.        pPars
9310: 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20  e->nMem = 3;.   
9320: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 20     }.      pTab 
9330: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a  = pIdx->pTable;.
9340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
9350: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
9360: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
9370: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
9380: 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61 67 6d 61 2d  ->nMem<=pPragma-
9390: 3e 6e 50 72 61 67 43 4e 61 6d 65 20 29 3b 0a 20  >nPragCName );. 
93a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
93b0: 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mx; i++){.      
93c0: 20 20 69 31 36 20 63 6e 75 6d 20 3d 20 70 49 64    i16 cnum = pId
93d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
93e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
93f0: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
9400: 31 2c 20 22 69 69 73 58 22 2c 20 69 2c 20 63 6e  1, "iisX", i, cn
9410: 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 63 6e 75 6d 3c 30 20 3f 20 30 20 3a 20 70 54   cnum<0 ? 0 : pT
9440: 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a  ab->aCol[cnum].z
9450: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
9460: 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67  f( pPragma->iArg
9470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
9480: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9490: 61 64 28 76 2c 20 34 2c 20 22 69 73 69 58 22 2c  ad(v, 4, "isiX",
94a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
94b0: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
94c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ,.            pI
94d0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 0a 20  dx->azColl[i],. 
94e0: 20 20 20 20 20 20 20 20 20 20 20 69 3c 70 49 64             i<pId
94f0: 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20  x->nKeyCol);.   
9500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
9510: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9520: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9530: 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 1, pParse->nMe
9540: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
9550: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
9560: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 49    case PragTyp_I
9570: 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66 28 20 7a  NDEX_LIST: if( z
9580: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 49 6e 64  Right ){.    Ind
9590: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61  ex *pIdx;.    Ta
95a0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
95b0: 6e 74 20 69 3b 0a 20 20 20 20 70 54 61 62 20 3d  nt i;.    pTab =
95c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
95d0: 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  e(db, zRight, zD
95e0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
95f0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
9600: 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20  ->nMem = 5;.    
9610: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
9620: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
9630: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f  , iDb);.      fo
9640: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
9650: 64 65 78 2c 20 69 3d 30 3b 20 70 49 64 78 3b 20  dex, i=0; pIdx; 
9660: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
9670: 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
9680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f 72  const char *azOr
9690: 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c 20  igin[] = { "c", 
96a0: 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a 20 20 20  "u", "pk" };.   
96b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
96c0: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
96d0: 22 69 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20  "isisi",.       
96e0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20      i,.         
96f0: 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20    pIdx->zName,. 
9700: 20 20 20 20 20 20 20 20 20 20 49 73 55 6e 69 71            IsUniq
9710: 75 65 49 6e 64 65 78 28 70 49 64 78 29 2c 0a 20  ueIndex(pIdx),. 
9720: 20 20 20 20 20 20 20 20 20 20 61 7a 4f 72 69 67            azOrig
9730: 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54 79 70 65  in[pIdx->idxType
9740: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  ],.           pI
9750: 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
9760: 65 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e!=0);.      }. 
9770: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
9780: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
9790: 70 5f 44 41 54 41 42 41 53 45 5f 4c 49 53 54 3a  p_DATABASE_LIST:
97a0: 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
97b0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
97c0: 20 33 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   3;.    for(i=0;
97d0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
97e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
97f0: 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[i].pBt==0 ) 
9800: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9810: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
9820: 69 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d 30 20 29  i].zDbSName!=0 )
9830: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9840: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
9850: 31 2c 20 22 69 73 73 22 2c 0a 20 20 20 20 20 20  1, "iss",.      
9860: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20 64     i,.         d
9870: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
9880: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  me,.         sql
9890: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
98a0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  name(db->aDb[i].
98b0: 70 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pBt));.    }.  }
98c0: 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73  .  break;..  cas
98d0: 65 20 50 72 61 67 54 79 70 5f 43 4f 4c 4c 41 54  e PragTyp_COLLAT
98e0: 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20  ION_LIST: {.    
98f0: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 48  int i = 0;.    H
9900: 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20  ashElem *p;.    
9910: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32  pParse->nMem = 2
9920: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
9930: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
9940: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 70 3b 20 70  >aCollSeq); p; p
9950: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9960: 70 29 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  p)){.      CollS
9970: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c  eq *pColl = (Col
9980: 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73  lSeq *)sqliteHas
9990: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20  hData(p);.      
99a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
99b0: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 22 2c  Load(v, 1, "is",
99c0: 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   i++, pColl->zNa
99d0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
99e0: 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66 20   break;..#ifdef 
99f0: 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43  SQLITE_INTROSPEC
9a00: 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 63  TION_PRAGMAS.  c
9a10: 61 73 65 20 50 72 61 67 54 79 70 5f 46 55 4e 43  ase PragTyp_FUNC
9a20: 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20  TION_LIST: {.   
9a30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 48 61 73 68   int i;.    Hash
9a40: 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 46 75 6e  Elem *j;.    Fun
9a50: 63 44 65 66 20 2a 70 3b 0a 20 20 20 20 70 50 61  cDef *p;.    pPa
9a60: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20  rse->nMem = 2;. 
9a70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51     for(i=0; i<SQ
9a80: 4c 49 54 45 5f 46 55 4e 43 5f 48 41 53 48 5f 53  LITE_FUNC_HASH_S
9a90: 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  Z; i++){.      f
9aa0: 6f 72 28 70 3d 73 71 6c 69 74 65 33 42 75 69 6c  or(p=sqlite3Buil
9ab0: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 2e 61 5b 69  tinFunctions.a[i
9ac0: 5d 3b 20 70 3b 20 70 3d 70 2d 3e 75 2e 70 48 61  ]; p; p=p->u.pHa
9ad0: 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  sh ){.        sq
9ae0: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9af0: 61 64 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70  ad(v, 1, "si", p
9b00: 2d 3e 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20  ->zName, 1);.   
9b10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9b20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
9b30: 75 6c 74 52 6f 77 2c 20 31 2c 20 32 29 3b 0a 20  ultRow, 1, 2);. 
9b40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9b50: 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65 48 61 73   for(j=sqliteHas
9b60: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e  hFirst(&db->aFun
9b70: 63 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69 74 65 48  c); j; j=sqliteH
9b80: 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a 20 20 20  ashNext(j)){.   
9b90: 20 20 20 70 20 3d 20 28 46 75 6e 63 44 65 66 2a     p = (FuncDef*
9ba0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
9bb0: 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  j);.      sqlite
9bc0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9bd0: 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d 3e 7a 4e  , 1, "si", p->zN
9be0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ame, 0);.      s
9bf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9c00: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9c10: 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 2);.    }. 
9c20: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66   }.  break;..#if
9c30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9c40: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
9c50: 63 61 73 65 20 50 72 61 67 54 79 70 5f 4d 4f 44  case PragTyp_MOD
9c60: 55 4c 45 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20  ULE_LIST: {.    
9c70: 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20  HashElem *j;.   
9c80: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9c90: 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c  1;.    for(j=sql
9ca0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9cb0: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 6a 3b 20 6a  ->aModule); j; j
9cc0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9cd0: 6a 29 29 7b 0a 20 20 20 20 20 20 4d 6f 64 75 6c  j)){.      Modul
9ce0: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
9cf0: 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
9d00: 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  a(j);.      sqli
9d10: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9d20: 28 76 2c 20 31 2c 20 22 73 22 2c 20 70 4d 6f 64  (v, 1, "s", pMod
9d30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
9d40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9d50: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
9d60: 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  w, 1, 1);.    }.
9d70: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
9d80: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9d90: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
9da0: 2a 2f 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  */..  case PragT
9db0: 79 70 5f 50 52 41 47 4d 41 5f 4c 49 53 54 3a 20  yp_PRAGMA_LIST: 
9dc0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
9dd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
9de0: 79 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d  ySize(aPragmaNam
9df0: 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e); i++){.      
9e00: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9e10: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 22 2c 20  Load(v, 1, "s", 
9e20: 61 50 72 61 67 6d 61 4e 61 6d 65 5b 69 5d 2e 7a  aPragmaName[i].z
9e30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
9e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9e50: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
9e60: 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  1, 1);.    }.  }
9e70: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
9e80: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f   /* SQLITE_INTRO
9e90: 53 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53  SPECTION_PRAGMAS
9ea0: 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
9eb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
9ec0: 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  A_PRAGMAS */..#i
9ed0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9ee0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
9ef0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52  case PragTyp_FOR
9f00: 45 49 47 4e 5f 4b 45 59 5f 4c 49 53 54 3a 20 69  EIGN_KEY_LIST: i
9f10: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
9f20: 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20 20 20 20   FKey *pFK;.    
9f30: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
9f40: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
9f50: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69  indTable(db, zRi
9f60: 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  ght, zDb);.    i
9f70: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
9f80: 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e 70 46 4b   pFK = pTab->pFK
9f90: 65 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  ey;.      if( pF
9fa0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  K ){.        int
9fb0: 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 20   i = 0; .       
9fc0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9fd0: 38 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  8;.        sqlit
9fe0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
9ff0: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
a000: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 70  .        while(p
a010: 46 4b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  FK){.          i
a020: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
a030: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e  for(j=0; j<pFK->
a040: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
a050: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a060: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
a070: 31 2c 20 22 69 69 73 73 73 73 73 73 22 2c 0a 20  1, "iissssss",. 
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20    i,.           
a0a0: 20 20 20 20 20 20 20 20 6a 2c 0a 20 20 20 20 20          j,.     
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
a0c0: 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20 20 20 20 20  K->zTo,.        
a0d0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
a0e0: 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61 43 6f 6c 5b  >aCol[pFK->aCol[
a0f0: 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 2c  j].iFrom].zName,
a100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a110: 20 20 20 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d      pFK->aCol[j]
a120: 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  .zCol,.         
a130: 20 20 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e            action
a140: 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f  Name(pFK->aActio
a150: 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f 4e 20 55 50  n[1]),  /* ON UP
a160: 44 41 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  DATE */.        
a170: 20 20 20 20 20 20 20 20 20 20 20 61 63 74 69 6f             actio
a180: 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69  nName(pFK->aActi
a190: 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20 4f 4e 20 44  on[0]),  /* ON D
a1a0: 45 4c 45 54 45 20 2a 2f 0a 20 20 20 20 20 20 20  ELETE */.       
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 4f 4e              "NON
a1c0: 45 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  E");.          }
a1d0: 0a 20 20 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a  .          ++i;.
a1e0: 20 20 20 20 20 20 20 20 20 20 70 46 4b 20 3d 20            pFK = 
a1f0: 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a  pFK->pNextFrom;.
a200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a210: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
a220: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  eak;.#endif /* !
a230: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a240: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29  MIT_FOREIGN_KEY)
a250: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
a260: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
a270: 5f 4b 45 59 0a 23 69 66 6e 64 65 66 20 53 51 4c  _KEY.#ifndef SQL
a280: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
a290: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
a2a0: 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 43 48 45 43  FOREIGN_KEY_CHEC
a2b0: 4b 3a 20 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70  K: {.    FKey *p
a2c0: 46 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  FK;             
a2d0: 2f 2a 20 41 20 66 6f 72 65 69 67 6e 20 6b 65 79  /* A foreign key
a2e0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
a2f0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
a300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69            /* Chi
a310: 6c 64 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ld table contain
a320: 20 22 52 45 46 45 52 45 4e 43 45 53 22 20 6b 65   "REFERENCES" ke
a330: 79 77 6f 72 64 20 2a 2f 0a 20 20 20 20 54 61 62  yword */.    Tab
a340: 6c 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  le *pParent;    
a350: 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 74 61      /* Parent ta
a360: 62 6c 65 20 74 68 61 74 20 63 68 69 6c 64 20 70  ble that child p
a370: 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20  oints to */.    
a380: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
a390: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
a3a0: 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  in the parent ta
a3b0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ble */.    int i
a3c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a3d0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a3e0: 72 3a 20 20 46 6f 72 65 69 67 6e 20 6b 65 79 20  r:  Foreign key 
a3f0: 6e 75 6d 62 65 72 20 66 6f 72 20 70 54 61 62 20  number for pTab 
a400: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20  */.    int j;   
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a420: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20   Loop counter:  
a430: 46 69 65 6c 64 20 6f 66 20 74 68 65 20 66 6f 72  Field of the for
a440: 65 69 67 6e 20 6b 65 79 20 2a 2f 0a 20 20 20 20  eign key */.    
a450: 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
a460: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
a470: 6f 75 6e 74 65 72 3a 20 20 4e 65 78 74 20 74 61  ounter:  Next ta
a480: 62 6c 65 20 69 6e 20 73 63 68 65 6d 61 20 2a 2f  ble in schema */
a490: 0a 20 20 20 20 69 6e 74 20 78 3b 20 20 20 20 20  .    int x;     
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
a4b0: 65 73 75 6c 74 20 76 61 72 69 61 62 6c 65 20 2a  esult variable *
a4c0: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 73  /.    int regRes
a4d0: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ult;         /* 
a4e0: 33 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  3 registers to h
a4f0: 6f 6c 64 20 61 20 72 65 73 75 6c 74 20 72 6f 77  old a result row
a500: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4b   */.    int regK
a510: 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ey;            /
a520: 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f  * Register to ho
a530: 6c 64 20 6b 65 79 20 66 6f 72 20 63 68 65 63 6b  ld key for check
a540: 69 6e 67 20 74 68 65 20 46 4b 20 2a 2f 0a 20 20  ing the FK */.  
a550: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 20 20 20    int regRow;   
a560: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
a570: 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20  sters to hold a 
a580: 72 6f 77 20 66 72 6f 6d 20 70 54 61 62 20 2a 2f  row from pTab */
a590: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70  .    int addrTop
a5a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
a5b0: 6f 70 20 6f 66 20 61 20 6c 6f 6f 70 20 63 68 65  op of a loop che
a5c0: 63 6b 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65  cking foreign ke
a5d0: 79 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ys */.    int ad
a5e0: 64 72 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20  drOk;           
a5f0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
a600: 20 74 68 65 20 6b 65 79 20 69 73 20 4f 4b 20 2a   the key is OK *
a610: 2f 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c  /.    int *aiCol
a620: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
a630: 63 68 69 6c 64 20 74 6f 20 70 61 72 65 6e 74 20  child to parent 
a640: 63 6f 6c 75 6d 6e 20 6d 61 70 70 69 6e 67 20 2a  column mapping *
a650: 2f 0a 0a 20 20 20 20 72 65 67 52 65 73 75 6c 74  /..    regResult
a660: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
a670: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
a680: 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20 20 20 72 65  Mem += 4;.    re
a690: 67 4b 65 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gKey = ++pParse-
a6a0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 52 6f  >nMem;.    regRo
a6b0: 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
a6c0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  em;.    sqlite3C
a6d0: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
a6e0: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
a6f0: 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68    k = sqliteHash
a700: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
a710: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db].pSchema->tbl
a720: 48 61 73 68 29 3b 0a 20 20 20 20 77 68 69 6c 65  Hash);.    while
a730: 28 20 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ( k ){.      if(
a740: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
a750: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
a760: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
a770: 72 73 65 2c 20 30 2c 20 7a 52 69 67 68 74 2c 20  rse, 0, zRight, 
a780: 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 6b 20  zDb);.        k 
a790: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
a7a0: 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  {.        pTab =
a7b0: 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
a7c0: 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
a7d0: 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61      k = sqliteHa
a7e0: 73 68 4e 65 78 74 28 6b 29 3b 0a 20 20 20 20 20  shNext(k);.     
a7f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 61   }.      if( pTa
a800: 62 3d 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 46  b==0 || pTab->pF
a810: 4b 65 79 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Key==0 ) continu
a820: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
a830: 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
a840: 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
a850: 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
a860: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
a870: 61 62 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e  ab->nCol+regRow>
a880: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70  pParse->nMem ) p
a890: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54  Parse->nMem = pT
a8a0: 61 62 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f  ab->nCol + regRo
a8b0: 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
a8c0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
a8d0: 2c 20 30 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  , 0, iDb, pTab, 
a8e0: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
a8f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
a900: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 72 65 67  oadString(v, reg
a910: 52 65 73 75 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e  Result, pTab->zN
a920: 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
a930: 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70  i=1, pFK=pTab->p
a940: 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20  FKey; pFK; i++, 
a950: 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72  pFK=pFK->pNextFr
a960: 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  om){.        pPa
a970: 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69  rent = sqlite3Fi
a980: 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d  ndTable(db, pFK-
a990: 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20  >zTo, zDb);.    
a9a0: 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d      if( pParent=
a9b0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
a9c0: 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b         pIdx = 0;
a9d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a9e0: 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
a9f0: 2c 20 69 44 62 2c 20 70 50 61 72 65 6e 74 2d 3e  , iDb, pParent->
aa00: 74 6e 75 6d 2c 20 30 2c 20 70 50 61 72 65 6e 74  tnum, 0, pParent
aa10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
aa20: 20 20 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c    x = sqlite3FkL
aa30: 6f 63 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  ocateIndex(pPars
aa40: 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c  e, pParent, pFK,
aa50: 20 26 70 49 64 78 2c 20 30 29 3b 0a 20 20 20 20   &pIdx, 0);.    
aa60: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a      if( x==0 ){.
aa70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
aa80: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  dx==0 ){.       
aa90: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
aaa0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 2c  Table(pParse, i,
aab0: 20 69 44 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f   iDb, pParent, O
aac0: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
aad0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
aae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
aaf0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ab00: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20 70  P_OpenRead, i, p
ab10: 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
ab20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
ab30: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
ab40: 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
ab50: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  x);.          }.
ab60: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ab70: 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a           k = 0;.
ab80: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ab90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aba0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
abb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
abc0: 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b 0a 20 20 20  || pFK==0 );.   
abd0: 20 20 20 69 66 28 20 70 46 4b 20 29 20 62 72 65     if( pFK ) bre
abe0: 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ak;.      if( pP
abf0: 61 72 73 65 2d 3e 6e 54 61 62 3c 69 20 29 20 70  arse->nTab<i ) p
ac00: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69 3b  Parse->nTab = i;
ac10: 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d  .      addrTop =
ac20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ac30: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
ac40: 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
ac50: 65 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  e(v);.      for(
ac60: 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70  i=1, pFK=pTab->p
ac70: 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20  FKey; pFK; i++, 
ac80: 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72  pFK=pFK->pNextFr
ac90: 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  om){.        pPa
aca0: 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69  rent = sqlite3Fi
acb0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d  ndTable(db, pFK-
acc0: 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20  >zTo, zDb);.    
acd0: 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
ace0: 20 20 20 20 20 20 61 69 43 6f 6c 73 20 3d 20 30        aiCols = 0
acf0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
ad00: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  arent ){.       
ad10: 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 46 6b     x = sqlite3Fk
ad20: 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50 61 72  LocateIndex(pPar
ad30: 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 46 4b  se, pParent, pFK
ad40: 2c 20 26 70 49 64 78 2c 20 26 61 69 43 6f 6c 73  , &pIdx, &aiCols
ad50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
ad60: 65 72 74 28 20 78 3d 3d 30 20 29 3b 0a 20 20 20  ert( x==0 );.   
ad70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
ad80: 64 64 72 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  ddrOk = sqlite3V
ad90: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
ada0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e  ..        /* Gen
adb0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
adc0: 61 64 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79  ad the child key
add0: 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 72 65 67   values into reg
ade0: 69 73 74 65 72 73 0a 20 20 20 20 20 20 20 20 2a  isters.        *
adf0: 2a 20 72 65 67 52 6f 77 2e 2e 72 65 67 52 6f 77  * regRow..regRow
ae00: 2b 6e 2e 20 49 66 20 61 6e 79 20 6f 66 20 74 68  +n. If any of th
ae10: 65 20 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75  e child key valu
ae20: 65 73 20 61 72 65 20 4e 55 4c 4c 2c 20 74 68 69  es are NULL, thi
ae30: 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  s .        ** ro
ae40: 77 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20 61  w cannot cause a
ae50: 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e 20  n FK violation. 
ae60: 4a 75 6d 70 20 64 69 72 65 63 74 6c 79 20 74 6f  Jump directly to
ae70: 20 61 64 64 72 4f 6b 20 69 6e 20 0a 20 20 20 20   addrOk in .    
ae80: 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
ae90: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  . */.        for
aea0: 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f  (j=0; j<pFK->nCo
aeb0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
aec0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 61 69     int iCol = ai
aed0: 43 6f 6c 73 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d  Cols ? aiCols[j]
aee0: 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e   : pFK->aCol[j].
aef0: 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20  iFrom;.         
af00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
af10: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
af20: 28 76 2c 20 70 54 61 62 2c 20 30 2c 20 69 43 6f  (v, pTab, 0, iCo
af30: 6c 2c 20 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20  l, regRow+j);.  
af40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
af50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
af60: 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a  IsNull, regRow+j
af70: 2c 20 61 64 64 72 4f 6b 29 3b 20 56 64 62 65 43  , addrOk); VdbeC
af80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
af90: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
afa0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
afb0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 70 61 72  to query the par
afc0: 65 6e 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20  ent index for a 
afd0: 6d 61 74 63 68 69 6e 67 20 70 61 72 65 6e 74 0a  matching parent.
afe0: 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 2e 20          ** key. 
aff0: 49 66 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f  If a match is fo
b000: 75 6e 64 2c 20 6a 75 6d 70 20 74 6f 20 61 64 64  und, jump to add
b010: 72 4f 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  rOk. */.        
b020: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
b030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b040: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
b050: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
b060: 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67  , pFK->nCol, reg
b070: 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
b080: 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41     sqlite3IndexA
b090: 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c 70 49  ffinityStr(db,pI
b0a0: 64 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b  dx), pFK->nCol);
b0b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b0c0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
b0d0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c 20  v, OP_Found, i, 
b0e0: 61 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79 2c 20  addrOk, regKey, 
b0f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  0);.          Vd
b100: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b110: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
b120: 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20   pParent ){.    
b130: 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 20 3d 20        int jmp = 
b140: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
b150: 6e 74 41 64 64 72 28 76 29 2b 32 3b 0a 20 20 20  ntAddr(v)+2;.   
b160: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b170: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
b180: 65 65 6b 52 6f 77 69 64 2c 20 69 2c 20 6a 6d 70  eekRowid, i, jmp
b190: 2c 20 72 65 67 52 6f 77 29 3b 20 56 64 62 65 43  , regRow); VdbeC
b1a0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b1b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b1c0: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 4f 6b 29  eGoto(v, addrOk)
b1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
b1e0: 72 74 28 20 70 46 4b 2d 3e 6e 43 6f 6c 3d 3d 31  rt( pFK->nCol==1
b1f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   );.        }.. 
b200: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
b210: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 70 6f 72  te code to repor
b220: 74 20 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f  t an FK violatio
b230: 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  n to the caller.
b240: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
b250: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
b260: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
b270: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b280: 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65   OP_Rowid, 0, re
b290: 67 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20  gResult+1);.    
b2a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b2c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
b2d0: 6c 2c 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2b  l, 0, regResult+
b2e0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
b2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b300: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 72 65  eMultiLoad(v, re
b310: 67 52 65 73 75 6c 74 2b 32 2c 20 22 73 69 58 22  gResult+2, "siX"
b320: 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29  , pFK->zTo, i-1)
b330: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b340: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b350: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67  P_ResultRow, reg
b360: 52 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20 20 20  Result, 4);.    
b370: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
b380: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
b390: 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20  ddrOk);.        
b3a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b3b0: 2c 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20  , aiCols);.     
b3c0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b3d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b3e0: 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64 72 54 6f  _Next, 0, addrTo
b3f0: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
b400: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
b410: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
b420: 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
b430: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
b440: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
b450: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b460: 54 52 49 47 47 45 52 29 20 2a 2f 0a 23 65 6e 64  TRIGGER) */.#end
b470: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
b480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
b490: 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e  GN_KEY) */..#ifn
b4a0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 63 61 73  def NDEBUG.  cas
b4b0: 65 20 50 72 61 67 54 79 70 5f 50 41 52 53 45 52  e PragTyp_PARSER
b4c0: 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66  _TRACE: {.    if
b4d0: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
b4e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74    if( sqlite3Get
b4f0: 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20  Boolean(zRight, 
b500: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0) ){.        sq
b510: 6c 69 74 65 33 50 61 72 73 65 72 54 72 61 63 65  lite3ParserTrace
b520: 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73 65 72  (stdout, "parser
b530: 3a 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : ");.      }els
b540: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b550: 65 33 50 61 72 73 65 72 54 72 61 63 65 28 30 2c  e3ParserTrace(0,
b560: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
b570: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
b580: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 69  #endif..  /* Rei
b590: 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b 45 20  nstall the LIKE 
b5a0: 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f  and GLOB functio
b5b0: 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61 6e 74  ns.  The variant
b5c0: 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20 75 73   of LIKE.  ** us
b5d0: 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73 65 20  ed will be case 
b5e0: 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e 6f 74  sensitive or not
b5f0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
b600: 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 63 61  e RHS..  */.  ca
b610: 73 65 20 50 72 61 67 54 79 70 5f 43 41 53 45 5f  se PragTyp_CASE_
b620: 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 3a 20  SENSITIVE_LIKE: 
b630: 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
b640: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b650: 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e  3RegisterLikeFun
b660: 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c 69 74  ctions(db, sqlit
b670: 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  e3GetBoolean(zRi
b680: 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a  ght, 0));.    }.
b690: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69    }.  break;..#i
b6a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54  fndef SQLITE_INT
b6b0: 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52  EGRITY_CHECK_ERR
b6c0: 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65 20  OR_MAX.# define 
b6d0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59  SQLITE_INTEGRITY
b6e0: 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58  _CHECK_ERROR_MAX
b6f0: 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66   100.#endif..#if
b700: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b710: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
b720: 0a 20 20 2f 2a 20 20 20 20 50 52 41 47 4d 41 20  .  /*    PRAGMA 
b730: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
b740: 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 69    **    PRAGMA i
b750: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28 4e  ntegrity_check(N
b760: 29 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41  ).  **    PRAGMA
b770: 20 71 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20 2a   quick_check.  *
b780: 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75 69 63  *    PRAGMA quic
b790: 6b 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a 0a  k_check(N).  **.
b7a0: 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20    ** Verify the 
b7b0: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
b7c0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a   database..  **.
b7d0: 20 20 2a 2a 20 54 68 65 20 22 71 75 69 63 6b 5f    ** The "quick_
b7e0: 63 68 65 63 6b 22 20 69 73 20 72 65 64 75 63 65  check" is reduce
b7f0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20  d version of .  
b800: 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  ** integrity_che
b810: 63 6b 20 64 65 73 69 67 6e 65 64 20 74 6f 20 64  ck designed to d
b820: 65 74 65 63 74 20 6d 6f 73 74 20 64 61 74 61 62  etect most datab
b830: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 0a 20  ase corruption. 
b840: 20 2a 2a 20 77 69 74 68 6f 75 74 20 74 68 65 20   ** without the 
b850: 6f 76 65 72 68 65 61 64 20 6f 66 20 63 72 6f 73  overhead of cros
b860: 73 2d 63 68 65 63 6b 69 6e 67 20 69 6e 64 65 78  s-checking index
b870: 65 73 2e 20 20 51 75 69 63 6b 5f 63 68 65 63 6b  es.  Quick_check
b880: 0a 20 20 2a 2a 20 69 73 20 6c 69 6e 65 61 72 20  .  ** is linear 
b890: 74 69 6d 65 20 77 68 65 72 65 61 73 65 20 69 6e  time wherease in
b8a0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 69 73  tegrity_check is
b8b0: 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a 2f 0a   O(NlogN)..  */.
b8c0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 49    case PragTyp_I
b8d0: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 3a 20  NTEGRITY_CHECK: 
b8e0: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20  {.    int i, j, 
b8f0: 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a 0a 20 20  addr, mxErr;..  
b900: 20 20 69 6e 74 20 69 73 51 75 69 63 6b 20 3d 20    int isQuick = 
b910: 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28  (sqlite3Tolower(
b920: 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71 27 29 3b  zLeft[0])=='q');
b930: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
b940: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 77  PRAGMA command w
b950: 61 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  as of the form "
b960: 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69 6e 74 65  PRAGMA <db>.inte
b970: 67 72 69 74 79 5f 63 68 65 63 6b 22 2c 0a 20 20  grity_check",.  
b980: 20 20 2a 2a 20 74 68 65 6e 20 69 44 62 20 69 73    ** then iDb is
b990: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
b9a0: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
b9b0: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
b9c0: 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  <db>..    ** In 
b9d0: 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 69  this case, the i
b9e0: 6e 74 65 67 72 69 74 79 20 6f 66 20 64 61 74 61  ntegrity of data
b9f0: 62 61 73 65 20 69 44 62 20 6f 6e 6c 79 20 69 73  base iDb only is
ba00: 20 76 65 72 69 66 69 65 64 20 62 79 0a 20 20 20   verified by.   
ba10: 20 2a 2a 20 74 68 65 20 56 44 42 45 20 63 72 65   ** the VDBE cre
ba20: 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20 20 20 20  ated below..    
ba30: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  **.    ** Otherw
ba40: 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6d 6d  ise, if the comm
ba50: 61 6e 64 20 77 61 73 20 73 69 6d 70 6c 79 20 22  and was simply "
ba60: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
ba70: 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20 20 20 20  _check" (or.    
ba80: 2a 2a 20 22 50 52 41 47 4d 41 20 71 75 69 63 6b  ** "PRAGMA quick
ba90: 5f 63 68 65 63 6b 22 29 2c 20 74 68 65 6e 20 69  _check"), then i
baa0: 44 62 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  Db is set to 0. 
bab0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65  In this case, se
bac0: 74 20 69 44 62 0a 20 20 20 20 2a 2a 20 74 6f 20  t iDb.    ** to 
bad0: 2d 31 20 68 65 72 65 2c 20 74 6f 20 69 6e 64 69  -1 here, to indi
bae0: 63 61 74 65 20 74 68 61 74 20 74 68 65 20 56 44  cate that the VD
baf0: 42 45 20 73 68 6f 75 6c 64 20 76 65 72 69 66 79  BE should verify
bb00: 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 0a 20   the integrity. 
bb10: 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 61 74 74     ** of all att
bb20: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2e  ached databases.
bb30: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
bb40: 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20 61   iDb>=0 );.    a
bb50: 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 7c 7c  ssert( iDb==0 ||
bb60: 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20 20 20 20   pId2->z );.    
bb70: 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d 30 20 29  if( pId2->z==0 )
bb80: 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20 20 20 20   iDb = -1;..    
bb90: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
bba0: 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 2a  e VDBE program *
bbb0: 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  /.    pParse->nM
bbc0: 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a 20  em = 6;..    /* 
bbd0: 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
bbe0: 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a 20  error count */. 
bbf0: 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49 54     mxErr = SQLIT
bc00: 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  E_INTEGRITY_CHEC
bc10: 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20  K_ERROR_MAX;.   
bc20: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
bc30: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49       sqlite3GetI
bc40: 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 6d 78  nt32(zRight, &mx
bc50: 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Err);.      if( 
bc60: 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20 20 20  mxErr<=0 ){.    
bc70: 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49      mxErr = SQLI
bc80: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
bc90: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20  CK_ERROR_MAX;.  
bca0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
bcb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bcc0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
bcd0: 20 6d 78 45 72 72 2d 31 2c 20 31 29 3b 20 2f 2a   mxErr-1, 1); /*
bce0: 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20 65 72   reg[1] holds er
bcf0: 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a 20 20  rors left */..  
bd00: 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67    /* Do an integ
bd10: 72 69 74 79 20 63 68 65 63 6b 20 6f 6e 20 65 61  rity check on ea
bd20: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
bd30: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
bd40: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
bd50: 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c 65 6d  {.      HashElem
bd60: 20 2a 78 3b 0a 20 20 20 20 20 20 48 61 73 68 20   *x;.      Hash 
bd70: 2a 70 54 62 6c 73 3b 0a 20 20 20 20 20 20 69 6e  *pTbls;.      in
bd80: 74 20 2a 61 52 6f 6f 74 3b 0a 20 20 20 20 20 20  t *aRoot;.      
bd90: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
bda0: 20 20 20 69 6e 74 20 6d 78 49 64 78 20 3d 20 30     int mxIdx = 0
bdb0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 78  ;.      int nIdx
bdc0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 4f 4d 49  ;..      if( OMI
bdd0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 3d 3d 31  T_TEMPDB && i==1
bde0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
bdf0: 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 26 26     if( iDb>=0 &&
be00: 20 69 21 3d 69 44 62 20 29 20 63 6f 6e 74 69 6e   i!=iDb ) contin
be10: 75 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ue;..      sqlit
be20: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
be30: 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 0a  ma(pParse, i);..
be40: 20 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69        /* Do an i
be50: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f  ntegrity check o
be60: 66 20 74 68 65 20 42 2d 54 72 65 65 0a 20 20 20  f the B-Tree.   
be70: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
be80: 65 67 69 6e 20 62 79 20 66 69 6e 64 69 6e 67 20  egin by finding 
be90: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 73 20 6e  the root pages n
bea0: 75 6d 62 65 72 73 0a 20 20 20 20 20 20 2a 2a 20  umbers.      ** 
beb0: 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 61  for all tables a
bec0: 6e 64 20 69 6e 64 69 63 65 73 20 69 6e 20 74 68  nd indices in th
bed0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
bee0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
bef0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
bf00: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 2c  MutexHeld(db, i,
bf10: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 54 62   0) );.      pTb
bf20: 6c 73 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  ls = &db->aDb[i]
bf30: 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
bf40: 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74  h;.      for(cnt
bf50: 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68  =0, x=sqliteHash
bf60: 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b  First(pTbls); x;
bf70: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   x=sqliteHashNex
bf80: 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(x)){.        T
bf90: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
bfa0: 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a  iteHashData(x);.
bfb0: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
bfc0: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Idx;.        if(
bfd0: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
bfe0: 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  ) cnt++;.       
bff0: 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49 64   for(nIdx=0, pId
c000: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
c010: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
c020: 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29 7b  >pNext, nIdx++){
c030: 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20 20 20   cnt++; }.      
c040: 20 20 69 66 28 20 6e 49 64 78 3e 6d 78 49 64 78    if( nIdx>mxIdx
c050: 20 29 20 6d 78 49 64 78 20 3d 20 6e 49 64 78 3b   ) mxIdx = nIdx;
c060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
c070: 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62  Root = sqlite3Db
c080: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
c090: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 63 6e 74  sizeof(int)*(cnt
c0a0: 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +1));.      if( 
c0b0: 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72 65 61 6b  aRoot==0 ) break
c0c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74 3d  ;.      for(cnt=
c0d0: 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68 46  0, x=sqliteHashF
c0e0: 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20  irst(pTbls); x; 
c0f0: 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  x=sqliteHashNext
c100: 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61  (x)){.        Ta
c110: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
c120: 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20  teHashData(x);. 
c130: 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
c140: 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  dx;.        if( 
c150: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
c160: 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20   aRoot[cnt++] = 
c170: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  pTab->tnum;.    
c180: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
c190: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
c1a0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
c1b0: 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 52  t){.          aR
c1c0: 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70 49 64  oot[cnt++] = pId
c1d0: 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  x->tnum;.       
c1e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
c1f0: 20 61 52 6f 6f 74 5b 63 6e 74 5d 20 3d 20 30 3b   aRoot[cnt] = 0;
c200: 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  ..      /* Make 
c210: 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
c220: 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74  number of regist
c230: 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 6c  ers have been al
c240: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 20  located */.     
c250: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
c260: 4d 41 58 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65  MAX( pParse->nMe
c270: 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b 0a 20 20  m, 8+mxIdx );.  
c280: 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
c290: 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
c2a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
c2b0: 44 6f 20 74 68 65 20 62 2d 74 72 65 65 20 69 6e  Do the b-tree in
c2c0: 74 65 67 72 69 74 79 20 63 68 65 63 6b 73 20 2a  tegrity checks *
c2d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
c2e0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
c2f0: 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 32 2c 20  IntegrityCk, 2, 
c300: 63 6e 74 2c 20 31 2c 20 28 63 68 61 72 2a 29 61  cnt, 1, (char*)a
c310: 52 6f 6f 74 2c 50 34 5f 49 4e 54 41 52 52 41 59  Root,P4_INTARRAY
c320: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c330: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
c340: 28 75 38 29 69 29 3b 0a 20 20 20 20 20 20 61 64  (u8)i);.      ad
c350: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
c360: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e  AddOp1(v, OP_IsN
c370: 75 6c 6c 2c 20 32 29 3b 20 56 64 62 65 43 6f 76  ull, 2); VdbeCov
c380: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
c390: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c3a0: 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
c3b0: 20 30 2c 20 33 2c 20 30 2c 0a 20 20 20 20 20 20   0, 3, 0,.      
c3c0: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
c3d0: 66 28 64 62 2c 20 22 2a 2a 2a 20 69 6e 20 64 61  f(db, "*** in da
c3e0: 74 61 62 61 73 65 20 25 73 20 2a 2a 2a 5c 6e 22  tabase %s ***\n"
c3f0: 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62  , db->aDb[i].zDb
c400: 53 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  SName),.        
c410: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
c420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c430: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76 65  ddOp3(v, OP_Move
c440: 2c 20 32 2c 20 34 2c 20 31 29 3b 0a 20 20 20 20  , 2, 4, 1);.    
c450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c460: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
c470: 2c 20 34 2c 20 33 2c 20 32 29 3b 0a 20 20 20 20  , 4, 3, 2);.    
c480: 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b    integrityCheck
c490: 52 65 73 75 6c 74 52 6f 77 28 76 2c 20 32 29 3b  ResultRow(v, 2);
c4a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c4b0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c4c0: 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  dr);..      /* M
c4d0: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
c4e0: 20 69 6e 64 69 63 65 73 20 61 72 65 20 63 6f 6e   indices are con
c4f0: 73 74 72 75 63 74 65 64 20 63 6f 72 72 65 63 74  structed correct
c500: 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
c510: 20 20 20 66 6f 72 28 78 3d 73 71 6c 69 74 65 48     for(x=sqliteH
c520: 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b  ashFirst(pTbls);
c530: 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68   x; x=sqliteHash
c540: 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20  Next(x)){.      
c550: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c560: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78  sqliteHashData(x
c570: 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  );.        Index
c580: 20 2a 70 49 64 78 2c 20 2a 70 50 6b 3b 0a 20 20   *pIdx, *pPk;.  
c590: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 72        Index *pPr
c5a0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
c5b0: 20 69 6e 74 20 6c 6f 6f 70 54 6f 70 3b 0a 20 20   int loopTop;.  
c5c0: 20 20 20 20 20 20 69 6e 74 20 69 44 61 74 61 43        int iDataC
c5d0: 75 72 2c 20 69 49 64 78 43 75 72 3b 0a 20 20 20  ur, iIdxCur;.   
c5e0: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2d 31       int r1 = -1
c5f0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
c600: 54 61 62 2d 3e 74 6e 75 6d 3c 31 20 29 20 63 6f  Tab->tnum<1 ) co
c610: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 53 6b 69 70  ntinue;  /* Skip
c620: 20 56 49 45 57 73 20 6f 72 20 56 49 52 54 55 41   VIEWs or VIRTUA
c630: 4c 20 54 41 42 4c 45 73 20 2a 2f 0a 20 20 20 20  L TABLEs */.    
c640: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 43      if( pTab->pC
c650: 68 65 63 6b 3d 3d 30 0a 20 20 20 20 20 20 20 20  heck==0.        
c660: 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
c670: 61 67 73 20 26 20 54 46 5f 48 61 73 4e 6f 74 4e  ags & TF_HasNotN
c680: 75 6c 6c 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ull)==0.        
c690: 20 26 26 20 28 70 54 61 62 2d 3e 70 49 6e 64 65   && (pTab->pInde
c6a0: 78 3d 3d 30 20 7c 7c 20 69 73 51 75 69 63 6b 29  x==0 || isQuick)
c6b0: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
c6c0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
c6d0: 20 2f 2a 20 4e 6f 20 61 64 64 69 74 69 6f 6e 61   /* No additiona
c6e0: 6c 20 63 68 65 63 6b 73 20 6e 65 65 64 65 64 20  l checks needed 
c6f0: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 2a  for this table *
c700: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
c710: 20 20 20 20 70 50 6b 20 3d 20 48 61 73 52 6f 77      pPk = HasRow
c720: 69 64 28 70 54 61 62 29 20 3f 20 30 20 3a 20 73  id(pTab) ? 0 : s
c730: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
c740: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
c750: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c760: 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
c770: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
c780: 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49  te3OpenTableAndI
c790: 6e 64 69 63 65 73 28 70 50 61 72 73 65 2c 20 70  ndices(pParse, p
c7a0: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
c7b0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 26 69          1, 0, &i
c7e0: 44 61 74 61 43 75 72 2c 20 26 69 49 64 78 43 75  DataCur, &iIdxCu
c7f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
c800: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c810: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
c820: 37 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  7);.        for(
c830: 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  j=0, pIdx=pTab->
c840: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
c850: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
c860: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
c870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c880: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
c890: 20 30 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e 64   0, 8+j); /* ind
c8a0: 65 78 20 65 6e 74 72 69 65 73 20 63 6f 75 6e 74  ex entries count
c8b0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  er */.        }.
c8c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c8d0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b  pParse->nMem>=8+
c8e0: 6a 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  j );.        ass
c8f0: 65 72 74 28 20 73 71 6c 69 74 65 33 4e 6f 54 65  ert( sqlite3NoTe
c900: 6d 70 73 49 6e 52 61 6e 67 65 28 70 50 61 72 73  mpsInRange(pPars
c910: 65 2c 31 2c 37 2b 6a 29 20 29 3b 0a 20 20 20 20  e,1,7+j) );.    
c920: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c930: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
c940: 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20 30 29  nd, iDataCur, 0)
c950: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
c960: 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6f 70 54  );.        loopT
c970: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
c980: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
c990: 49 6d 6d 2c 20 37 2c 20 31 29 3b 0a 20 20 20 20  Imm, 7, 1);.    
c9a0: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
c9b0: 61 74 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20  at all NOT NULL 
c9c0: 63 6f 6c 75 6d 6e 73 20 72 65 61 6c 6c 79 20 61  columns really a
c9d0: 72 65 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20  re NOT NULL */. 
c9e0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
c9f0: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
ca00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68  +){.          ch
ca10: 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20  ar *zErr;.      
ca20: 20 20 20 20 69 6e 74 20 6a 6d 70 32 3b 0a 20 20      int jmp2;.  
ca30: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70          if( j==p
ca40: 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e  Tab->iPKey ) con
ca50: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
ca60: 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   if( pTab->aCol[
ca70: 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20  j].notNull==0 ) 
ca80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
ca90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
caa0: 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
cab0: 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 44 61  ble(v, pTab, iDa
cac0: 74 61 43 75 72 2c 20 6a 2c 20 33 29 3b 0a 20 20  taCur, j, 3);.  
cad0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cae0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
caf0: 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29  PFLAG_TYPEOFARG)
cb00: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70 32  ;.          jmp2
cb10: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
cb20: 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp1(v, OP_NotNu
cb30: 6c 6c 2c 20 33 29 3b 20 56 64 62 65 43 6f 76 65  ll, 3); VdbeCove
cb40: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
cb50: 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65     zErr = sqlite
cb60: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 4e 55  3MPrintf(db, "NU
cb70: 4c 4c 20 76 61 6c 75 65 20 69 6e 20 25 73 2e 25  LL value in %s.%
cb80: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
cb90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
cbb0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
cbc0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
cbd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
cbe0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
cbf0: 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50  0, 3, 0, zErr, P
cc00: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
cc10: 20 20 20 20 20 20 69 6e 74 65 67 72 69 74 79 43        integrityC
cc20: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 2c  heckResultRow(v,
cc30: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   3);.          s
cc40: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
cc50: 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20  re(v, jmp2);.   
cc60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
cc70: 2a 20 56 65 72 69 66 79 20 43 48 45 43 4b 20 63  * Verify CHECK c
cc80: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
cc90: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
cca0: 70 43 68 65 63 6b 20 26 26 20 28 64 62 2d 3e 66  pCheck && (db->f
ccb0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 67  lags & SQLITE_Ig
ccc0: 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30 20 29  noreChecks)==0 )
ccd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
cce0: 4c 69 73 74 20 2a 70 43 68 65 63 6b 20 3d 20 73  List *pCheck = s
ccf0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
cd00: 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65  p(db, pTab->pChe
cd10: 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ck, 0);.        
cd20: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
cd30: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
cd40: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64           int add
cd50: 72 43 6b 46 61 75 6c 74 20 3d 20 73 71 6c 69 74  rCkFault = sqlit
cd60: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
cd70: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
cd80: 69 6e 74 20 61 64 64 72 43 6b 4f 6b 20 3d 20 73  int addrCkOk = s
cd90: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
cda0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
cdb0: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a      char *zErr;.
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
cdd0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  k;.            p
cde0: 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
cdf0: 3d 20 69 44 61 74 61 43 75 72 3b 0a 20 20 20 20  = iDataCur;.    
ce00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ce10: 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
ce20: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
ce30: 20 20 66 6f 72 28 6b 3d 70 43 68 65 63 6b 2d 3e    for(k=pCheck->
ce40: 6e 45 78 70 72 2d 31 3b 20 6b 3e 30 3b 20 6b 2d  nExpr-1; k>0; k-
ce50: 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
ce60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
ce70: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 68  alse(pParse, pCh
ce80: 65 63 6b 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 2c  eck->a[k].pExpr,
ce90: 20 61 64 64 72 43 6b 46 61 75 6c 74 2c 20 30 29   addrCkFault, 0)
cea0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
cec0: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
ced0: 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b  arse, pCheck->a[
cee0: 30 5d 2e 70 45 78 70 72 2c 20 61 64 64 72 43 6b  0].pExpr, addrCk
cef0: 4f 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  Ok, .           
cf00: 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50       SQLITE_JUMP
cf10: 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
cf20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cf30: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
cf40: 61 64 64 72 43 6b 46 61 75 6c 74 29 3b 0a 20 20  addrCkFault);.  
cf50: 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d            zErr =
cf60: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
cf70: 64 62 2c 20 22 43 48 45 43 4b 20 63 6f 6e 73 74  db, "CHECK const
cf80: 72 61 69 6e 74 20 66 61 69 6c 65 64 20 69 6e 20  raint failed in 
cf90: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
cfa0: 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
cfb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
cfc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
cfd0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
cfe0: 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50  0, 3, 0, zErr, P
cff0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
d000: 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74          integrit
d010: 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28  yCheckResultRow(
d020: 76 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  v, 3);.         
d030: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
d040: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
d050: 64 72 43 6b 4f 6b 29 3b 0a 20 20 20 20 20 20 20  drCkOk);.       
d060: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d070: 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
d080: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d090: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
d0a0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
d0b0: 2c 20 70 43 68 65 63 6b 29 3b 0a 20 20 20 20 20  , pCheck);.     
d0c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
d0d0: 56 61 6c 69 64 61 74 65 20 69 6e 64 65 78 20 65  Validate index e
d0e0: 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 63  ntries for the c
d0f0: 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20  urrent row */.  
d100: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
d110: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
d120: 3b 20 70 49 64 78 20 26 26 20 21 69 73 51 75 69  ; pIdx && !isQui
d130: 63 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  ck; pIdx=pIdx->p
d140: 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20  Next, j++){.    
d150: 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 2c 20        int jmp2, 
d160: 6a 6d 70 33 2c 20 6a 6d 70 34 2c 20 6a 6d 70 35  jmp3, jmp4, jmp5
d170: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
d180: 63 6b 55 6e 69 71 20 3d 20 73 71 6c 69 74 65 33  ckUniq = sqlite3
d190: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
d1a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d1b0: 70 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74  pPk==pIdx ) cont
d1c0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
d1d0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65  r1 = sqlite3Gene
d1e0: 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
d1f0: 72 73 65 2c 20 70 49 64 78 2c 20 69 44 61 74 61  rse, pIdx, iData
d200: 43 75 72 2c 20 30 2c 20 30 2c 20 26 6a 6d 70 33  Cur, 0, 0, &jmp3
d210: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d230: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c           pPrior,
d240: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
d250: 70 50 72 69 6f 72 20 3d 20 70 49 64 78 3b 0a 20  pPrior = pIdx;. 
d260: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d270: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d280: 5f 41 64 64 49 6d 6d 2c 20 38 2b 6a 2c 20 31 29  _AddImm, 8+j, 1)
d290: 3b 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20  ;  /* increment 
d2a0: 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f 0a 20  entry count */. 
d2b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69           /* Veri
d2c0: 66 79 20 74 68 61 74 20 61 6e 20 69 6e 64 65 78  fy that an index
d2d0: 20 65 6e 74 72 79 20 65 78 69 73 74 73 20 66 6f   entry exists fo
d2e0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  r the current ta
d2f0: 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ble row */.     
d300: 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69       jmp2 = sqli
d310: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d320: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 49  (v, OP_Found, iI
d330: 64 78 43 75 72 2b 6a 2c 20 63 6b 55 6e 69 71 2c  dxCur+j, ckUniq,
d340: 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r1,.           
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
d370: 3e 6e 43 6f 6c 75 6d 6e 29 3b 20 56 64 62 65 43  >nColumn); VdbeC
d380: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
d390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d3a0: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33  eLoadString(v, 3
d3b0: 2c 20 22 72 6f 77 20 22 29 3b 0a 20 20 20 20 20  , "row ");.     
d3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d3d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
d3e0: 63 61 74 2c 20 37 2c 20 33 2c 20 33 29 3b 0a 20  cat, 7, 3, 3);. 
d3f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d400: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
d410: 2c 20 34 2c 20 22 20 6d 69 73 73 69 6e 67 20 66  , 4, " missing f
d420: 72 6f 6d 20 69 6e 64 65 78 20 22 29 3b 0a 20 20  rom index ");.  
d430: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d440: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d450: 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33 29  Concat, 4, 3, 3)
d460: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70 35  ;.          jmp5
d470: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f   = sqlite3VdbeLo
d480: 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 70  adString(v, 4, p
d490: 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
d4a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d4b0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
d4c0: 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33 29 3b  oncat, 4, 3, 3);
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70 34 20  .          jmp4 
d4e0: 3d 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b  = integrityCheck
d4f0: 52 65 73 75 6c 74 52 6f 77 28 76 2c 20 33 29 3b  ResultRow(v, 3);
d500: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d510: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d520: 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20  , jmp2);.       
d530: 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 51 55 45     /* For UNIQUE
d540: 20 69 6e 64 65 78 65 73 2c 20 76 65 72 69 66 79   indexes, verify
d550: 20 74 68 61 74 20 6f 6e 6c 79 20 6f 6e 65 20 65   that only one e
d560: 6e 74 72 79 20 65 78 69 73 74 73 20 77 69 74 68  ntry exists with
d570: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
d580: 2a 20 63 75 72 72 65 6e 74 20 6b 65 79 2e 20 20  * current key.  
d590: 54 68 65 20 65 6e 74 72 79 20 69 73 20 75 6e 69  The entry is uni
d5a0: 71 75 65 20 69 66 20 28 31 29 20 61 6e 79 20 63  que if (1) any c
d5b0: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 0a 20 20  olumn is NULL.  
d5c0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 28 32          ** or (2
d5d0: 29 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  ) the next entry
d5e0: 20 68 61 73 20 61 20 64 69 66 66 65 72 65 6e 74   has a different
d5f0: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 20 20   key */.        
d600: 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e    if( IsUniqueIn
d610: 64 65 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20  dex(pIdx) ){.   
d620: 20 20 20 20 20 20 20 20 20 69 6e 74 20 75 6e 69           int uni
d630: 71 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  qOk = sqlite3Vdb
d640: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
d650: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
d660: 6d 70 36 3b 0a 20 20 20 20 20 20 20 20 20 20 20  mp6;.           
d670: 20 69 6e 74 20 6b 6b 3b 0a 20 20 20 20 20 20 20   int kk;.       
d680: 20 20 20 20 20 66 6f 72 28 6b 6b 3d 30 3b 20 6b       for(kk=0; k
d690: 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  k<pIdx->nKeyCol;
d6a0: 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   kk++){.        
d6b0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
d6c0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
d6d0: 6b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  kk];.           
d6e0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 21     assert( iCol!
d6f0: 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20 69 43 6f  =XN_ROWID && iCo
d700: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  l<pTab->nCol );.
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
d720: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70 54 61  ( iCol>=0 && pTa
d730: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
d740: 74 4e 75 6c 6c 20 29 20 63 6f 6e 74 69 6e 75 65  tNull ) continue
d750: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d770: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
d780: 72 31 2b 6b 6b 2c 20 75 6e 69 71 4f 6b 29 3b 0a  r1+kk, uniqOk);.
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
d7a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d7b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d7c0: 20 20 20 20 20 20 20 20 20 6a 6d 70 36 20 3d 20           jmp6 = 
d7d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d7e0: 31 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49  1(v, OP_Next, iI
d7f0: 64 78 43 75 72 2b 6a 29 3b 20 56 64 62 65 43 6f  dxCur+j); VdbeCo
d800: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
d810: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d820: 62 65 47 6f 74 6f 28 76 2c 20 75 6e 69 71 4f 6b  beGoto(v, uniqOk
d830: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d840: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
d850: 72 65 28 76 2c 20 6a 6d 70 36 29 3b 0a 20 20 20  re(v, jmp6);.   
d860: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d870: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
d880: 20 4f 50 5f 49 64 78 47 54 2c 20 69 49 64 78 43   OP_IdxGT, iIdxC
d890: 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b 2c 20 72 31  ur+j, uniqOk, r1
d8a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 20 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c     pIdx->nKeyCol
d8d0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
d8e0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
d8f0: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
d900: 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 6e 6f 6e  tring(v, 3, "non
d910: 2d 75 6e 69 71 75 65 20 65 6e 74 72 79 20 69 6e  -unique entry in
d920: 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20   index ");.     
d930: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d940: 62 65 47 6f 74 6f 28 76 2c 20 6a 6d 70 35 29 3b  beGoto(v, jmp5);
d950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d960: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
d970: 61 62 65 6c 28 76 2c 20 75 6e 69 71 4f 6b 29 3b  abel(v, uniqOk);
d980: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d990: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d9a0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
d9b0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  p4);.          s
d9c0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72  qlite3ResolvePar
d9d0: 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65  tIdxLabel(pParse
d9e0: 2c 20 6a 6d 70 33 29 3b 0a 20 20 20 20 20 20 20  , jmp3);.       
d9f0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
da00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
da10: 4f 50 5f 4e 65 78 74 2c 20 69 44 61 74 61 43 75  OP_Next, iDataCu
da20: 72 2c 20 6c 6f 6f 70 54 6f 70 29 3b 20 56 64 62  r, loopTop); Vdb
da30: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
da40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
da50: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6c 6f 6f  eJumpHere(v, loo
da60: 70 54 6f 70 2d 31 29 3b 0a 23 69 66 6e 64 65 66  pTop-1);.#ifndef
da70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
da80: 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 20 20  EECOUNT.        
da90: 69 66 28 20 21 69 73 51 75 69 63 6b 20 29 7b 0a  if( !isQuick ){.
daa0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dab0: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
dac0: 76 2c 20 32 2c 20 22 77 72 6f 6e 67 20 23 20 6f  v, 2, "wrong # o
dad0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 69 6e 64  f entries in ind
dae0: 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ex ");.         
daf0: 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70   for(j=0, pIdx=p
db00: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
db10: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
db20: 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ext, j++){.     
db30: 20 20 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d         if( pPk==
db40: 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b  pIdx ) continue;
db50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
db60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
db70: 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 49 64 78  , OP_Count, iIdx
db80: 43 75 72 2b 6a 2c 20 33 29 3b 0a 20 20 20 20 20  Cur+j, 3);.     
db90: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
dba0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
dbb0: 76 2c 20 4f 50 5f 45 71 2c 20 38 2b 6a 2c 20 30  v, OP_Eq, 8+j, 0
dbc0: 2c 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 3); VdbeCovera
dbd0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
dbe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
dbf0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
dc00: 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
dc10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dc20: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
dc30: 33 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  3, pIdx->zName);
dc40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
dc50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
dc60: 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 33 2c 20  , OP_Concat, 3, 
dc70: 32 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20  2, 7);.         
dc80: 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63     integrityChec
dc90: 6b 52 65 73 75 6c 74 52 6f 77 28 76 2c 20 37 29  kResultRow(v, 7)
dca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
dcb0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
dcc0: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
dcd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dce0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
dcf0: 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
dd00: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7d 20 0a 20  NT */.      } . 
dd10: 20 20 20 7d 0a 20 20 20 20 7b 0a 20 20 20 20 20     }.    {.     
dd20: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
dd30: 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46  t iLn = VDBE_OFF
dd40: 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20  SET_LINENO(2);. 
dd50: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
dd60: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 65 6e 64  t VdbeOpList end
dd70: 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Code[] = {.     
dd80: 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20     { OP_AddImm, 
dd90: 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20       1, 0,      
dda0: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f    0},    /* 0 */
ddb0: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66  .        { OP_If
ddc0: 4e 6f 74 5a 65 72 6f 2c 20 20 20 31 2c 20 34 2c  NotZero,   1, 4,
ddd0: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
dde0: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 1 */.        {
ddf0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20   OP_String8,    
de00: 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d   0, 3,        0}
de10: 2c 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20  ,    /* 2 */.   
de20: 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74       { OP_Result
de30: 52 6f 77 2c 20 20 20 33 2c 20 31 2c 20 20 20 20  Row,   3, 1,    
de40: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20      0},    /* 3 
de50: 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  */.      };.    
de60: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 0a    VdbeOp *aOp;..
de70: 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69        aOp = sqli
de80: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
de90: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 65 6e  (v, ArraySize(en
dea0: 64 43 6f 64 65 29 2c 20 65 6e 64 43 6f 64 65 2c  dCode), endCode,
deb0: 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28   iLn);.      if(
dec0: 20 61 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20   aOp ){.        
ded0: 61 4f 70 5b 30 5d 2e 70 32 20 3d 20 31 2d 6d 78  aOp[0].p2 = 1-mx
dee0: 45 72 72 3b 0a 20 20 20 20 20 20 20 20 61 4f 70  Err;.        aOp
def0: 5b 32 5d 2e 70 34 74 79 70 65 20 3d 20 50 34 5f  [2].p4type = P4_
df00: 53 54 41 54 49 43 3b 0a 20 20 20 20 20 20 20 20  STATIC;.        
df10: 61 4f 70 5b 32 5d 2e 70 34 2e 7a 20 3d 20 22 6f  aOp[2].p4.z = "o
df20: 6b 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k";.      }.    
df30: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
df40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
df50: 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
df60: 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
df70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
df80: 31 36 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  16.  /*.  **   P
df90: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 0a 20  RAGMA encoding. 
dfa0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63   **   PRAGMA enc
dfb0: 6f 64 69 6e 67 20 3d 20 22 75 74 66 2d 38 22 7c  oding = "utf-8"|
dfc0: 22 75 74 66 2d 31 36 22 7c 22 75 74 66 2d 31 36  "utf-16"|"utf-16
dfd0: 6c 65 22 7c 22 75 74 66 2d 31 36 62 65 22 0a 20  le"|"utf-16be". 
dfe0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 69 74 73 20   **.  ** In its 
dff0: 66 69 72 73 74 20 66 6f 72 6d 2c 20 74 68 69 73  first form, this
e000: 20 70 72 61 67 6d 61 20 72 65 74 75 72 6e 73 20   pragma returns 
e010: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  the encoding of 
e020: 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 64 61  the main.  ** da
e030: 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 64  tabase. If the d
e040: 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 69  atabase is not i
e050: 6e 69 74 69 61 6c 69 7a 65 64 2c 20 69 74 20 69  nitialized, it i
e060: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6e 6f  s initialized no
e070: 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  w..  **.  ** The
e080: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 6f 66 20   second form of 
e090: 74 68 69 73 20 70 72 61 67 6d 61 20 69 73 20 61  this pragma is a
e0a0: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6d 61   no-op if the ma
e0b0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
e0c0: 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c  .  ** has not al
e0d0: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 69 74 69  ready been initi
e0e0: 61 6c 69 7a 65 64 2e 20 49 6e 20 74 68 69 73 20  alized. In this 
e0f0: 63 61 73 65 20 69 74 20 73 65 74 73 20 74 68 65  case it sets the
e100: 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 65 6e   default.  ** en
e110: 63 6f 64 69 6e 67 20 74 68 61 74 20 77 69 6c 6c  coding that will
e120: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
e130: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
e140: 69 6c 65 20 69 66 20 61 20 6e 65 77 20 66 69 6c  ile if a new fil
e150: 65 0a 20 20 2a 2a 20 69 73 20 63 72 65 61 74 65  e.  ** is create
e160: 64 2e 20 49 66 20 61 6e 20 65 78 69 73 74 69 6e  d. If an existin
e170: 67 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  g main database 
e180: 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  file is opened, 
e190: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 64 65  then the.  ** de
e1a0: 66 61 75 6c 74 20 74 65 78 74 20 65 6e 63 6f 64  fault text encod
e1b0: 69 6e 67 20 66 6f 72 20 74 68 65 20 65 78 69 73  ing for the exis
e1c0: 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 69 73  ting database is
e1d0: 20 75 73 65 64 2e 0a 20 20 2a 2a 20 0a 20 20 2a   used..  ** .  *
e1e0: 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 20 6e  * In all cases n
e1f0: 65 77 20 64 61 74 61 62 61 73 65 73 20 63 72 65  ew databases cre
e200: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 41  ated using the A
e210: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 20 61 72  TTACH command ar
e220: 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 74  e.  ** created t
e230: 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 64  o use the same d
e240: 65 66 61 75 6c 74 20 74 65 78 74 20 65 6e 63 6f  efault text enco
e250: 64 69 6e 67 20 61 73 20 74 68 65 20 6d 61 69 6e  ding as the main
e260: 20 64 61 74 61 62 61 73 65 2e 20 49 66 0a 20 20   database. If.  
e270: 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ** the main data
e280: 62 61 73 65 20 68 61 73 20 6e 6f 74 20 62 65 65  base has not bee
e290: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  n initialized an
e2a0: 64 2f 6f 72 20 63 72 65 61 74 65 64 20 77 68 65  d/or created whe
e2b0: 6e 20 41 54 54 41 43 48 0a 20 20 2a 2a 20 69 73  n ATTACH.  ** is
e2c0: 20 65 78 65 63 75 74 65 64 2c 20 74 68 69 73 20   executed, this 
e2d0: 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74  is done before t
e2e0: 68 65 20 41 54 54 41 43 48 20 6f 70 65 72 61 74  he ATTACH operat
e2f0: 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ion..  **.  ** I
e300: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  n the second for
e310: 6d 20 74 68 69 73 20 70 72 61 67 6d 61 20 73 65  m this pragma se
e320: 74 73 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f  ts the text enco
e330: 64 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20  ding to be used 
e340: 69 6e 0a 20 20 2a 2a 20 6e 65 77 20 64 61 74 61  in.  ** new data
e350: 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61 74  base files creat
e360: 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
e370: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 49  tabase handle. I
e380: 74 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 75  t is only.  ** u
e390: 73 65 66 75 6c 20 69 66 20 69 6e 76 6f 6b 65 64  seful if invoked
e3a0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
e3b0: 65 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  er the main data
e3c0: 62 61 73 65 20 69 0a 20 20 2a 2f 0a 20 20 63 61  base i.  */.  ca
e3d0: 73 65 20 50 72 61 67 54 79 70 5f 45 4e 43 4f 44  se PragTyp_ENCOD
e3e0: 49 4e 47 3a 20 7b 0a 20 20 20 20 73 74 61 74 69  ING: {.    stati
e3f0: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45  c const struct E
e400: 6e 63 4e 61 6d 65 20 7b 0a 20 20 20 20 20 20 63  ncName {.      c
e410: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
e420: 20 20 75 38 20 65 6e 63 3b 0a 20 20 20 20 7d 20    u8 enc;.    } 
e430: 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b 0a 20  encnames[] = {. 
e440: 20 20 20 20 20 7b 20 22 55 54 46 38 22 2c 20 20       { "UTF8",  
e450: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20     SQLITE_UTF8  
e460: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
e470: 20 22 55 54 46 2d 38 22 2c 20 20 20 20 53 51 4c   "UTF-8",    SQL
e480: 49 54 45 5f 55 54 46 38 20 20 20 20 20 20 20 20  ITE_UTF8        
e490: 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65  },  /* Must be e
e4a0: 6c 65 6d 65 6e 74 20 5b 31 5d 20 2a 2f 0a 20 20  lement [1] */.  
e4b0: 20 20 20 20 7b 20 22 55 54 46 2d 31 36 6c 65 22      { "UTF-16le"
e4c0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
e4d0: 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74       },  /* Must
e4e0: 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 32 5d 20   be element [2] 
e4f0: 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d  */.      { "UTF-
e500: 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  16be", SQLITE_UT
e510: 46 31 36 42 45 20 20 20 20 20 7d 2c 20 20 2f 2a  F16BE     },  /*
e520: 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74   Must be element
e530: 20 5b 33 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20   [3] */.      { 
e540: 22 55 54 46 31 36 6c 65 22 2c 20 20 53 51 4c 49  "UTF16le",  SQLI
e550: 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20 7d  TE_UTF16LE     }
e560: 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31 36  ,.      { "UTF16
e570: 62 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54 46  be",  SQLITE_UTF
e580: 31 36 42 45 20 20 20 20 20 7d 2c 0a 20 20 20 20  16BE     },.    
e590: 20 20 7b 20 22 55 54 46 2d 31 36 22 2c 20 20 20    { "UTF-16",   
e5a0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
e5b0: 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f     }, /* SQLITE_
e5c0: 55 54 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20  UTF16NATIVE */. 
e5d0: 20 20 20 20 20 7b 20 22 55 54 46 31 36 22 2c 20       { "UTF16", 
e5e0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
e5f0: 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49        }, /* SQLI
e600: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 2a  TE_UTF16NATIVE *
e610: 2f 0a 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d  /.      { 0, 0 }
e620: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 6f 6e 73  .    };.    cons
e630: 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65  t struct EncName
e640: 20 2a 70 45 6e 63 3b 0a 20 20 20 20 69 66 28 20   *pEnc;.    if( 
e650: 21 7a 52 69 67 68 74 20 29 7b 20 20 20 20 2f 2a  !zRight ){    /*
e660: 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e   "PRAGMA encodin
e670: 67 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  g" */.      if( 
e680: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
e690: 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
e6a0: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20   pragma_out;.   
e6b0: 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61     assert( encna
e6c0: 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 38 5d  mes[SQLITE_UTF8]
e6d0: 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  .enc==SQLITE_UTF
e6e0: 38 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  8 );.      asser
e6f0: 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49  t( encnames[SQLI
e700: 54 45 5f 55 54 46 31 36 4c 45 5d 2e 65 6e 63 3d  TE_UTF16LE].enc=
e710: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20  =SQLITE_UTF16LE 
e720: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e730: 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45   encnames[SQLITE
e740: 5f 55 54 46 31 36 42 45 5d 2e 65 6e 63 3d 3d 53  _UTF16BE].enc==S
e750: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b  QLITE_UTF16BE );
e760: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
e770: 67 6c 65 54 65 78 74 28 76 2c 20 65 6e 63 6e 61  gleText(v, encna
e780: 6d 65 73 5b 45 4e 43 28 70 50 61 72 73 65 2d 3e  mes[ENC(pParse->
e790: 64 62 29 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  db)].zName);.   
e7a0: 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e7c0: 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69  * "PRAGMA encodi
e7d0: 6e 67 20 3d 20 58 58 58 22 20 2a 2f 0a 20 20 20  ng = XXX" */.   
e7e0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 63 68 61 6e 67     /* Only chang
e7f0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 73  e the value of s
e800: 71 6c 69 74 65 2e 65 6e 63 20 69 66 20 74 68 65  qlite.enc if the
e810: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
e820: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   is not.      **
e830: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 66   initialized. If
e840: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e850: 73 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 6e  se exists, the n
e860: 65 77 20 73 71 6c 69 74 65 2e 65 6e 63 20 76 61  ew sqlite.enc va
e870: 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  lue.      ** wil
e880: 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
e890: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
e8a0: 20 69 73 20 6e 65 78 74 20 6c 6f 61 64 65 64 2e   is next loaded.
e8b0: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a   If it does not.
e8c0: 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
e8d0: 20 65 78 69 73 74 73 2c 20 69 74 20 77 69 6c 6c   exists, it will
e8e0: 20 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 75   be created to u
e8f0: 73 65 20 74 68 65 20 6e 65 77 20 65 6e 63 6f 64  se the new encod
e900: 69 6e 67 20 76 61 6c 75 65 2e 0a 20 20 20 20 20  ing value..     
e910: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 0a 20   */.      if( . 
e920: 20 20 20 20 20 20 20 21 28 44 62 48 61 73 50 72         !(DbHasPr
e930: 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20 44 42  operty(db, 0, DB
e940: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 29 20  _SchemaLoaded)) 
e950: 7c 7c 20 0a 20 20 20 20 20 20 20 20 44 62 48 61  || .        DbHa
e960: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 30 2c  sProperty(db, 0,
e970: 20 44 42 5f 45 6d 70 74 79 29 20 0a 20 20 20 20   DB_Empty) .    
e980: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72    ){.        for
e990: 28 70 45 6e 63 3d 26 65 6e 63 6e 61 6d 65 73 5b  (pEnc=&encnames[
e9a0: 30 5d 3b 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 3b  0]; pEnc->zName;
e9b0: 20 70 45 6e 63 2b 2b 29 7b 0a 20 20 20 20 20 20   pEnc++){.      
e9c0: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
e9d0: 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74  e3StrICmp(zRight
e9e0: 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 29 20 29  , pEnc->zName) )
e9f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 43  {.            SC
ea00: 48 45 4d 41 5f 45 4e 43 28 64 62 29 20 3d 20 45  HEMA_ENC(db) = E
ea10: 4e 43 28 64 62 29 20 3d 0a 20 20 20 20 20 20 20  NC(db) =.       
ea20: 20 20 20 20 20 20 20 20 20 70 45 6e 63 2d 3e 65           pEnc->e
ea30: 6e 63 20 3f 20 70 45 6e 63 2d 3e 65 6e 63 20 3a  nc ? pEnc->enc :
ea40: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
ea50: 49 56 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IVE;.           
ea60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ea70: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
ea80: 20 20 20 20 20 20 69 66 28 20 21 70 45 6e 63 2d        if( !pEnc-
ea90: 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
eaa0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
eab0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 73  Msg(pParse, "uns
eac0: 75 70 70 6f 72 74 65 64 20 65 6e 63 6f 64 69 6e  upported encodin
ead0: 67 3a 20 25 73 22 2c 20 7a 52 69 67 68 74 29 3b  g: %s", zRight);
eae0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eaf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
eb00: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  reak;.#endif /* 
eb10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
eb20: 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  6 */..#ifndef SQ
eb30: 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41  LITE_OMIT_SCHEMA
eb40: 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53  _VERSION_PRAGMAS
eb50: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
eb60: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68  GMA [schema.]sch
eb70: 65 6d 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a  ema_version.  **
eb80: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
eb90: 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  a.]schema_versio
eba0: 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20  n = <integer>.  
ebb0: 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  **.  **   PRAGMA
ebc0: 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76   [schema.]user_v
ebd0: 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52  ersion.  **   PR
ebe0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73  AGMA [schema.]us
ebf0: 65 72 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e  er_version = <in
ec00: 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a  teger>.  **.  **
ec10: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
ec20: 61 2e 5d 66 72 65 65 6c 69 73 74 5f 63 6f 75 6e  a.]freelist_coun
ec30: 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52  t.  **.  **   PR
ec40: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 61  AGMA [schema.]da
ec50: 74 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a  ta_version.  **.
ec60: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
ec70: 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69  chema.]applicati
ec80: 6f 6e 5f 69 64 0a 20 20 2a 2a 20 20 20 50 52 41  on_id.  **   PRA
ec90: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70  GMA [schema.]app
eca0: 6c 69 63 61 74 69 6f 6e 5f 69 64 20 3d 20 3c 69  lication_id = <i
ecb0: 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a  nteger>.  **.  *
ecc0: 2a 20 54 68 65 20 70 72 61 67 6d 61 27 73 20 73  * The pragma's s
ecd0: 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 61 6e  chema_version an
ece0: 64 20 75 73 65 72 5f 76 65 72 73 69 6f 6e 20 61  d user_version a
ecf0: 72 65 20 75 73 65 64 20 74 6f 20 73 65 74 20 6f  re used to set o
ed00: 72 20 67 65 74 0a 20 20 2a 2a 20 74 68 65 20 76  r get.  ** the v
ed10: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 63 68 65  alue of the sche
ed20: 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20 75  ma-version and u
ed30: 73 65 72 2d 76 65 72 73 69 6f 6e 2c 20 72 65 73  ser-version, res
ed40: 70 65 63 74 69 76 65 6c 79 2e 20 42 6f 74 68 0a  pectively. Both.
ed50: 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d    ** the schema-
ed60: 76 65 72 73 69 6f 6e 20 61 6e 64 20 74 68 65 20  version and the 
ed70: 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 61 72 65  user-version are
ed80: 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69   32-bit signed i
ed90: 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 73 74 6f  ntegers.  ** sto
eda0: 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
edb0: 61 73 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  ase header..  **
edc0: 0a 20 20 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  .  ** The schema
edd0: 2d 63 6f 6f 6b 69 65 20 69 73 20 75 73 75 61 6c  -cookie is usual
ede0: 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61  ly only manipula
edf0: 74 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  ted internally b
ee00: 79 20 53 51 4c 69 74 65 2e 20 49 74 0a 20 20 2a  y SQLite. It.  *
ee10: 2a 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  * is incremented
ee20: 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 65   by SQLite whene
ee30: 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ver the database
ee40: 20 73 63 68 65 6d 61 20 69 73 20 6d 6f 64 69 66   schema is modif
ee50: 69 65 64 20 28 62 79 0a 20 20 2a 2a 20 63 72 65  ied (by.  ** cre
ee60: 61 74 69 6e 67 20 6f 72 20 64 72 6f 70 70 69 6e  ating or droppin
ee70: 67 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  g a table or ind
ee80: 65 78 29 2e 20 54 68 65 20 73 63 68 65 6d 61 20  ex). The schema 
ee90: 76 65 72 73 69 6f 6e 20 69 73 20 75 73 65 64 20  version is used 
eea0: 62 79 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 65  by.  ** SQLite e
eeb0: 61 63 68 20 74 69 6d 65 20 61 20 71 75 65 72 79  ach time a query
eec0: 20 69 73 20 65 78 65 63 75 74 65 64 20 74 6f 20   is executed to 
eed0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
eee0: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 0a 20  internal cache. 
eef0: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 68 65 6d   ** of the schem
ef00: 61 20 75 73 65 64 20 77 68 65 6e 20 63 6f 6d 70  a used when comp
ef10: 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 71 75  iling the SQL qu
ef20: 65 72 79 20 6d 61 74 63 68 65 73 20 74 68 65 20  ery matches the 
ef30: 73 63 68 65 6d 61 20 6f 66 0a 20 20 2a 2a 20 74  schema of.  ** t
ef40: 68 65 20 64 61 74 61 62 61 73 65 20 61 67 61 69  he database agai
ef50: 6e 73 74 20 77 68 69 63 68 20 74 68 65 20 63 6f  nst which the co
ef60: 6d 70 69 6c 65 64 20 71 75 65 72 79 20 69 73 20  mpiled query is 
ef70: 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
ef80: 64 2e 0a 20 20 2a 2a 20 53 75 62 76 65 72 74 69  d..  ** Subverti
ef90: 6e 67 20 74 68 69 73 20 6d 65 63 68 61 6e 69 73  ng this mechanis
efa0: 6d 20 62 79 20 75 73 69 6e 67 20 22 50 52 41 47  m by using "PRAG
efb0: 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  MA schema_versio
efc0: 6e 22 20 74 6f 20 6d 6f 64 69 66 79 0a 20 20 2a  n" to modify.  *
efd0: 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72  * the schema-ver
efe0: 73 69 6f 6e 20 69 73 20 70 6f 74 65 6e 74 69 61  sion is potentia
eff0: 6c 6c 79 20 64 61 6e 67 65 72 6f 75 73 20 61 6e  lly dangerous an
f000: 64 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 70 72  d may lead to pr
f010: 6f 67 72 61 6d 0a 20 20 2a 2a 20 63 72 61 73 68  ogram.  ** crash
f020: 65 73 20 6f 72 20 64 61 74 61 62 61 73 65 20 63  es or database c
f030: 6f 72 72 75 70 74 69 6f 6e 2e 20 55 73 65 20 77  orruption. Use w
f040: 69 74 68 20 63 61 75 74 69 6f 6e 21 0a 20 20 2a  ith caution!.  *
f050: 2a 0a 20 20 2a 2a 20 54 68 65 20 75 73 65 72 2d  *.  ** The user-
f060: 76 65 72 73 69 6f 6e 20 69 73 20 6e 6f 74 20 75  version is not u
f070: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
f080: 79 20 53 51 4c 69 74 65 2e 20 49 74 20 6d 61 79  y SQLite. It may
f090: 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a   be used by.  **
f0a0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 66 6f   applications fo
f0b0: 72 20 61 6e 79 20 70 75 72 70 6f 73 65 2e 0a 20  r any purpose.. 
f0c0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
f0d0: 79 70 5f 48 45 41 44 45 52 5f 56 41 4c 55 45 3a  yp_HEADER_VALUE:
f0e0: 20 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b   {.    int iCook
f0f0: 69 65 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41  ie = pPragma->iA
f100: 72 67 3b 20 20 2f 2a 20 57 68 69 63 68 20 63 6f  rg;  /* Which co
f110: 6f 6b 69 65 20 74 6f 20 72 65 61 64 20 6f 72 20  okie to read or 
f120: 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 73 71 6c  write */.    sql
f130: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
f140: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  e(v, iDb);.    i
f150: 66 28 20 7a 52 69 67 68 74 20 26 26 20 28 70 50  f( zRight && (pP
f160: 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
f170: 26 20 50 72 61 67 46 6c 67 5f 52 65 61 64 4f 6e  & PragFlg_ReadOn
f180: 6c 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ly)==0 ){.      
f190: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 70 65  /* Write the spe
f1a0: 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61  cified cookie va
f1b0: 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61  lue */.      sta
f1c0: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70  tic const VdbeOp
f1d0: 4c 69 73 74 20 73 65 74 43 6f 6f 6b 69 65 5b 5d  List setCookie[]
f1e0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f   = {.        { O
f1f0: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20  P_Transaction,  
f200: 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20    0,  1,  0},   
f210: 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20   /* 0 */.       
f220: 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c   { OP_SetCookie,
f230: 20 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 7d        0,  0,  0}
f240: 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20  ,    /* 1 */.   
f250: 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65     };.      Vdbe
f260: 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73  Op *aOp;.      s
f270: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
f280: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64  NoMallocRequired
f290: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65  (v, ArraySize(se
f2a0: 74 43 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20  tCookie));.     
f2b0: 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   aOp = sqlite3Vd
f2c0: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
f2d0: 72 72 61 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b  rraySize(setCook
f2e0: 69 65 29 2c 20 73 65 74 43 6f 6f 6b 69 65 2c 20  ie), setCookie, 
f2f0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e  0);.      if( ON
f300: 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54  LY_IF_REALLOC_ST
f310: 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62  RESS(aOp==0) ) b
f320: 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b  reak;.      aOp[
f330: 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20  0].p1 = iDb;.   
f340: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
f350: 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  Db;.      aOp[1]
f360: 2e 70 32 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20  .p2 = iCookie;. 
f370: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d       aOp[1].p3 =
f380: 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69   sqlite3Atoi(zRi
f390: 67 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ght);.    }else{
f3a0: 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74  .      /* Read t
f3b0: 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f  he specified coo
f3c0: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  kie value */.   
f3d0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f3e0: 56 64 62 65 4f 70 4c 69 73 74 20 72 65 61 64 43  VdbeOpList readC
f3f0: 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  ookie[] = {.    
f400: 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63      { OP_Transac
f410: 74 69 6f 6e 2c 20 20 20 20 20 30 2c 20 20 30 2c  tion,     0,  0,
f420: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f    0},    /* 0 */
f430: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  .        { OP_Re
f440: 61 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30  adCookie,      0
f450: 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a  ,  1,  0},    /*
f460: 20 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   1 */.        { 
f470: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20  OP_ResultRow,   
f480: 20 20 20 20 31 2c 20 20 31 2c 20 20 30 7d 0a 20      1,  1,  0}. 
f490: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64       };.      Vd
f4a0: 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20  beOp *aOp;.     
f4b0: 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
f4c0: 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72  fyNoMallocRequir
f4d0: 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  ed(v, ArraySize(
f4e0: 72 65 61 64 43 6f 6f 6b 69 65 29 29 3b 0a 20 20  readCookie));.  
f4f0: 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65      aOp = sqlite
f500: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
f510: 2c 20 41 72 72 61 79 53 69 7a 65 28 72 65 61 64  , ArraySize(read
f520: 43 6f 6f 6b 69 65 29 2c 72 65 61 64 43 6f 6f 6b  Cookie),readCook
f530: 69 65 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ie,0);.      if(
f540: 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43   ONLY_IF_REALLOC
f550: 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20  _STRESS(aOp==0) 
f560: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61  ) break;.      a
f570: 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[0].p1 = iDb;.
f580: 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20        aOp[1].p1 
f590: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70  = iDb;.      aOp
f5a0: 5b 31 5d 2e 70 33 20 3d 20 69 43 6f 6f 6b 69 65  [1].p3 = iCookie
f5b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f5c0: 64 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b 0a  dbeReusable(v);.
f5d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
f5e0: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
f5f0: 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f  ITE_OMIT_SCHEMA_
f600: 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53 20  VERSION_PRAGMAS 
f610: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
f620: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
f630: 50 54 49 4f 4e 5f 44 49 41 47 53 0a 20 20 2f 2a  PTION_DIAGS.  /*
f640: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 63  .  **   PRAGMA c
f650: 6f 6d 70 69 6c 65 5f 6f 70 74 69 6f 6e 73 0a 20  ompile_options. 
f660: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
f670: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
f680: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
f690: 74 69 6f 6e 73 20 75 73 65 64 20 69 6e 20 74 68  tions used in th
f6a0: 69 73 20 62 75 69 6c 64 2c 0a 20 20 2a 2a 20 6f  is build,.  ** o
f6b0: 6e 65 20 6f 70 74 69 6f 6e 20 70 65 72 20 72 6f  ne option per ro
f6c0: 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  w..  */.  case P
f6d0: 72 61 67 54 79 70 5f 43 4f 4d 50 49 4c 45 5f 4f  ragTyp_COMPILE_O
f6e0: 50 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 69 6e  PTIONS: {.    in
f6f0: 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  t i = 0;.    con
f700: 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20  st char *zOpt;. 
f710: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
f720: 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 1;.    while( 
f730: 28 7a 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 5f  (zOpt = sqlite3_
f740: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65  compileoption_ge
f750: 74 28 69 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20  t(i++))!=0 ){.  
f760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
f770: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20  oadString(v, 1, 
f780: 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  zOpt);.      sql
f790: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f7a0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
f7b0: 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
f7c0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75 73   sqlite3VdbeReus
f7d0: 61 62 6c 65 28 76 29 3b 0a 20 20 7d 0a 20 20 62  able(v);.  }.  b
f7e0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  reak;.#endif /* 
f7f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
f800: 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20  ILEOPTION_DIAGS 
f810: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
f820: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a  TE_OMIT_WAL.  /*
f830: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
f840: 73 63 68 65 6d 61 2e 5d 77 61 6c 5f 63 68 65 63  schema.]wal_chec
f850: 6b 70 6f 69 6e 74 20 3d 20 70 61 73 73 69 76 65  kpoint = passive
f860: 7c 66 75 6c 6c 7c 72 65 73 74 61 72 74 7c 74 72  |full|restart|tr
f870: 75 6e 63 61 74 65 0a 20 20 2a 2a 0a 20 20 2a 2a  uncate.  **.  **
f880: 20 43 68 65 63 6b 70 6f 69 6e 74 20 74 68 65 20   Checkpoint the 
f890: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
f8a0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 57 41   case PragTyp_WA
f8b0: 4c 5f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a  L_CHECKPOINT: {.
f8c0: 20 20 20 20 69 6e 74 20 69 42 74 20 3d 20 28 70      int iBt = (p
f8d0: 49 64 32 2d 3e 7a 3f 69 44 62 3a 53 51 4c 49 54  Id2->z?iDb:SQLIT
f8e0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 29 3b  E_MAX_ATTACHED);
f8f0: 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65 20 3d  .    int eMode =
f900: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
f910: 4e 54 5f 50 41 53 53 49 56 45 3b 0a 20 20 20 20  NT_PASSIVE;.    
f920: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
f930: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
f940: 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22  trICmp(zRight, "
f950: 66 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  full")==0 ){.   
f960: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c       eMode = SQL
f970: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
f980: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULL;.      }else
f990: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
f9a0: 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 72 65 73  Cmp(zRight, "res
f9b0: 74 61 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tart")==0 ){.   
f9c0: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c       eMode = SQL
f9d0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
f9e0: 45 53 54 41 52 54 3b 0a 20 20 20 20 20 20 7d 65  ESTART;.      }e
f9f0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
fa00: 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22  trICmp(zRight, "
fa10: 74 72 75 6e 63 61 74 65 22 29 3d 3d 30 20 29 7b  truncate")==0 ){
fa20: 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
fa30: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
fa40: 4e 54 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 20  NT_TRUNCATE;.   
fa50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
fa60: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b  Parse->nMem = 3;
fa70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fa80: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 68 65  AddOp3(v, OP_Che
fa90: 63 6b 70 6f 69 6e 74 2c 20 69 42 74 2c 20 65 4d  ckpoint, iBt, eM
faa0: 6f 64 65 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ode, 1);.    sql
fab0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fac0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
fad0: 31 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 62 72 65  1, 3);.  }.  bre
fae0: 61 6b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  ak;..  /*.  **  
faf0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f   PRAGMA wal_auto
fb00: 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 2a 2a 20  checkpoint.  ** 
fb10: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74    PRAGMA wal_aut
fb20: 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 4e 0a  ocheckpoint = N.
fb30: 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67    **.  ** Config
fb40: 75 72 65 20 61 20 64 61 74 61 62 61 73 65 20 63  ure a database c
fb50: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 75 74  onnection to aut
fb60: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b  omatically check
fb70: 70 6f 69 6e 74 20 61 20 64 61 74 61 62 61 73 65  point a database
fb80: 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 63 63 75  .  ** after accu
fb90: 6d 75 6c 61 74 69 6e 67 20 4e 20 66 72 61 6d 65  mulating N frame
fba0: 73 20 69 6e 20 74 68 65 20 6c 6f 67 2e 20 4f 72  s in the log. Or
fbb0: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
fbc0: 75 72 72 65 6e 74 20 76 61 6c 75 65 0a 20 20 2a  urrent value.  *
fbd0: 2a 20 6f 66 20 4e 2e 0a 20 20 2a 2f 0a 20 20 63  * of N..  */.  c
fbe0: 61 73 65 20 50 72 61 67 54 79 70 5f 57 41 4c 5f  ase PragTyp_WAL_
fbf0: 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 3a 20  AUTOCHECKPOINT: 
fc00: 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
fc10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fc20: 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
fc30: 6f 69 6e 74 28 64 62 2c 20 73 71 6c 69 74 65 33  oint(db, sqlite3
fc40: 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20  Atoi(zRight));. 
fc50: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
fc60: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 0a 20 20 20  ingleInt(v, .   
fc70: 20 20 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c      db->xWalCall
fc80: 62 61 63 6b 3d 3d 73 71 6c 69 74 65 33 57 61 6c  back==sqlite3Wal
fc90: 44 65 66 61 75 6c 74 48 6f 6f 6b 20 3f 20 0a 20  DefaultHook ? . 
fca0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
fcb0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 64 62 2d 3e  _PTR_TO_INT(db->
fcc0: 70 57 61 6c 41 72 67 29 20 3a 20 30 29 3b 0a 20  pWalArg) : 0);. 
fcd0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
fce0: 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  if..  /*.  **  P
fcf0: 52 41 47 4d 41 20 73 68 72 69 6e 6b 5f 6d 65 6d  RAGMA shrink_mem
fd00: 6f 72 79 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d  ory.  **.  ** IM
fd10: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
fd20: 20 52 2d 32 33 34 34 35 2d 34 36 31 30 39 20 54   R-23445-46109 T
fd30: 68 69 73 20 70 72 61 67 6d 61 20 63 61 75 73 65  his pragma cause
fd40: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
fd50: 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f   ** connection o
fd60: 6e 20 77 68 69 63 68 20 69 74 20 69 73 20 69 6e  n which it is in
fd70: 76 6f 6b 65 64 20 74 6f 20 66 72 65 65 20 75 70  voked to free up
fd80: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
fd90: 61 73 20 69 74 0a 20 20 2a 2a 20 63 61 6e 2c 20  as it.  ** can, 
fda0: 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
fdb0: 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
fdc0: 6d 6f 72 79 28 29 2e 0a 20 20 2a 2f 0a 20 20 63  mory()..  */.  c
fdd0: 61 73 65 20 50 72 61 67 54 79 70 5f 53 48 52 49  ase PragTyp_SHRI
fde0: 4e 4b 5f 4d 45 4d 4f 52 59 3a 20 7b 0a 20 20 20  NK_MEMORY: {.   
fdf0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65   sqlite3_db_rele
fe00: 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a  ase_memory(db);.
fe10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
fe20: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
fe30: 41 20 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20  A optimize.  ** 
fe40: 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a 65   PRAGMA optimize
fe50: 28 4d 41 53 4b 29 0a 20 20 2a 2a 20 20 50 52 41  (MASK).  **  PRA
fe60: 47 4d 41 20 73 63 68 65 6d 61 2e 6f 70 74 69 6d  GMA schema.optim
fe70: 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ize.  **  PRAGMA
fe80: 20 73 63 68 65 6d 61 2e 6f 70 74 69 6d 69 7a 65   schema.optimize
fe90: 28 4d 41 53 4b 29 0a 20 20 2a 2a 0a 20 20 2a 2a  (MASK).  **.  **
fea0: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69   Attempt to opti
feb0: 6d 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  mize the databas
fec0: 65 2e 20 20 41 6c 6c 20 73 63 68 65 6d 61 73 20  e.  All schemas 
fed0: 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e  are optimized in
fee0: 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
fef0: 74 77 6f 20 66 6f 72 6d 73 2c 20 61 6e 64 20 6f  two forms, and o
ff00: 6e 6c 79 20 74 68 65 20 73 70 65 63 69 66 69 65  nly the specifie
ff10: 64 20 73 63 68 65 6d 61 20 69 73 20 6f 70 74 69  d schema is opti
ff20: 6d 69 7a 65 64 20 69 6e 20 74 68 65 20 6c 61 74  mized in the lat
ff30: 74 65 72 20 74 77 6f 2e 0a 20 20 2a 2a 0a 20 20  ter two..  **.  
ff40: 2a 2a 20 54 68 65 20 64 65 74 61 69 6c 73 20 6f  ** The details o
ff50: 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  f optimizations 
ff60: 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
ff70: 73 20 70 72 61 67 6d 61 20 61 72 65 20 65 78 70  s pragma are exp
ff80: 65 63 74 65 64 0a 20 20 2a 2a 20 74 6f 20 63 68  ected.  ** to ch
ff90: 61 6e 67 65 20 61 6e 64 20 69 6d 70 72 6f 76 65  ange and improve
ffa0: 20 6f 76 65 72 20 74 69 6d 65 2e 20 20 41 70 70   over time.  App
ffb0: 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64  lications should
ffc0: 20 61 6e 74 69 63 69 70 61 74 65 20 74 68 61 74   anticipate that
ffd0: 0a 20 20 2a 2a 20 74 68 69 73 20 70 72 61 67 6d  .  ** this pragm
ffe0: 61 20 77 69 6c 6c 20 70 65 72 66 6f 72 6d 20 6e  a will perform n
fff0: 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ew optimizations
10000 20 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61   in future relea
10010 73 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ses..  **.  ** T
10020 68 65 20 6f 70 74 69 6f 6e 61 6c 20 61 72 67 75  he optional argu
10030 6d 65 6e 74 20 69 73 20 61 20 62 69 74 6d 61 73  ment is a bitmas
10040 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f  k of optimizatio
10050 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d 3a 0a 20  ns to perform:. 
10060 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30   **.  **    0x00
10070 30 31 20 20 20 20 44 65 62 75 67 67 69 6e 67 20  01    Debugging 
10080 6d 6f 64 65 2e 20 20 44 6f 20 6e 6f 74 20 61 63  mode.  Do not ac
10090 74 75 61 6c 6c 79 20 70 65 72 66 6f 72 6d 20 61  tually perform a
100a0 6e 79 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ny optimizations
100b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
100c0 20 20 20 62 75 74 20 69 6e 73 74 65 61 64 20 72     but instead r
100d0 65 74 75 72 6e 20 6f 6e 65 20 6c 69 6e 65 20 6f  eturn one line o
100e0 66 20 74 65 78 74 20 66 6f 72 20 65 61 63 68 20  f text for each 
100f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 2a  optimization.  *
10100 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
10110 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65 20 62  hat would have b
10120 65 65 6e 20 64 6f 6e 65 2e 20 20 4f 66 66 20 62  een done.  Off b
10130 79 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2a 0a  y default..  **.
10140 20 20 2a 2a 20 20 20 20 30 78 30 30 30 32 20 20    **    0x0002  
10150 20 20 52 75 6e 20 41 4e 41 4c 59 5a 45 20 6f 6e    Run ANALYZE on
10160 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   tables that mig
10170 68 74 20 62 65 6e 65 66 69 74 2e 20 20 4f 6e 20  ht benefit.  On 
10180 62 79 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2a  by default..  **
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65                Se
101a0 65 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69  e below for addi
101b0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
101c0 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  on..  **.  **   
101d0 20 30 78 30 30 30 34 20 20 20 20 28 4e 6f 74 20   0x0004    (Not 
101e0 79 65 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29  yet implemented)
101f0 20 52 65 63 6f 72 64 20 75 73 61 67 65 20 61 6e   Record usage an
10200 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 0a 20  d performance . 
10210 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
10220 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
10230 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  m the current se
10240 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 2a  ssion in the.  *
10250 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
10260 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 6f 20  atabase file so 
10270 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
10280 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 22 6f 70  available to "op
10290 74 69 6d 69 7a 65 22 0a 20 20 2a 2a 20 20 20 20  timize".  **    
102a0 20 20 20 20 20 20 20 20 20 20 70 72 61 67 6d 61            pragma
102b0 73 20 72 75 6e 20 62 79 20 66 75 74 75 72 65 20  s run by future 
102c0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
102d0 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ions..  **.  ** 
102e0 20 20 20 30 78 30 30 30 38 20 20 20 20 28 4e 6f     0x0008    (No
102f0 74 20 79 65 74 20 69 6d 70 6c 65 6d 65 6e 74 65  t yet implemente
10300 64 29 20 43 72 65 61 74 65 20 69 6e 64 65 78 65  d) Create indexe
10310 73 20 74 68 61 74 20 6d 69 67 68 74 20 68 61 76  s that might hav
10320 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  e.  **          
10330 20 20 20 20 62 65 65 6e 20 68 65 6c 70 66 75 6c      been helpful
10340 20 74 6f 20 72 65 63 65 6e 74 20 71 75 65 72 69   to recent queri
10350 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  es.  **.  ** The
10360 20 64 65 66 61 75 6c 74 20 4d 41 53 4b 20 69 73   default MASK is
10370 20 61 6e 64 20 61 6c 77 61 79 73 20 73 68 61 6c   and always shal
10380 6c 20 62 65 20 30 78 66 66 66 65 2e 20 20 30 78  l be 0xfffe.  0x
10390 66 66 66 65 20 6d 65 61 6e 73 20 70 65 72 66 6f  fffe means perfo
103a0 72 6d 20 61 6c 6c 0a 20 20 2a 2a 20 6f 66 20 74  rm all.  ** of t
103b0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  he optimizations
103c0 20 6c 69 73 74 65 64 20 61 62 6f 76 65 20 65 78   listed above ex
103d0 63 65 70 74 20 44 65 62 75 67 20 4d 6f 64 65 2c  cept Debug Mode,
103e0 20 69 6e 63 6c 75 64 69 6e 67 20 6e 65 77 0a 20   including new. 
103f0 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   ** optimization
10400 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 74 20  s that have not 
10410 79 65 74 20 62 65 65 6e 20 69 6e 76 65 6e 74 65  yet been invente
10420 64 2e 20 20 49 66 20 6e 65 77 20 6f 70 74 69 6d  d.  If new optim
10430 69 7a 61 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a  izations are.  *
10440 2a 20 65 76 65 72 20 61 64 64 65 64 20 74 68 61  * ever added tha
10450 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 66 66 20  t should be off 
10460 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68 6f 73  by default, thos
10470 65 20 6f 66 66 2d 62 79 2d 64 65 66 61 75 6c 74  e off-by-default
10480 20 0a 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74   .  ** optimizat
10490 69 6f 6e 73 20 77 69 6c 6c 20 68 61 76 65 20 62  ions will have b
104a0 69 74 6d 61 73 6b 73 20 6f 66 20 30 78 31 30 30  itmasks of 0x100
104b0 30 30 20 6f 72 20 6c 61 72 67 65 72 2e 0a 20 20  00 or larger..  
104c0 2a 2a 0a 20 20 2a 2a 20 44 45 54 45 52 4d 49 4e  **.  ** DETERMIN
104d0 41 54 49 4f 4e 20 4f 46 20 57 48 45 4e 20 54 4f  ATION OF WHEN TO
104e0 20 52 55 4e 20 41 4e 41 4c 59 5a 45 0a 20 20 2a   RUN ANALYZE.  *
104f0 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 63 75  *.  ** In the cu
10500 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
10510 74 69 6f 6e 2c 20 61 20 74 61 62 6c 65 20 69 73  tion, a table is
10520 20 61 6e 61 6c 79 7a 65 64 20 69 66 20 6f 6e 6c   analyzed if onl
10530 79 20 69 66 20 61 6c 6c 20 6f 66 0a 20 20 2a 2a  y if all of.  **
10540 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
10550 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  re true:.  **.  
10560 2a 2a 20 28 31 29 20 4d 41 53 4b 20 62 69 74 20  ** (1) MASK bit 
10570 30 78 30 32 20 69 73 20 73 65 74 2e 0a 20 20 2a  0x02 is set..  *
10580 2a 0a 20 20 2a 2a 20 28 32 29 20 54 68 65 20 71  *.  ** (2) The q
10590 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 75 73 65  uery planner use
105a0 64 20 73 71 6c 69 74 65 5f 73 74 61 74 31 2d 73  d sqlite_stat1-s
105b0 74 79 6c 65 20 73 74 61 74 69 73 74 69 63 73 20  tyle statistics 
105c0 66 6f 72 20 6f 6e 65 20 6f 72 0a 20 20 2a 2a 20  for one or.  ** 
105d0 20 20 20 20 6d 6f 72 65 20 69 6e 64 65 78 65 73      more indexes
105e0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 74   of the table at
105f0 20 73 6f 6d 65 20 70 6f 69 6e 74 20 64 75 72 69   some point duri
10600 6e 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  ng the lifetime 
10610 6f 66 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20  of.  **     the 
10620 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69  current connecti
10630 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 33  on..  **.  ** (3
10640 29 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e  ) One or more in
10650 64 65 78 65 73 20 6f 66 20 74 68 65 20 74 61 62  dexes of the tab
10660 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
10670 20 75 6e 61 6e 61 6c 79 7a 65 64 20 4f 52 0a 20   unanalyzed OR. 
10680 20 2a 2a 20 20 20 20 20 74 68 65 20 6e 75 6d 62   **     the numb
10690 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
106a0 65 20 74 61 62 6c 65 20 68 61 73 20 69 6e 63 72  e table has incr
106b0 65 61 73 65 64 20 62 79 20 32 35 20 74 69 6d 65  eased by 25 time
106c0 73 20 6f 72 20 6d 6f 72 65 0a 20 20 2a 2a 20 20  s or more.  **  
106d0 20 20 20 73 69 6e 63 65 20 74 68 65 20 6c 61 73     since the las
106e0 74 20 74 69 6d 65 20 41 4e 41 4c 59 5a 45 20 77  t time ANALYZE w
106f0 61 73 20 72 75 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  as run..  **.  *
10700 2a 20 54 68 65 20 72 75 6c 65 73 20 66 6f 72 20  * The rules for 
10710 77 68 65 6e 20 74 61 62 6c 65 73 20 61 72 65 20  when tables are 
10720 61 6e 61 6c 79 7a 65 64 20 61 72 65 20 6c 69 6b  analyzed are lik
10730 65 6c 79 20 74 6f 20 63 68 61 6e 67 65 20 69 6e  ely to change in
10740 0a 20 20 2a 2a 20 66 75 74 75 72 65 20 72 65 6c  .  ** future rel
10750 65 61 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  eases..  */.  ca
10760 73 65 20 50 72 61 67 54 79 70 5f 4f 50 54 49 4d  se PragTyp_OPTIM
10770 49 5a 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  IZE: {.    int i
10780 44 62 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  DbLast;         
10790 20 20 2f 2a 20 4c 6f 6f 70 20 74 65 72 6d 69 6e    /* Loop termin
107a0 61 74 69 6f 6e 20 70 6f 69 6e 74 20 66 6f 72 20  ation point for 
107b0 74 68 65 20 73 63 68 65 6d 61 20 6c 6f 6f 70 20  the schema loop 
107c0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 61 62 43  */.    int iTabC
107d0 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ur;           /*
107e0 20 43 75 72 73 6f 72 20 66 6f 72 20 61 20 74 61   Cursor for a ta
107f0 62 6c 65 20 77 68 6f 73 65 20 73 69 7a 65 20 6e  ble whose size n
10800 65 65 64 73 20 63 68 65 63 6b 69 6e 67 20 2a 2f  eeds checking */
10810 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  .    HashElem *k
10820 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
10830 6f 6f 70 20 6f 76 65 72 20 74 61 62 6c 65 73 20  oop over tables 
10840 6f 66 20 61 20 73 63 68 65 6d 61 20 2a 2f 0a 20  of a schema */. 
10850 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
10860 6d 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ma;       /* The
10870 20 63 75 72 72 65 6e 74 20 73 63 68 65 6d 61 20   current schema 
10880 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
10890 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab;           /*
108a0 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
108b0 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 49 6e  schema */.    In
108c0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
108d0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
108e0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
108f0 0a 20 20 20 20 4c 6f 67 45 73 74 20 73 7a 54 68  .    LogEst szTh
10900 72 65 73 68 6f 6c 64 3b 20 20 20 20 2f 2a 20 53  reshold;    /* S
10910 69 7a 65 20 74 68 72 65 73 68 6f 6c 64 20 61 62  ize threshold ab
10920 6f 76 65 20 77 68 69 63 68 20 72 65 61 6e 61 6c  ove which reanal
10930 79 73 69 73 20 69 73 20 6e 65 65 64 64 20 2a 2f  ysis is needd */
10940 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 75 62 53  .    char *zSubS
10950 71 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ql;         /* S
10960 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  QL statement for
10970 20 74 68 65 20 4f 50 5f 53 71 6c 45 78 65 63 20   the OP_SqlExec 
10980 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 75 33  opcode */.    u3
10990 32 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20  2 opMask;       
109a0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
109b0 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 70 65  operations to pe
109c0 72 66 6f 72 6d 20 2a 2f 0a 0a 20 20 20 20 69 66  rform */..    if
109d0 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
109e0 20 20 6f 70 4d 61 73 6b 20 3d 20 28 75 33 32 29    opMask = (u32)
109f0 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
10a00 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ht);.      if( (
10a10 6f 70 4d 61 73 6b 20 26 20 30 78 30 32 29 3d 3d  opMask & 0x02)==
10a20 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
10a30 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 70 4d 61  else{.      opMa
10a40 73 6b 20 3d 20 30 78 66 66 66 65 3b 0a 20 20 20  sk = 0xfffe;.   
10a50 20 7d 0a 20 20 20 20 69 54 61 62 43 75 72 20 3d   }.    iTabCur =
10a60 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
10a70 0a 20 20 20 20 66 6f 72 28 69 44 62 4c 61 73 74  .    for(iDbLast
10a80 20 3d 20 7a 44 62 3f 69 44 62 3a 64 62 2d 3e 6e   = zDb?iDb:db->n
10a90 44 62 2d 31 3b 20 69 44 62 3c 3d 69 44 62 4c 61  Db-1; iDb<=iDbLa
10aa0 73 74 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  st; iDb++){.    
10ab0 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 20 63    if( iDb==1 ) c
10ac0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73  ontinue;.      s
10ad0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
10ae0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
10af0 44 62 29 3b 0a 20 20 20 20 20 20 70 53 63 68 65  Db);.      pSche
10b00 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
10b10 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ].pSchema;.     
10b20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
10b30 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
10b40 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b 20 6b 3d  >tblHash); k; k=
10b50 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
10b60 29 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  )){.        pTab
10b70 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
10b80 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 0a 20  eHashData(k);.. 
10b90 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 61 62         /* If tab
10ba0 6c 65 20 70 54 61 62 20 68 61 73 20 6e 6f 74 20  le pTab has not 
10bb0 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20 77  been used in a w
10bc0 61 79 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65  ay that would be
10bd0 6e 65 66 69 74 20 66 72 6f 6d 0a 20 20 20 20 20  nefit from.     
10be0 20 20 20 2a 2a 20 68 61 76 69 6e 67 20 61 6e 61     ** having ana
10bf0 6c 79 73 69 73 20 73 74 61 74 69 73 74 69 63 73  lysis statistics
10c00 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
10c10 65 6e 74 20 73 65 73 73 69 6f 6e 2c 20 74 68 65  ent session, the
10c20 6e 20 73 6b 69 70 20 69 74 2e 0a 20 20 20 20 20  n skip it..     
10c30 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 73 6f 20     ** This also 
10c40 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
10c50 66 20 73 6b 69 70 70 69 6e 67 20 76 69 72 74 75  f skipping virtu
10c60 61 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 76 69  al tables and vi
10c70 65 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ews */.        i
10c80 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
10c90 67 73 20 26 20 54 46 5f 53 74 61 74 73 55 73 65  gs & TF_StatsUse
10ca0 64 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  d)==0 ) continue
10cb0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;..        /* Re
10cc0 61 6e 61 6c 79 7a 65 20 69 66 20 74 68 65 20 74  analyze if the t
10cd0 61 62 6c 65 20 69 73 20 32 35 20 74 69 6d 65 73  able is 25 times
10ce0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
10cf0 20 6c 61 73 74 20 61 6e 61 6c 79 73 69 73 20 2a   last analysis *
10d00 2f 0a 20 20 20 20 20 20 20 20 73 7a 54 68 72 65  /.        szThre
10d10 73 68 6f 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 52  shold = pTab->nR
10d20 6f 77 4c 6f 67 45 73 74 20 2b 20 34 36 3b 20 61  owLogEst + 46; a
10d30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4c 6f  ssert( sqlite3Lo
10d40 67 45 73 74 28 32 35 29 3d 3d 34 36 20 29 3b 0a  gEst(25)==46 );.
10d50 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
10d60 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
10d70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
10d80 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
10d90 20 20 69 66 28 20 21 70 49 64 78 2d 3e 68 61 73    if( !pIdx->has
10da0 53 74 61 74 31 20 29 7b 0a 20 20 20 20 20 20 20  Stat1 ){.       
10db0 20 20 20 20 20 73 7a 54 68 72 65 73 68 6f 6c 64       szThreshold
10dc0 20 3d 20 30 3b 20 2f 2a 20 41 6c 77 61 79 73 20   = 0; /* Always 
10dd0 61 6e 61 6c 79 7a 65 20 69 66 20 61 6e 79 20 69  analyze if any i
10de0 6e 64 65 78 20 6c 61 63 6b 73 20 73 74 61 74 69  ndex lacks stati
10df0 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 20 20 20  stics */.       
10e00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10e20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  }.        if( sz
10e30 54 68 72 65 73 68 6f 6c 64 20 29 7b 0a 20 20 20  Threshold ){.   
10e40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
10e50 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
10e60 69 54 61 62 43 75 72 2c 20 69 44 62 2c 20 70 54  iTabCur, iDb, pT
10e70 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
10e80 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10e90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10ea0 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 2c 20 69   OP_IfSmaller, i
10eb0 54 61 62 43 75 72 2c 20 0a 20 20 20 20 20 20 20  TabCur, .       
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
10ee0 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2b 28 6f  rentAddr(v)+2+(o
10ef0 70 4d 61 73 6b 26 31 29 2c 20 73 7a 54 68 72 65  pMask&1), szThre
10f00 73 68 6f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  shold);.        
10f10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
10f20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10f30 20 20 20 20 20 7a 53 75 62 53 71 6c 20 3d 20 73       zSubSql = s
10f40 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
10f50 2c 20 22 41 4e 41 4c 59 5a 45 20 5c 22 25 77 5c  , "ANALYZE \"%w\
10f60 22 2e 5c 22 25 77 5c 22 22 2c 0a 20 20 20 20 20  ".\"%w\"",.     
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
10f90 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
10fa0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  e, pTab->zName);
10fb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 70 4d  .        if( opM
10fc0 61 73 6b 20 26 20 30 78 30 31 20 29 7b 0a 20 20  ask & 0x01 ){.  
10fd0 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
10fe0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
10ff0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
11000 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11010 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
11020 72 69 6e 67 38 2c 20 30 2c 20 72 31 2c 20 30 2c  ring8, 0, r1, 0,
11030 20 7a 53 75 62 53 71 6c 2c 20 50 34 5f 44 59 4e   zSubSql, P4_DYN
11040 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  AMIC);.         
11050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11060 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
11070 6f 77 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  ow, r1, 1);.    
11080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11090 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
110a0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 71 6c  AddOp4(v, OP_Sql
110b0 45 78 65 63 2c 20 30 2c 20 30 2c 20 30 2c 20 7a  Exec, 0, 0, 0, z
110c0 53 75 62 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d  SubSql, P4_DYNAM
110d0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IC);.        }. 
110e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
110f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11100 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29  p0(v, OP_Expire)
11110 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
11120 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  ..  /*.  **   PR
11130 41 47 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f 75  AGMA busy_timeou
11140 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  t.  **   PRAGMA 
11150 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 3d 20 4e  busy_timeout = N
11160 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 61 6c 6c 20  .  **.  ** Call 
11170 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
11180 65 6f 75 74 28 64 62 2c 20 4e 29 2e 20 20 52 65  eout(db, N).  Re
11190 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
111a0 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 0a 20   timeout value. 
111b0 20 2a 2a 20 69 66 20 6f 6e 65 20 69 73 20 73 65   ** if one is se
111c0 74 2e 20 20 49 66 20 6e 6f 20 62 75 73 79 20 68  t.  If no busy h
111d0 61 6e 64 6c 65 72 20 6f 72 20 61 20 64 69 66 66  andler or a diff
111e0 65 72 65 6e 74 20 62 75 73 79 20 68 61 6e 64 6c  erent busy handl
111f0 65 72 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 74  er is set.  ** t
11200 68 65 6e 20 30 20 69 73 20 72 65 74 75 72 6e 65  hen 0 is returne
11210 64 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65 20  d.  Setting the 
11220 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 74 6f 20  busy_timeout to 
11230 30 20 6f 72 20 6e 65 67 61 74 69 76 65 0a 20 20  0 or negative.  
11240 2a 2a 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  ** disables the 
11250 74 69 6d 65 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20  timeout..  */.  
11260 2f 2a 63 61 73 65 20 50 72 61 67 54 79 70 5f 42  /*case PragTyp_B
11270 55 53 59 5f 54 49 4d 45 4f 55 54 2a 2f 20 64 65  USY_TIMEOUT*/ de
11280 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 61 73 73  fault: {.    ass
11290 65 72 74 28 20 70 50 72 61 67 6d 61 2d 3e 65 50  ert( pPragma->eP
112a0 72 61 67 54 79 70 3d 3d 50 72 61 67 54 79 70 5f  ragTyp==PragTyp_
112b0 42 55 53 59 5f 54 49 4d 45 4f 55 54 20 29 3b 0a  BUSY_TIMEOUT );.
112c0 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
112d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
112e0 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c  busy_timeout(db,
112f0 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69   sqlite3Atoi(zRi
11300 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ght));.    }.   
11310 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
11320 28 76 2c 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  (v, db->busyTime
11330 6f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  out);.    break;
11340 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
11350 20 20 50 52 41 47 4d 41 20 73 6f 66 74 5f 68 65    PRAGMA soft_he
11360 61 70 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 20  ap_limit.  **   
11370 50 52 41 47 4d 41 20 73 6f 66 74 5f 68 65 61 70  PRAGMA soft_heap
11380 5f 6c 69 6d 69 74 20 3d 20 4e 0a 20 20 2a 2a 0a  _limit = N.  **.
11390 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
113a0 49 4f 4e 2d 4f 46 3a 20 52 2d 32 36 33 34 33 2d  ION-OF: R-26343-
113b0 34 35 39 33 30 20 54 68 69 73 20 70 72 61 67 6d  45930 This pragm
113c0 61 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 20 20  a invokes the.  
113d0 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  ** sqlite3_soft_
113e0 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 29 20 69  heap_limit64() i
113f0 6e 74 65 72 66 61 63 65 20 77 69 74 68 20 74 68  nterface with th
11400 65 20 61 72 67 75 6d 65 6e 74 20 4e 2c 20 69 66  e argument N, if
11410 20 4e 20 69 73 0a 20 20 2a 2a 20 73 70 65 63 69   N is.  ** speci
11420 66 69 65 64 20 61 6e 64 20 69 73 20 61 20 6e 6f  fied and is a no
11430 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
11440 65 72 2e 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45  er..  ** IMPLEME
11450 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36 34  NTATION-OF: R-64
11460 34 35 31 2d 30 37 31 36 33 20 54 68 65 20 73 6f  451-07163 The so
11470 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 70 72  ft_heap_limit pr
11480 61 67 6d 61 20 61 6c 77 61 79 73 0a 20 20 2a 2a  agma always.  **
11490 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d   returns the sam
114a0 65 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 77  e integer that w
114b0 6f 75 6c 64 20 62 65 20 72 65 74 75 72 6e 65 64  ould be returned
114c0 20 62 79 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c   by the.  ** sql
114d0 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
114e0 69 6d 69 74 36 34 28 2d 31 29 20 43 2d 6c 61 6e  imit64(-1) C-lan
114f0 67 75 61 67 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  guage function..
11500 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
11510 54 79 70 5f 53 4f 46 54 5f 48 45 41 50 5f 4c 49  Typ_SOFT_HEAP_LI
11520 4d 49 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  MIT: {.    sqlit
11530 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20  e3_int64 N;.    
11540 69 66 28 20 7a 52 69 67 68 74 20 26 26 20 73 71  if( zRight && sq
11550 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
11560 36 34 28 7a 52 69 67 68 74 2c 20 26 4e 29 3d 3d  64(zRight, &N)==
11570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11580 20 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f     sqlite3_soft_
11590 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b  heap_limit64(N);
115a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
115b0 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71  nSingleInt(v, sq
115c0 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
115d0 6c 69 6d 69 74 36 34 28 2d 31 29 29 3b 0a 20 20  limit64(-1));.  
115e0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
115f0 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
11600 20 74 68 72 65 61 64 73 0a 20 20 2a 2a 20 20 20   threads.  **   
11610 50 52 41 47 4d 41 20 74 68 72 65 61 64 73 20 3d  PRAGMA threads =
11620 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e   N.  **.  ** Con
11630 66 69 67 75 72 65 20 74 68 65 20 6d 61 78 69 6d  figure the maxim
11640 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f 72  um number of wor
11650 6b 65 72 20 74 68 72 65 61 64 73 2e 20 20 52 65  ker threads.  Re
11660 74 75 72 6e 20 74 68 65 20 6e 65 77 0a 20 20 2a  turn the new.  *
11670 2a 20 6d 61 78 69 6d 75 6d 2c 20 77 68 69 63 68  * maximum, which
11680 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74   might be less t
11690 68 61 6e 20 72 65 71 75 65 73 74 65 64 2e 0a 20  han requested.. 
116a0 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
116b0 79 70 5f 54 48 52 45 41 44 53 3a 20 7b 0a 20 20  yp_THREADS: {.  
116c0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
116d0 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  N;.    if( zRigh
116e0 74 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  t.     && sqlite
116f0 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
11700 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49  Right, &N)==SQLI
11710 54 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20 4e 3e  TE_OK.     && N>
11720 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
11730 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62  sqlite3_limit(db
11740 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  , SQLITE_LIMIT_W
11750 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 20 28  ORKER_THREADS, (
11760 69 6e 74 29 28 4e 26 30 78 37 66 66 66 66 66 66  int)(N&0x7ffffff
11770 66 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  f));.    }.    r
11780 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
11790 2c 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  , sqlite3_limit(
117a0 64 62 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  db, SQLITE_LIMIT
117b0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c  _WORKER_THREADS,
117c0 20 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b   -1));.    break
117d0 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e  ;.  }..#if defin
117e0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
117f0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
11800 54 45 5f 54 45 53 54 29 0a 20 20 2f 2a 0a 20 20  TE_TEST).  /*.  
11810 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
11820 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 66  rrent state of f
11830 69 6c 65 20 6c 6f 67 73 20 66 6f 72 20 61 6c 6c  ile logs for all
11840 20 64 61 74 61 62 61 73 65 73 0a 20 20 2a 2f 0a   databases.  */.
11850 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4c    case PragTyp_L
11860 4f 43 4b 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20  OCK_STATUS: {.  
11870 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
11880 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 4c 6f 63  har *const azLoc
11890 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  kName[] = {.    
118a0 20 20 22 75 6e 6c 6f 63 6b 65 64 22 2c 20 22 73    "unlocked", "s
118b0 68 61 72 65 64 22 2c 20 22 72 65 73 65 72 76 65  hared", "reserve
118c0 64 22 2c 20 22 70 65 6e 64 69 6e 67 22 2c 20 22  d", "pending", "
118d0 65 78 63 6c 75 73 69 76 65 22 0a 20 20 20 20 7d  exclusive".    }
118e0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
118f0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
11900 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  2;.    for(i=0; 
11910 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
11920 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
11930 74 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  t;.      const c
11940 68 61 72 20 2a 7a 53 74 61 74 65 20 3d 20 22 75  har *zState = "u
11950 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 20 20 69  nknown";.      i
11960 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  nt j;.      if( 
11970 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
11980 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ame==0 ) continu
11990 65 3b 0a 20 20 20 20 20 20 70 42 74 20 3d 20 64  e;.      pBt = d
119a0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
119b0 20 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20       if( pBt==0 
119c0 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  || sqlite3BtreeP
119d0 61 67 65 72 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ager(pBt)==0 ){.
119e0 20 20 20 20 20 20 20 20 7a 53 74 61 74 65 20 3d          zState =
119f0 20 22 63 6c 6f 73 65 64 22 3b 0a 20 20 20 20 20   "closed";.     
11a00 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
11a10 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
11a20 64 62 2c 20 69 20 3f 20 64 62 2d 3e 61 44 62 5b  db, i ? db->aDb[
11a30 69 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 30 2c  i].zDbSName : 0,
11a40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a60 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 43         SQLITE_FC
11a70 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26  NTL_LOCKSTATE, &
11a80 6a 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  j)==SQLITE_OK ){
11a90 0a 20 20 20 20 20 20 20 20 20 7a 53 74 61 74 65  .         zState
11aa0 20 3d 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d   = azLockName[j]
11ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11ac0 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
11ad0 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 73 22 2c  Load(v, 1, "ss",
11ae0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53   db->aDb[i].zDbS
11af0 4e 61 6d 65 2c 20 7a 53 74 61 74 65 29 3b 0a 20  Name, zState);. 
11b00 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
11b10 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
11b20 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
11b30 44 45 43 0a 20 20 63 61 73 65 20 50 72 61 67 54  DEC.  case PragT
11b40 79 70 5f 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66  yp_KEY: {.    if
11b50 28 20 7a 52 69 67 68 74 20 29 20 73 71 6c 69 74  ( zRight ) sqlit
11b60 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  e3_key_v2(db, zD
11b70 62 2c 20 7a 52 69 67 68 74 2c 20 73 71 6c 69 74  b, zRight, sqlit
11b80 65 33 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68  e3Strlen30(zRigh
11b90 74 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  t));.    break;.
11ba0 20 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54    }.  case PragT
11bb0 79 70 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20  yp_REKEY: {.    
11bc0 69 66 28 20 7a 52 69 67 68 74 20 29 20 73 71 6c  if( zRight ) sql
11bd0 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28 64 62  ite3_rekey_v2(db
11be0 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c 20 73  , zDb, zRight, s
11bf0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11c00 52 69 67 68 74 29 29 3b 0a 20 20 20 20 62 72 65  Right));.    bre
11c10 61 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65 20 50  ak;.  }.  case P
11c20 72 61 67 54 79 70 5f 48 45 58 4b 45 59 3a 20 7b  ragTyp_HEXKEY: {
11c30 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
11c40 29 7b 0a 20 20 20 20 20 20 75 38 20 69 42 79 74  ){.      u8 iByt
11c50 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e;.      int i;.
11c60 20 20 20 20 20 20 63 68 61 72 20 7a 4b 65 79 5b        char zKey[
11c70 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  40];.      for(i
11c80 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73  =0, iByte=0; i<s
11c90 69 7a 65 6f 66 28 7a 4b 65 79 29 2a 32 20 26 26  izeof(zKey)*2 &&
11ca0 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74   sqlite3Isxdigit
11cb0 28 7a 52 69 67 68 74 5b 69 5d 29 3b 20 69 2b 2b  (zRight[i]); i++
11cc0 29 7b 0a 20 20 20 20 20 20 20 20 69 42 79 74 65  ){.        iByte
11cd0 20 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b 20   = (iByte<<4) + 
11ce0 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
11cf0 7a 52 69 67 68 74 5b 69 5d 29 3b 0a 20 20 20 20  zRight[i]);.    
11d00 20 20 20 20 69 66 28 20 28 69 26 31 29 21 3d 30      if( (i&1)!=0
11d10 20 29 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20 69   ) zKey[i/2] = i
11d20 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Byte;.      }.  
11d30 20 20 20 20 69 66 28 20 28 7a 4c 65 66 74 5b 33      if( (zLeft[3
11d40 5d 20 26 20 30 78 66 29 3d 3d 30 78 62 20 29 7b  ] & 0xf)==0xb ){
11d50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11d60 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  _key_v2(db, zDb,
11d70 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20   zKey, i/2);.   
11d80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11d90 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f    sqlite3_rekey_
11da0 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79  v2(db, zDb, zKey
11db0 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d 0a  , i/2);.      }.
11dc0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
11dd0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20  .  }.#endif.#if 
11de0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
11df0 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66  AS_CODEC) || def
11e00 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
11e10 4c 45 5f 43 45 52 4f 44 29 0a 20 20 63 61 73 65  LE_CEROD).  case
11e20 20 50 72 61 67 54 79 70 5f 41 43 54 49 56 41 54   PragTyp_ACTIVAT
11e30 45 5f 45 58 54 45 4e 53 49 4f 4e 53 3a 20 69 66  E_EXTENSIONS: if
11e40 28 20 7a 52 69 67 68 74 20 29 7b 0a 23 69 66 64  ( zRight ){.#ifd
11e50 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
11e60 44 45 43 0a 20 20 20 20 69 66 28 20 73 71 6c 69  DEC.    if( sqli
11e70 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67  te3StrNICmp(zRig
11e80 68 74 2c 20 22 73 65 65 2d 22 2c 20 34 29 3d 3d  ht, "see-", 4)==
11e90 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
11ea0 65 33 5f 61 63 74 69 76 61 74 65 5f 73 65 65 28  e3_activate_see(
11eb0 26 7a 52 69 67 68 74 5b 34 5d 29 3b 0a 20 20 20  &zRight[4]);.   
11ec0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
11ed0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
11ee0 45 52 4f 44 0a 20 20 20 20 69 66 28 20 73 71 6c  EROD.    if( sql
11ef0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69  ite3StrNICmp(zRi
11f00 67 68 74 2c 20 22 63 65 72 6f 64 2d 22 2c 20 36  ght, "cerod-", 6
11f10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
11f20 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f 63  lite3_activate_c
11f30 65 72 6f 64 28 26 7a 52 69 67 68 74 5b 36 5d 29  erod(&zRight[6])
11f40 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
11f50 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
11f60 69 66 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f  if..  } /* End o
11f70 66 20 74 68 65 20 50 52 41 47 4d 41 20 73 77 69  f the PRAGMA swi
11f80 74 63 68 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  tch */..  /* The
11f90 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
11fa0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
11fb0 73 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ss SQLITE_DEBUG 
11fc0 69 73 20 64 65 66 69 6e 65 64 2e 20 49 74 73 20  is defined. Its 
11fd0 6f 6e 6c 79 0a 20 20 2a 2a 20 70 75 72 70 6f 73  only.  ** purpos
11fe0 65 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  e is to execute 
11ff0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
12000 6e 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  nts to verify th
12010 61 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 50  at if the.  ** P
12020 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73  ragFlg_NoColumns
12030 31 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  1 flag is set an
12040 64 20 74 68 65 20 63 61 6c 6c 65 72 20 73 70 65  d the caller spe
12050 63 69 66 69 65 64 20 61 6e 20 61 72 67 75 6d 65  cified an argume
12060 6e 74 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 50  nt.  ** to the P
12070 52 41 47 4d 41 2c 20 74 68 65 20 69 6d 70 6c 65  RAGMA, the imple
12080 6d 65 6e 74 61 74 69 6f 6e 20 68 61 73 20 6e 6f  mentation has no
12090 74 20 61 64 64 65 64 20 61 6e 79 20 4f 50 5f 52  t added any OP_R
120a0 65 73 75 6c 74 52 6f 77 20 0a 20 20 2a 2a 20 69  esultRow .  ** i
120b0 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 6f 20 74  nstructions to t
120c0 68 65 20 56 4d 2e 20 20 2a 2f 0a 20 20 69 66 28  he VM.  */.  if(
120d0 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67   (pPragma->mPrag
120e0 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f  Flg & PragFlg_No
120f0 43 6f 6c 75 6d 6e 73 31 29 20 26 26 20 7a 52 69  Columns1) && zRi
12100 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
12110 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65  e3VdbeVerifyNoRe
12120 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 7d 0a  sultRow(v);.  }.
12130 0a 70 72 61 67 6d 61 5f 6f 75 74 3a 0a 20 20 73  .pragma_out:.  s
12140 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12150 20 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74   zLeft);.  sqlit
12160 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 52 69  e3DbFree(db, zRi
12170 67 68 74 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20  ght);.}.#ifndef 
12180 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12190 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a  UALTABLE./******
121a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121e0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65  *******.** Imple
121f0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20  mentation of an 
12200 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
12210 6c 20 74 61 62 6c 65 20 74 68 61 74 20 72 75 6e  l table that run
12220 73 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a  s a pragma..**.*
12230 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
12240 20 50 72 61 67 6d 61 56 74 61 62 20 50 72 61 67   PragmaVtab Prag
12250 6d 61 56 74 61 62 3b 0a 74 79 70 65 64 65 66 20  maVtab;.typedef 
12260 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61  struct PragmaVta
12270 62 43 75 72 73 6f 72 20 50 72 61 67 6d 61 56 74  bCursor PragmaVt
12280 61 62 43 75 72 73 6f 72 3b 0a 73 74 72 75 63 74  abCursor;.struct
12290 20 50 72 61 67 6d 61 56 74 61 62 20 7b 0a 20 20   PragmaVtab {.  
122a0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73  sqlite3_vtab bas
122b0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73  e;        /* Bas
122c0 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62  e class.  Must b
122d0 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c  e first */.  sql
122e0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
122f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
12300 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12310 6e 20 74 6f 20 77 68 69 63 68 20 69 74 20 62 65  n to which it be
12320 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  longs */.  const
12330 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 4e 61   PragmaName *pNa
12340 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me;  /* Name of 
12350 74 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 20 20  the pragma */.  
12360 75 38 20 6e 48 69 64 64 65 6e 3b 20 20 20 20 20  u8 nHidden;     
12370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12380 62 65 72 20 6f 66 20 68 69 64 64 65 6e 20 63 6f  ber of hidden co
12390 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 48  lumns */.  u8 iH
123a0 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20 20 20  idden;          
123b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
123c0 20 74 68 65 20 66 69 72 73 74 20 68 69 64 64 65   the first hidde
123d0 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73  n column */.};.s
123e0 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62  truct PragmaVtab
123f0 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74  Cursor {.  sqlit
12400 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
12410 61 73 65 3b 20 2f 2a 20 42 61 73 65 20 63 6c 61  ase; /* Base cla
12420 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72  ss.  Must be fir
12430 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
12440 73 74 6d 74 20 2a 70 50 72 61 67 6d 61 3b 20 20  stmt *pPragma;  
12450 20 20 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20    /* The pragma 
12460 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 75 6e  statement to run
12470 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74   */.  sqlite_int
12480 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20  64 iRowid;      
12490 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64  /* Current rowid
124a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 7a 41 72   */.  char *azAr
124b0 67 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  g[2];           
124c0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20  /* Value of the 
124d0 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 63 68  argument and sch
124e0 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ema */.};../* .*
124f0 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c  * Pragma virtual
12500 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43   table module xC
12510 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a  onnect method..*
12520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
12530 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74 28 0a  gmaVtabConnect(.
12540 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
12550 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69   void *pAux,.  i
12560 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
12570 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c  har *const*argv,
12580 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
12590 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72  **ppVtab,.  char
125a0 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 63 6f   **pzErr.){.  co
125b0 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a  nst PragmaName *
125c0 70 50 72 61 67 6d 61 20 3d 20 28 63 6f 6e 73 74  pPragma = (const
125d0 20 50 72 61 67 6d 61 4e 61 6d 65 2a 29 70 41 75   PragmaName*)pAu
125e0 78 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  x;.  PragmaVtab 
125f0 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 69 6e 74  *pTab = 0;.  int
12600 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   rc;.  int i, j;
12610 0a 20 20 63 68 61 72 20 63 53 65 70 20 3d 20 27  .  char cSep = '
12620 28 27 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61  (';.  StrAccum a
12630 63 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  cc;.  char zBuf[
12640 32 30 30 5d 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  200];..  UNUSED_
12650 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
12660 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12670 54 45 52 28 61 72 67 76 29 3b 0a 20 20 73 71 6c  TER(argv);.  sql
12680 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
12690 28 26 61 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20  (&acc, 0, zBuf, 
126a0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 30 29  sizeof(zBuf), 0)
126b0 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
126c0 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63  cumAppendAll(&ac
126d0 63 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  c, "CREATE TABLE
126e0 20 78 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   x");.  for(i=0,
126f0 20 6a 3d 70 50 72 61 67 6d 61 2d 3e 69 50 72 61   j=pPragma->iPra
12700 67 43 4e 61 6d 65 3b 20 69 3c 70 50 72 61 67 6d  gCName; i<pPragm
12710 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 3b 20 69  a->nPragCName; i
12720 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 71  ++, j++){.    sq
12730 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 61 63  lite3XPrintf(&ac
12740 63 2c 20 22 25 63 5c 22 25 73 5c 22 22 2c 20 63  c, "%c\"%s\"", c
12750 53 65 70 2c 20 70 72 61 67 43 4e 61 6d 65 5b 6a  Sep, pragCName[j
12760 5d 29 3b 0a 20 20 20 20 63 53 65 70 20 3d 20 27  ]);.    cSep = '
12770 2c 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d  ,';.  }.  if( i=
12780 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
12790 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22  3XPrintf(&acc, "
127a0 28 5c 22 25 73 5c 22 22 2c 20 70 50 72 61 67 6d  (\"%s\"", pPragm
127b0 61 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 63  a->zName);.    c
127c0 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 69  Sep = ',';.    i
127d0 2b 2b 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20 30 3b  ++;.  }.  j = 0;
127e0 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e  .  if( pPragma->
127f0 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
12800 6c 67 5f 52 65 73 75 6c 74 31 20 29 7b 0a 20 20  lg_Result1 ){.  
12810 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
12820 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c  mAppendAll(&acc,
12830 20 22 2c 61 72 67 20 48 49 44 44 45 4e 22 29 3b   ",arg HIDDEN");
12840 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
12850 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72  if( pPragma->mPr
12860 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c 67  agFlg & (PragFlg
12870 5f 53 63 68 65 6d 61 4f 70 74 7c 50 72 61 67 46  _SchemaOpt|PragF
12880 6c 67 5f 53 63 68 65 6d 61 52 65 71 29 20 29 7b  lg_SchemaReq) ){
12890 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
128a0 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61  ccumAppendAll(&a
128b0 63 63 2c 20 22 2c 73 63 68 65 6d 61 20 48 49 44  cc, ",schema HID
128c0 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  DEN");.    j++;.
128d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
128e0 41 63 63 75 6d 41 70 70 65 6e 64 28 26 61 63 63  AccumAppend(&acc
128f0 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 73 71 6c  , ")", 1);.  sql
12900 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
12910 73 68 28 26 61 63 63 29 3b 0a 20 20 61 73 73 65  sh(&acc);.  asse
12920 72 74 28 20 73 74 72 6c 65 6e 28 7a 42 75 66 29  rt( strlen(zBuf)
12930 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d   < sizeof(zBuf)-
12940 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 );.  rc = sqli
12950 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
12960 28 64 62 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66  (db, zBuf);.  if
12970 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12980 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 28 50  ){.    pTab = (P
12990 72 61 67 6d 61 56 74 61 62 2a 29 73 71 6c 69 74  ragmaVtab*)sqlit
129a0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
129b0 28 50 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20  (PragmaVtab));. 
129c0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
129d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
129e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
129f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
12a00 65 74 28 70 54 61 62 2c 20 30 2c 20 73 69 7a 65  et(pTab, 0, size
12a10 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29 29 3b  of(PragmaVtab));
12a20 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 4e 61  .      pTab->pNa
12a30 6d 65 20 3d 20 70 50 72 61 67 6d 61 3b 0a 20 20  me = pPragma;.  
12a40 20 20 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64      pTab->db = d
12a50 62 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  b;.      pTab->i
12a60 48 69 64 64 65 6e 20 3d 20 69 3b 0a 20 20 20 20  Hidden = i;.    
12a70 20 20 70 54 61 62 2d 3e 6e 48 69 64 64 65 6e 20    pTab->nHidden 
12a80 3d 20 6a 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = j;.    }.  }el
12a90 73 65 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d  se{.    *pzErr =
12aa0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
12ab0 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
12ac0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
12ad0 0a 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71  .  *ppVtab = (sq
12ae0 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 54 61 62  lite3_vtab*)pTab
12af0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12b00 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20  ../* .** Pragma 
12b10 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
12b20 64 75 6c 65 20 78 44 69 73 63 6f 6e 6e 65 63 74  dule xDisconnect
12b30 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
12b40 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
12b50 62 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69  bDisconnect(sqli
12b60 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
12b70 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a  {.  PragmaVtab *
12b80 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74  pTab = (PragmaVt
12b90 61 62 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c  ab*)pVtab;.  sql
12ba0 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 29 3b  ite3_free(pTab);
12bb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12bc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72  _OK;.}../* Figur
12bd0 65 20 6f 75 74 20 74 68 65 20 62 65 73 74 20 69  e out the best i
12be0 6e 64 65 78 20 74 6f 20 75 73 65 20 74 6f 20 73  ndex to use to s
12bf0 65 61 72 63 68 20 61 20 70 72 61 67 6d 61 20 76  earch a pragma v
12c00 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
12c10 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f  .** There are no
12c20 74 20 72 65 61 6c 6c 79 20 61 6e 79 20 69 6e 64  t really any ind
12c30 65 78 20 63 68 6f 69 63 65 73 2e 20 20 42 75 74  ex choices.  But
12c40 20 77 65 20 77 61 6e 74 20 74 6f 20 65 6e 63 6f   we want to enco
12c50 75 72 61 67 65 20 74 68 65 0a 2a 2a 20 71 75 65  urage the.** que
12c60 72 79 20 70 6c 61 6e 6e 65 72 20 74 6f 20 67 69  ry planner to gi
12c70 76 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  ve == constraint
12c80 73 20 6f 6e 20 61 73 20 6d 61 6e 79 20 68 69 64  s on as many hid
12c90 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61  den parameters a
12ca0 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 61  s.** possible, a
12cb0 6e 64 20 65 73 70 65 63 69 61 6c 6c 79 20 6f 6e  nd especially on
12cc0 20 74 68 65 20 66 69 72 73 74 20 68 69 64 64 65   the first hidde
12cd0 6e 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53 6f  n parameter.  So
12ce0 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 68 69 67   return a.** hig
12cf0 68 20 63 6f 73 74 20 69 66 20 68 69 64 64 65 6e  h cost if hidden
12d00 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
12d10 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2e 0a 2a  unconstrained..*
12d20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
12d30 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65 78  gmaVtabBestIndex
12d40 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74  (sqlite3_vtab *t
12d50 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
12d60 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
12d70 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  ){.  PragmaVtab 
12d80 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56  *pTab = (PragmaV
12d90 74 61 62 2a 29 74 61 62 3b 0a 20 20 63 6f 6e 73  tab*)tab;.  cons
12da0 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  t struct sqlite3
12db0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
12dc0 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  t *pConstraint;.
12dd0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
12de0 74 20 73 65 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49  t seen[2];..  pI
12df0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
12e00 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29  dCost = (double)
12e10 31 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 6e  1;.  if( pTab->n
12e20 48 69 64 64 65 6e 3d 3d 30 20 29 7b 20 72 65 74  Hidden==0 ){ ret
12e30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d  urn SQLITE_OK; }
12e40 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d  .  pConstraint =
12e50 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
12e60 74 72 61 69 6e 74 3b 0a 20 20 73 65 65 6e 5b 30  traint;.  seen[0
12e70 5d 20 3d 20 30 3b 0a 20 20 73 65 65 6e 5b 31 5d  ] = 0;.  seen[1]
12e80 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
12e90 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
12ea0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
12eb0 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20  Constraint++){. 
12ec0 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69     if( pConstrai
12ed0 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20  nt->usable==0 ) 
12ee0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
12ef0 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f  ( pConstraint->o
12f00 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p!=SQLITE_INDEX_
12f10 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 20  CONSTRAINT_EQ ) 
12f20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
12f30 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69  ( pConstraint->i
12f40 43 6f 6c 75 6d 6e 20 3c 20 70 54 61 62 2d 3e 69  Column < pTab->i
12f50 48 69 64 64 65 6e 20 29 20 63 6f 6e 74 69 6e 75  Hidden ) continu
12f60 65 3b 0a 20 20 20 20 6a 20 3d 20 70 43 6f 6e 73  e;.    j = pCons
12f70 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20  traint->iColumn 
12f80 2d 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 3b  - pTab->iHidden;
12f90 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 20 3c  .    assert( j <
12fa0 20 32 20 29 3b 0a 20 20 20 20 73 65 65 6e 5b 6a   2 );.    seen[j
12fb0 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 69  ] = i+1;.  }.  i
12fc0 66 28 20 73 65 65 6e 5b 30 5d 3d 3d 30 20 29 7b  f( seen[0]==0 ){
12fd0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
12fe0 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28  stimatedCost = (
12ff0 64 6f 75 62 6c 65 29 32 31 34 37 34 38 33 36 34  double)214748364
13000 37 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  7;.    pIdxInfo-
13010 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
13020 20 32 31 34 37 34 38 33 36 34 37 3b 0a 20 20 20   2147483647;.   
13030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13040 4b 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20 73 65 65  K;.  }.  j = see
13050 6e 5b 30 5d 2d 31 3b 0a 20 20 70 49 64 78 49 6e  n[0]-1;.  pIdxIn
13060 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
13070 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64 65  sage[j].argvInde
13080 78 20 3d 20 31 3b 0a 20 20 70 49 64 78 49 6e 66  x = 1;.  pIdxInf
13090 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
130a0 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b  age[j].omit = 1;
130b0 0a 20 20 69 66 28 20 73 65 65 6e 5b 31 5d 3d 3d  .  if( seen[1]==
130c0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
130d0 45 5f 4f 4b 3b 0a 20 20 70 49 64 78 49 6e 66 6f  E_OK;.  pIdxInfo
130e0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
130f0 3d 20 28 64 6f 75 62 6c 65 29 32 30 3b 0a 20 20  = (double)20;.  
13100 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
13110 74 65 64 52 6f 77 73 20 3d 20 32 30 3b 0a 20 20  tedRows = 20;.  
13120 6a 20 3d 20 73 65 65 6e 5b 31 5d 2d 31 3b 0a 20  j = seen[1]-1;. 
13130 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
13140 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61  traintUsage[j].a
13150 72 67 76 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20  rgvIndex = 2;.  
13160 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
13170 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d  raintUsage[j].om
13180 69 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  it = 1;.  return
13190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
131a0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
131b0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 70 72  ursor for the pr
131c0 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
131d0 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le */.static int
131e0 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e 28   pragmaVtabOpen(
131f0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
13200 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61  tab, sqlite3_vta
13210 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72  b_cursor **ppCur
13220 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  sor){.  PragmaVt
13230 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a  abCursor *pCsr;.
13240 20 20 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61    pCsr = (Pragma
13250 56 74 61 62 43 75 72 73 6f 72 2a 29 73 71 6c 69  VtabCursor*)sqli
13260 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
13270 66 28 2a 70 43 73 72 29 29 3b 0a 20 20 69 66 28  f(*pCsr));.  if(
13280 20 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72   pCsr==0 ) retur
13290 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
132a0 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20 30    memset(pCsr, 0
132b0 2c 20 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56  , sizeof(PragmaV
132c0 74 61 62 43 75 72 73 6f 72 29 29 3b 0a 20 20 70  tabCursor));.  p
132d0 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 20  Csr->base.pVtab 
132e0 3d 20 70 56 74 61 62 3b 0a 20 20 2a 70 70 43 75  = pVtab;.  *ppCu
132f0 72 73 6f 72 20 3d 20 26 70 43 73 72 2d 3e 62 61  rsor = &pCsr->ba
13300 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  se;.  return SQL
13310 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c  ITE_OK;.}../* Cl
13320 65 61 72 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20  ear all content 
13330 66 72 6f 6d 20 70 72 61 67 6d 61 20 76 69 72 74  from pragma virt
13340 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ual table cursor
13350 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
13360 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   pragmaVtabCurso
13370 72 43 6c 65 61 72 28 50 72 61 67 6d 61 56 74 61  rClear(PragmaVta
13380 62 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a  bCursor *pCsr){.
13390 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
133a0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72  e3_finalize(pCsr
133b0 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20 20 70 43  ->pPragma);.  pC
133c0 73 72 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b  sr->pPragma = 0;
133d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
133e0 72 61 79 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a  raySize(pCsr->az
133f0 41 72 67 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Arg); i++){.    
13400 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
13410 72 2d 3e 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  r->azArg[i]);.  
13420 20 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d    pCsr->azArg[i]
13430 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20   = 0;.  }.}../* 
13440 43 6c 6f 73 65 20 61 20 70 72 61 67 6d 61 20 76  Close a pragma v
13450 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72  irtual table cur
13460 73 6f 72 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sor */.static in
13470 74 20 70 72 61 67 6d 61 56 74 61 62 43 6c 6f 73  t pragmaVtabClos
13480 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  e(sqlite3_vtab_c
13490 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 50  ursor *cur){.  P
134a0 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20  ragmaVtabCursor 
134b0 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56  *pCsr = (PragmaV
134c0 74 61 62 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a  tabCursor*)cur;.
134d0 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73    pragmaVtabCurs
134e0 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20  orClear(pCsr);. 
134f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
13500 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  sr);.  return SQ
13510 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41  LITE_OK;.}../* A
13520 64 76 61 6e 63 65 20 74 68 65 20 70 72 61 67 6d  dvance the pragm
13530 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
13540 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
13550 78 74 20 72 6f 77 20 2a 2f 0a 73 74 61 74 69 63  xt row */.static
13560 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4e   int pragmaVtabN
13570 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ext(sqlite3_vtab
13580 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
13590 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56  rsor){.  PragmaV
135a0 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20  tabCursor *pCsr 
135b0 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  = (PragmaVtabCur
135c0 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72  sor*)pVtabCursor
135d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
135e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e  ITE_OK;..  /* In
135f0 63 72 65 6d 65 6e 74 20 74 68 65 20 78 52 6f 77  crement the xRow
13600 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 70 43  id value */.  pC
13610 73 72 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20  sr->iRowid++;.  
13620 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70 50  assert( pCsr->pP
13630 72 61 67 6d 61 20 29 3b 0a 20 20 69 66 28 20 53  ragma );.  if( S
13640 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74  QLITE_ROW!=sqlit
13650 65 33 5f 73 74 65 70 28 70 43 73 72 2d 3e 70 50  e3_step(pCsr->pP
13660 72 61 67 6d 61 29 20 29 7b 0a 20 20 20 20 72 63  ragma) ){.    rc
13670 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
13680 69 7a 65 28 70 43 73 72 2d 3e 70 50 72 61 67 6d  ize(pCsr->pPragm
13690 61 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 50  a);.    pCsr->pP
136a0 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70  ragma = 0;.    p
136b0 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43  ragmaVtabCursorC
136c0 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20 7d 0a  lear(pCsr);.  }.
136d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
136e0 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69  /* .** Pragma vi
136f0 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
13700 6c 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f  le xFilter metho
13710 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
13720 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65   pragmaVtabFilte
13730 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  r(.  sqlite3_vta
13740 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
13750 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64  ursor, .  int id
13760 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72  xNum, const char
13770 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20   *idxStr,.  int 
13780 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
13790 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
137a0 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
137b0 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61   *pCsr = (Pragma
137c0 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61  VtabCursor*)pVta
137d0 62 43 75 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d  bCursor;.  Pragm
137e0 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50  aVtab *pTab = (P
137f0 72 61 67 6d 61 56 74 61 62 2a 29 28 70 56 74 61  ragmaVtab*)(pVta
13800 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b  bCursor->pVtab);
13810 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
13820 20 69 2c 20 6a 3b 0a 20 20 53 74 72 41 63 63 75   i, j;.  StrAccu
13830 6d 20 61 63 63 3b 0a 20 20 63 68 61 72 20 2a 7a  m acc;.  char *z
13840 53 71 6c 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  Sql;..  UNUSED_P
13850 41 52 41 4d 45 54 45 52 28 69 64 78 4e 75 6d 29  ARAMETER(idxNum)
13860 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
13870 45 54 45 52 28 69 64 78 53 74 72 29 3b 0a 20 20  ETER(idxStr);.  
13880 70 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  pragmaVtabCursor
13890 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20 6a  Clear(pCsr);.  j
138a0 20 3d 20 28 70 54 61 62 2d 3e 70 4e 61 6d 65 2d   = (pTab->pName-
138b0 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
138c0 46 6c 67 5f 52 65 73 75 6c 74 31 29 21 3d 30 20  Flg_Result1)!=0 
138d0 3f 20 30 20 3a 20 31 3b 0a 20 20 66 6f 72 28 69  ? 0 : 1;.  for(i
138e0 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 2c  =0; i<argc; i++,
138f0 20 6a 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   j++){.    asser
13900 74 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 70  t( j<ArraySize(p
13910 43 73 72 2d 3e 61 7a 41 72 67 29 20 29 3b 0a 20  Csr->azArg) );. 
13920 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a     pCsr->azArg[j
13930 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ] = sqlite3_mpri
13940 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
13950 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
13960 76 5b 69 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  v[i]));.    if( 
13970 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d  pCsr->azArg[j]==
13980 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
13990 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
139a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
139b0 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
139c0 26 61 63 63 2c 20 30 2c 20 30 2c 20 30 2c 20 70  &acc, 0, 0, 0, p
139d0 54 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Tab->db->aLimit[
139e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
139f0 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 73 71 6c  _LENGTH]);.  sql
13a00 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
13a10 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 50 52 41  ndAll(&acc, "PRA
13a20 47 4d 41 20 22 29 3b 0a 20 20 69 66 28 20 70 43  GMA ");.  if( pC
13a30 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 20 29 7b 0a  sr->azArg[1] ){.
13a40 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
13a50 74 66 28 26 61 63 63 2c 20 22 25 51 2e 22 2c 20  tf(&acc, "%Q.", 
13a60 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 29 3b  pCsr->azArg[1]);
13a70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
13a80 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
13a90 26 61 63 63 2c 20 70 54 61 62 2d 3e 70 4e 61 6d  &acc, pTab->pNam
13aa0 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  e->zName);.  if(
13ab0 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 20   pCsr->azArg[0] 
13ac0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50  ){.    sqlite3XP
13ad0 72 69 6e 74 66 28 26 61 63 63 2c 20 22 3d 25 51  rintf(&acc, "=%Q
13ae0 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30  ", pCsr->azArg[0
13af0 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d  ]);.  }.  zSql =
13b00 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
13b10 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20  Finish(&acc);.  
13b20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65  if( zSql==0 ) re
13b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13b40 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  M;.  rc = sqlite
13b50 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 54 61  3_prepare_v2(pTa
13b60 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
13b70 20 26 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c   &pCsr->pPragma,
13b80 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
13b90 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28  ree(zSql);.  if(
13ba0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13bb0 7b 0a 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65  {.    pTab->base
13bc0 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  .zErrMsg = sqlit
13bd0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
13be0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
13bf0 70 54 61 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20  pTab->db));.    
13c00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
13c10 20 72 65 74 75 72 6e 20 70 72 61 67 6d 61 56 74   return pragmaVt
13c20 61 62 4e 65 78 74 28 70 56 74 61 62 43 75 72 73  abNext(pVtabCurs
13c30 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  or);.}../*.** Pr
13c40 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
13c50 6c 65 20 6d 6f 64 75 6c 65 20 78 45 6f 66 20 6d  le module xEof m
13c60 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
13c70 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 45   int pragmaVtabE
13c80 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  of(sqlite3_vtab_
13c90 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
13ca0 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  sor){.  PragmaVt
13cb0 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  abCursor *pCsr =
13cc0 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73   (PragmaVtabCurs
13cd0 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  or*)pVtabCursor;
13ce0 0a 20 20 72 65 74 75 72 6e 20 28 70 43 73 72 2d  .  return (pCsr-
13cf0 3e 70 50 72 61 67 6d 61 3d 3d 30 29 3b 0a 7d 0a  >pPragma==0);.}.
13d00 0a 2f 2a 20 54 68 65 20 78 43 6f 6c 75 6d 6e 20  ./* The xColumn 
13d10 6d 65 74 68 6f 64 20 73 69 6d 70 6c 79 20 72 65  method simply re
13d20 74 75 72 6e 73 20 74 68 65 20 63 6f 72 72 65 73  turns the corres
13d30 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 66  ponding column f
13d40 72 6f 6d 0a 2a 2a 20 74 68 65 20 50 52 41 47 4d  rom.** the PRAGM
13d50 41 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  A.  .*/.static i
13d60 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c  nt pragmaVtabCol
13d70 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  umn(.  sqlite3_v
13d80 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
13d90 62 43 75 72 73 6f 72 2c 20 0a 20 20 73 71 6c 69  bCursor, .  sqli
13da0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
13db0 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b 0a 20 20  , .  int i.){.  
13dc0 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13dd0 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61   *pCsr = (Pragma
13de0 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61  VtabCursor*)pVta
13df0 62 43 75 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d  bCursor;.  Pragm
13e00 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50  aVtab *pTab = (P
13e10 72 61 67 6d 61 56 74 61 62 2a 29 28 70 56 74 61  ragmaVtab*)(pVta
13e20 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b  bCursor->pVtab);
13e30 0a 20 20 69 66 28 20 69 3c 70 54 61 62 2d 3e 69  .  if( i<pTab->i
13e40 48 69 64 64 65 6e 20 29 7b 0a 20 20 20 20 73 71  Hidden ){.    sq
13e50 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
13e60 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f  ue(ctx, sqlite3_
13e70 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 73  column_value(pCs
13e80 72 2d 3e 70 50 72 61 67 6d 61 2c 20 69 29 29 3b  r->pPragma, i));
13e90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
13ea0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
13eb0 74 28 63 74 78 2c 20 70 43 73 72 2d 3e 61 7a 41  t(ctx, pCsr->azA
13ec0 72 67 5b 69 2d 70 54 61 62 2d 3e 69 48 69 64 64  rg[i-pTab->iHidd
13ed0 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52  en],-1,SQLITE_TR
13ee0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20  ANSIENT);.  }.  
13ef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13f00 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67  ;.}../* .** Prag
13f10 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
13f20 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69 64 20 6d   module xRowid m
13f30 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
13f40 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 52   int pragmaVtabR
13f50 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61  owid(sqlite3_vta
13f60 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
13f70 75 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e  ursor, sqlite_in
13f80 74 36 34 20 2a 70 29 7b 0a 20 20 50 72 61 67 6d  t64 *p){.  Pragm
13f90 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13fa0 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
13fb0 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
13fc0 6f 72 3b 0a 20 20 2a 70 20 3d 20 70 43 73 72 2d  or;.  *p = pCsr-
13fd0 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72  >iRowid;.  retur
13fe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13ff0 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 76 69  /* The pragma vi
14000 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65  rtual table obje
14010 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  ct */.static con
14020 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
14030 65 20 70 72 61 67 6d 61 56 74 61 62 4d 6f 64 75  e pragmaVtabModu
14040 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20  le = {.  0,     
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14060 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
14070 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2d      /* xCreate -
140a0 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
140b0 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43  */.  pragmaVtabC
140c0 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20  onnect,         
140d0 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20    /* xConnect - 
140e0 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e 20 65 78  connect to an ex
140f0 69 73 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  isting table */.
14100 20 20 70 72 61 67 6d 61 56 74 61 62 42 65 73 74    pragmaVtabBest
14110 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 2f  Index,         /
14120 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d 20 44  * xBestIndex - D
14130 65 74 65 72 6d 69 6e 65 20 73 65 61 72 63 68 20  etermine search 
14140 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 70 72  strategy */.  pr
14150 61 67 6d 61 56 74 61 62 44 69 73 63 6f 6e 6e 65  agmaVtabDisconne
14160 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ct,        /* xD
14170 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44 69 73 63  isconnect - Disc
14180 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61 20 74 61  onnect from a ta
14190 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ble */.  0,     
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141b0 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f        /* xDestro
141c0 79 20 2d 20 44 72 6f 70 20 61 20 74 61 62 6c 65  y - Drop a table
141d0 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
141e0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
141f0 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70     /* xOpen - op
14200 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  en a cursor */. 
14210 20 70 72 61 67 6d 61 56 74 61 62 43 6c 6f 73 65   pragmaVtabClose
14220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
14230 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20   xClose - close 
14240 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72  a cursor */.  pr
14250 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72 2c 20  agmaVtabFilter, 
14260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
14270 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
14280 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
14290 74 73 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  ts */.  pragmaVt
142a0 61 62 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20  abNext,         
142b0 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20       /* xNext - 
142c0 61 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72  advance a cursor
142d0 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
142e0 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Eof,            
142f0 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20     /* xEof */.  
14300 70 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e  pragmaVtabColumn
14310 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
14320 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64  xColumn - read d
14330 61 74 61 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  ata */.  pragmaV
14340 74 61 62 52 6f 77 69 64 2c 20 20 20 20 20 20 20  tabRowid,       
14350 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20        /* xRowid 
14360 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
14370 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14390 20 78 55 70 64 61 74 65 20 2d 20 77 72 69 74 65   xUpdate - write
143a0 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20   data */.  0,   
143b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143c0 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69          /* xBegi
143d0 6e 20 2d 20 62 65 67 69 6e 20 74 72 61 6e 73 61  n - begin transa
143e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
143f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14400 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
14410 20 2d 20 73 79 6e 63 20 74 72 61 6e 73 61 63 74   - sync transact
14420 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ion */.  0,     
14430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14440 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74        /* xCommit
14450 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61   - commit transa
14460 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
14470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14480 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
14490 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b 20  back - rollback 
144a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
144b0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
144c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
144d0 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 2d   xFindFunction -
144e0 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f   function overlo
144f0 61 64 69 6e 67 20 2a 2f 0a 20 20 30 2c 20 20 20  ading */.  0,   
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
14520 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74 68 65 20  me - rename the 
14530 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20  table */.  0,   
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14550 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61 76 65          /* xSave
14560 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20  point */.  0,   
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14580 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65          /* xRele
14590 61 73 65 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  ase */.  0      
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145b0 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61        /* xRollba
145c0 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ckTo */.};../*.*
145d0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
145e0 66 20 7a 54 61 62 4e 61 6d 65 20 69 73 20 72 65  f zTabName is re
145f0 61 6c 6c 79 20 74 68 65 20 6e 61 6d 65 20 6f 66  ally the name of
14600 20 61 20 70 72 61 67 6d 61 2e 20 20 49 66 20 69   a pragma.  If i
14610 74 20 69 73 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  t is,.** then re
14620 67 69 73 74 65 72 20 61 6e 20 65 70 6f 6e 79 6d  gister an eponym
14630 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ous virtual tabl
14640 65 20 66 6f 72 20 74 68 61 74 20 70 72 61 67 6d  e for that pragm
14650 61 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  a and return.** 
14660 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
14670 20 4d 6f 64 75 6c 65 20 6f 62 6a 65 63 74 20 66   Module object f
14680 6f 72 20 74 68 65 20 6e 65 77 20 76 69 72 74 75  or the new virtu
14690 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64  al table..*/.Mod
146a0 75 6c 65 20 2a 73 71 6c 69 74 65 33 50 72 61 67  ule *sqlite3Prag
146b0 6d 61 56 74 61 62 52 65 67 69 73 74 65 72 28 73  maVtabRegister(s
146c0 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
146d0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
146e0 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61    const PragmaNa
146f0 6d 65 20 2a 70 4e 61 6d 65 3b 0a 20 20 61 73 73  me *pName;.  ass
14700 65 72 74 28 20 73 71 6c 69 74 65 33 5f 73 74 72  ert( sqlite3_str
14710 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72  nicmp(zName, "pr
14720 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 3b  agma_", 7)==0 );
14730 0a 20 20 70 4e 61 6d 65 20 3d 20 70 72 61 67 6d  .  pName = pragm
14740 61 4c 6f 63 61 74 65 28 7a 4e 61 6d 65 2b 37 29  aLocate(zName+7)
14750 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30  ;.  if( pName==0
14760 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
14770 66 28 20 28 70 4e 61 6d 65 2d 3e 6d 50 72 61 67  f( (pName->mPrag
14780 46 6c 67 20 26 20 28 50 72 61 67 46 6c 67 5f 52  Flg & (PragFlg_R
14790 65 73 75 6c 74 30 7c 50 72 61 67 46 6c 67 5f 52  esult0|PragFlg_R
147a0 65 73 75 6c 74 31 29 29 3d 3d 30 20 29 20 72 65  esult1))==0 ) re
147b0 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
147c0 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  ( sqlite3HashFin
147d0 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20  d(&db->aModule, 
147e0 7a 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a 20 20 72  zName)==0 );.  r
147f0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 74 61  eturn sqlite3Vta
14800 62 43 72 65 61 74 65 4d 6f 64 75 6c 65 28 64 62  bCreateModule(db
14810 2c 20 7a 4e 61 6d 65 2c 20 26 70 72 61 67 6d 61  , zName, &pragma
14820 56 74 61 62 4d 6f 64 75 6c 65 2c 20 28 76 6f 69  VtabModule, (voi
14830 64 2a 29 70 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a  d*)pName, 0);.}.
14840 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
14850 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
14860 42 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  BLE */..#endif /
14870 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  * SQLITE_OMIT_PR
14880 41 47 4d 41 20 2a 2f 0a                          AGMA */.