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

Artifact 7f5272822ecdc6bb830b0192a06d37618a938ef499e480b5aa79b07c59c1f492:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 61  esult row with a
2400: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
2410: 20 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20   string held in 
2420: 72 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63  register 3.  Dec
2430: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c  rement the resul
2440: 74 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73  t count in regis
2450: 74 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c  ter 1.** and hal
2460: 74 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d  t if the maximum
2470: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
2480: 74 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  t rows have been
2490: 20 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74   issued..*/.stat
24a0: 69 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79  ic int integrity
24b0: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56  CheckResultRow(V
24c0: 64 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61  dbe *v){.  int a
24d0: 64 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ddr;.  sqlite3Vd
24e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
24f0: 65 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b  esultRow, 3, 1);
2500: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
2510: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2520: 50 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69  P_IfPos, 1, sqli
2530: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2540: 64 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56  dr(v)+2, 1);.  V
2550: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2570: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
2580: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
25a0: 20 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d   a pragma statem
25b0: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61  ent.  .**.** Pra
25c0: 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73  gmas are of this
25d0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
25e0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
25f0: 2e 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a  .]id [= value].*
2600: 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66  *.** The identif
2610: 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  ier might also b
2620: 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65  e a string.  The
2630: 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
2640: 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74  ng, and.** ident
2650: 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62  ifier, or a numb
2660: 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61  er.  If minusFla
2670: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
2680: 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  the value is.** 
2690: 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61  a number that wa
26a0: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
26b0: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
26c0: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69  * If the left si
26d0: 64 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e  de is "database.
26e0: 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73  id" then pId1 is
26f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
2700: 6d 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69  me.** and pId2 i
2710: 73 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68  s the id.  If th
2720: 65 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a  e left side is j
2730: 75 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49  ust "id" then pI
2740: 64 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20  d1 is the.** id 
2750: 61 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20  and pId2 is any 
2760: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f  empty string..*/
2770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61  .void sqlite3Pra
2780: 67 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gma(.  Parse *pP
2790: 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a  arse, .  Token *
27a0: 70 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20  pId1,        /* 
27b0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73  First part of [s
27c0: 63 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20  chema.]id field 
27d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32  */.  Token *pId2
27e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  ,        /* Seco
27f0: 6e 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65  nd part of [sche
2800: 6d 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72  ma.]id field, or
2810: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
2820: 20 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f   *pValue,      /
2830: 2a 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c  * Token for <val
2840: 75 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ue>, or NULL */.
2850: 20 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20    int minusFlag 
2860: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2870: 20 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63   a '-' sign prec
2880: 65 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a  eded <value> */.
2890: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74  ){.  char *zLeft
28a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
28b0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
28c0: 46 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20  F-8 string <id> 
28d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68  */.  char *zRigh
28e0: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  t = 0;      /* N
28f0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2900: 46 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75  F-8 string <valu
2910: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2920: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2930: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64   = 0;   /* The d
2940: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
2950: 20 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20    Token *pId;   
2960: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2970: 74 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65  ter to <id> toke
2980: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63  n */.  char *aFc
2990: 6e 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a  ntl[4];       /*
29a0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c   Argument to SQL
29b0: 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41  ITE_FCNTL_PRAGMA
29c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 44 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66  Database index f
29f0: 6f 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f  or <database> */
2a00: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 2f 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  /* return value 
2a30: 66 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54  form SQLITE_FCNT
2a40: 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71  L_PRAGMA */.  sq
2a50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2a60: 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68  se->db;    /* Th
2a70: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2a80: 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70  ction */.  Db *p
2a90: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
2ab0: 70 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65  pecific database
2ac0: 20 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20   being pragmaed 
2ad0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
2ae0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
2af0: 61 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61  arse);  /* Prepa
2b00: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
2b10: 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e  .  const PragmaN
2b20: 61 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20  ame *pPragma;   
2b30: 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f  /* The pragma */
2b40: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
2b50: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2b60: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
2b70: 76 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  v);.  pParse->nM
2b80: 65 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e  em = 2;..  /* In
2b90: 74 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68  terpret the [sch
2ba0: 65 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68  ema.] part of th
2bb0: 65 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  e pragma stateme
2bc0: 6e 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20  nt. iDb is the. 
2bd0: 20 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65   ** index of the
2be0: 20 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70   database this p
2bf0: 72 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61  ragma is being a
2c00: 70 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e  pplied to in db.
2c10: 61 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20  aDb[]. */.  iDb 
2c20: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
2c30: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64  Name(pParse, pId
2c40: 31 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a  1, pId2, &pId);.
2c50: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
2c60: 74 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64  turn;.  pDb = &d
2c70: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
2c80: 2f 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64  /* If the temp d
2c90: 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
2ca0: 20 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65   explicitly name
2cb0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2cc0: 20 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d   .  ** pragma, m
2cd0: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f  ake sure it is o
2ce0: 70 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  pen. .  */.  if(
2cf0: 20 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74   iDb==1 && sqlit
2d00: 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
2d10: 73 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  se(pParse) ){.  
2d20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2d30: 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   zLeft = sqlite3
2d40: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
2d50: 2c 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a  , pId);.  if( !z
2d60: 4c 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Left ) return;. 
2d70: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
2d80: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
2d90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2da0: 2c 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29  , "-%T", pValue)
2db0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2dc0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e  Right = sqlite3N
2dd0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2de0: 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20   pValue);.  }.. 
2df0: 20 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b   assert( pId2 );
2e00: 0a 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e  .  zDb = pId2->n
2e10: 3e 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61  >0 ? pDb->zDbSNa
2e20: 6d 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71  me : 0;.  if( sq
2e30: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
2e40: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52  Parse, SQLITE_PR
2e50: 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69  AGMA, zLeft, zRi
2e60: 67 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ght, zDb) ){.   
2e70: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
2e80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64  ;.  }..  /* Send
2e90: 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   an SQLITE_FCNTL
2ea0: 5f 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e  _PRAGMA file-con
2eb0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65  trol to the unde
2ec0: 72 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20  rlying VFS.  ** 
2ed0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20  connection.  If 
2ee0: 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
2ef0: 45 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d  E_OK, then assum
2f00: 65 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20  e that the VFS. 
2f10: 20 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20   ** handled the 
2f20: 70 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72  pragma and gener
2f30: 61 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70  ate a no-op prep
2f40: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
2f50: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
2f60: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31  ENTATION-OF: R-1
2f70: 32 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65  2238-55120 Whene
2f80: 76 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61  ver a PRAGMA sta
2f90: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
2fa0: 2c 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45  ,.  ** an SQLITE
2fb0: 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69  _FCNTL_PRAGMA fi
2fc0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65  le control is se
2fd0: 6e 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73  nt to the open s
2fe0: 71 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a  qlite3_file.  **
2ff0: 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
3000: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  nding to the dat
3010: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68  abase file to wh
3020: 69 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20  ich the pragma. 
3030: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
3040: 66 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fers..  **.  ** 
3050: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
3060: 46 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38  F: R-29875-31678
3070: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   The argument to
3080: 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
3090: 4c 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69  L_PRAGMA.  ** fi
30a0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e  le control is an
30b0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
30c0: 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63  rs to strings (c
30d0: 68 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20  har**) in which 
30e0: 74 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20  the.  ** second 
30f0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
3100: 72 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65  rray is the name
3110: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61   of the pragma a
3120: 6e 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a  nd the third.  *
3130: 2a 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65  * element is the
3140: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3150: 20 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20   pragma or NULL 
3160: 69 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61  if the pragma ha
3170: 73 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65  s no.  ** argume
3180: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74  nt..  */.  aFcnt
3190: 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e  l[0] = 0;.  aFcn
31a0: 74 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20  tl[1] = zLeft;. 
31b0: 20 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69   aFcntl[2] = zRi
31c0: 67 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d  ght;.  aFcntl[3]
31d0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
31e0: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
31f0: 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
3200: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
3210: 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46  b, zDb, SQLITE_F
3220: 43 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f  CNTL_PRAGMA, (vo
3230: 69 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69  id*)aFcntl);.  i
3240: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3250: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
3260: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
3270: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
3280: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
3290: 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 0, COLNAME_NAM
32a0: 45 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51  E, aFcntl[0], SQ
32b0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
32c0: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
32d0: 65 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b  eText(v, aFcntl[
32e0: 30 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0]);.    sqlite3
32f0: 5f 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29  _free(aFcntl[0])
3300: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d  ;.    goto pragm
3310: 61 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  a_out;.  }.  if(
3320: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
3330: 4f 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20  OUND ){.    if( 
3340: 61 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20  aFcntl[0] ){.   
3350: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3360: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
3370: 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20   aFcntl[0]);.   
3380: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3390: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
33a0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  }.    pParse->nE
33b0: 72 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65  rr++;.    pParse
33c0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67  ->rc = rc;.    g
33d0: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
33e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
33f0: 20 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74   the pragma in t
3400: 68 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20  he lookup table 
3410: 2a 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70  */.  pPragma = p
3420: 72 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66  ragmaLocate(zLef
3430: 74 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d  t);.  if( pPragm
3440: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67  a==0 ) goto prag
3450: 6d 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61  ma_out;..  /* Ma
3460: 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
3470: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c  base schema is l
3480: 6f 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61  oaded if the pra
3490: 67 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61  gma requires tha
34a0: 74 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61  t */.  if( (pPra
34b0: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
34c0: 50 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65  PragFlg_NeedSche
34d0: 6d 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ma)!=0 ){.    if
34e0: 28 20 49 73 53 68 61 72 65 64 53 63 68 65 6d 61  ( IsSharedSchema
34f0: 28 64 62 29 20 26 26 20 28 7a 44 62 20 7c 7c 20  (db) && (zDb || 
3500: 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46  (pPragma->mPragF
3510: 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4f 6e 65  lg & PragFlg_One
3520: 53 63 68 65 6d 61 29 29 20 29 7b 0a 20 20 20 20  Schema)) ){.    
3530: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
3540: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
3550: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
3560: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 53 63 68  >rc = sqlite3Sch
3570: 65 6d 61 4c 6f 61 64 28 64 62 2c 20 69 44 62 2c  emaLoad(db, iDb,
3580: 20 30 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72   0, &pParse->zEr
3590: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28  rMsg);.      if(
35a0: 20 70 50 61 72 73 65 2d 3e 72 63 20 29 20 67 6f   pParse->rc ) go
35b0: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
35c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35d0: 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53  if( sqlite3ReadS
35e0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
35f0: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
3600: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3610: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 72 65   Register the re
3620: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
3630: 73 20 66 6f 72 20 70 72 61 67 6d 61 73 20 74 68  s for pragmas th
3640: 61 74 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74  at return result
3650: 73 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61  s */.  if( (pPra
3660: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
3670: 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e  PragFlg_NoColumn
3680: 73 29 3d 3d 30 20 0a 20 20 20 26 26 20 28 28 70  s)==0 .   && ((p
3690: 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67  Pragma->mPragFlg
36a0: 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c   & PragFlg_NoCol
36b0: 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c 20 7a 52 69  umns1)==0 || zRi
36c0: 67 68 74 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  ght==0).  ){.   
36d0: 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74   setPragmaResult
36e0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70  ColumnNames(v, p
36f0: 50 72 61 67 6d 61 29 3b 0a 20 20 7d 0a 0a 20 20  Pragma);.  }..  
3700: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 61  /* Jump to the a
3710: 70 70 72 6f 70 72 69 61 74 65 20 70 72 61 67 6d  ppropriate pragm
3720: 61 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 73  a handler */.  s
3730: 77 69 74 63 68 28 20 70 50 72 61 67 6d 61 2d 3e  witch( pPragma->
3740: 65 50 72 61 67 54 79 70 20 29 7b 0a 20 20 0a 23  ePragTyp ){.  .#
3750: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
3760: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
3770: 41 47 4d 41 53 29 20 26 26 20 21 64 65 66 69 6e  AGMAS) && !defin
3780: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
3790: 45 50 52 45 43 41 54 45 44 29 0a 20 20 2f 2a 0a  EPRECATED).  /*.
37a0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
37b0: 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61  hema.]default_ca
37c0: 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50  che_size.  **  P
37d0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64  RAGMA [schema.]d
37e0: 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a  efault_cache_siz
37f0: 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e=N.  **.  ** Th
3800: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70  e first form rep
3810: 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  orts the current
3820: 20 70 65 72 73 69 73 74 65 6e 74 20 73 65 74 74   persistent sett
3830: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
3840: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
3850: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  .  The value ret
3860: 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78  urned is the max
3870: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
3880: 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65   ** pages in the
3890: 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 54 68   page cache.  Th
38a0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
38b0: 74 73 20 62 6f 74 68 20 74 68 65 20 63 75 72 72  ts both the curr
38c0: 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  ent.  ** page ca
38d0: 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 20 61  che size value a
38e0: 6e 64 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  nd the persisten
38f0: 74 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  t page cache siz
3900: 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74 6f  e value.  ** sto
3910: 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
3920: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20  ase file..  **. 
3930: 20 2a 2a 20 4f 6c 64 65 72 20 76 65 72 73 69 6f   ** Older versio
3940: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 6f 75  ns of SQLite wou
3950: 6c 64 20 73 65 74 20 74 68 65 20 64 65 66 61 75  ld set the defau
3960: 6c 74 20 63 61 63 68 65 20 73 69 7a 65 20 74 6f  lt cache size to
3970: 20 61 0a 20 20 2a 2a 20 6e 65 67 61 74 69 76 65   a.  ** negative
3980: 20 6e 75 6d 62 65 72 20 74 6f 20 69 6e 64 69 63   number to indic
3990: 61 74 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ate synchronous=
39a0: 4f 46 46 2e 20 20 54 68 65 73 65 20 64 61 79 73  OFF.  These days
39b0: 2c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  , synchronous.  
39c0: 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 20  ** is always on 
39d0: 62 79 20 64 65 66 61 75 6c 74 20 72 65 67 61 72  by default regar
39e0: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73 69 67  dless of the sig
39f0: 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  n of the default
3a00: 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65   cache.  ** size
3a10: 2e 20 20 42 75 74 20 63 6f 6e 74 69 6e 75 65 20  .  But continue 
3a20: 74 6f 20 74 61 6b 65 20 74 68 65 20 61 62 73 6f  to take the abso
3a30: 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68  lute value of th
3a40: 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a  e default cache.
3a50: 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 68 69 73    ** size of his
3a60: 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62  torical compatib
3a70: 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a 20 20 63 61  ility..  */.  ca
3a80: 73 65 20 50 72 61 67 54 79 70 5f 44 45 46 41 55  se PragTyp_DEFAU
3a90: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b  LT_CACHE_SIZE: {
3aa0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
3ab0: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
3ac0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
3ad0: 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  );.    static co
3ae0: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 67  nst VdbeOpList g
3af0: 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20  etCacheSize[] = 
3b00: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61  {.      { OP_Tra
3b10: 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  nsaction, 0, 0, 
3b20: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 20 20         0},      
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20     /* 0 */.     
3b50: 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65   { OP_ReadCookie
3b60: 2c 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20  ,  0, 1,        
3b70: 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41  BTREE_DEFAULT_CA
3b80: 43 48 45 5f 53 49 5a 45 7d 2c 20 20 2f 2a 20 31  CHE_SIZE},  /* 1
3b90: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49   */.      { OP_I
3ba0: 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38  fPos,       1, 8
3bb0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3bc0: 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
3bd0: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
3be0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
3bf0: 5f 53 75 62 74 72 61 63 74 2c 20 20 20 20 31 2c  _Subtract,    1,
3c00: 20 32 2c 20 20 20 20 20 20 20 20 31 7d 2c 0a 20   2,        1},. 
3c10: 20 20 20 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c       { OP_IfPos,
3c20: 20 20 20 20 20 20 20 31 2c 20 38 2c 20 20 20 20         1, 8,    
3c30: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
3c40: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20  OP_Integer,     
3c50: 30 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 1,        0},
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 36 20 2a 2f           /* 6 */
3c80: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 6f 6f 70  .      { OP_Noop
3c90: 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20  ,        0, 0,  
3ca0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3cb0: 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  { OP_ResultRow, 
3cc0: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30    1, 1,        0
3cd0: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64  },.    };.    Vd
3ce0: 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 73  beOp *aOp;.    s
3cf0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
3d00: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
3d10: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
3d20: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
3d30: 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 73  em += 2;.      s
3d40: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
3d50: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64  NoMallocRequired
3d60: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65  (v, ArraySize(ge
3d70: 74 43 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  tCacheSize));.  
3d80: 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65      aOp = sqlite
3d90: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
3da0: 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 43  , ArraySize(getC
3db0: 61 63 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61  acheSize), getCa
3dc0: 63 68 65 53 69 7a 65 2c 20 69 4c 6e 29 3b 0a 20  cheSize, iLn);. 
3dd0: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
3de0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
3df0: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
3e00: 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31  .      aOp[0].p1
3e10: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
3e20: 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[1].p1 = iDb;. 
3e30: 20 20 20 20 20 61 4f 70 5b 36 5d 2e 70 31 20 3d       aOp[6].p1 =
3e40: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
3e50: 43 41 43 48 45 5f 53 49 5a 45 3b 0a 20 20 20 20  CACHE_SIZE;.    
3e60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
3e70: 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41   size = sqlite3A
3e80: 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41  bsInt32(sqlite3A
3e90: 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20  toi(zRight));.  
3ea0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
3eb0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
3ec0: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
3ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3ee0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
3ef0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
3f00: 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  REE_DEFAULT_CACH
3f10: 45 5f 53 49 5a 45 2c 20 73 69 7a 65 29 3b 0a 20  E_SIZE, size);. 
3f20: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
3f30: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
3f40: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
3f50: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 53  );.      pDb->pS
3f60: 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a  chema->cache_siz
3f70: 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e = size;.      
3f80: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
3f90: 61 63 68 65 53 69 7a 65 28 70 44 62 2d 3e 70 42  acheSize(pDb->pB
3fa0: 74 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t, pDb->pSchema-
3fb0: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
3fc0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
3fd0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51   }.#endif /* !SQ
3fe0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
3ff0: 50 52 41 47 4d 41 53 20 26 26 20 21 53 51 4c 49  PRAGMAS && !SQLI
4000: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
4010: 45 44 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ED */..#if !defi
4020: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4030: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 0a 20  PAGER_PRAGMAS). 
4040: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
4050: 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f 73   [schema.]page_s
4060: 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ize.  **  PRAGMA
4070: 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f 73   [schema.]page_s
4080: 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ize=N.  **.  ** 
4090: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
40a0: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
40b0: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
40c0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
40d0: 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 62 79   page size in by
40e0: 74 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  tes.  The second
40f0: 20 66 6f 72 6d 20 73 65 74 73 20 74 68 65 0a 20   form sets the. 
4100: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
4110: 65 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 54  e size value.  T
4120: 68 65 20 76 61 6c 75 65 20 63 61 6e 20 6f 6e 6c  he value can onl
4130: 79 20 62 65 20 73 65 74 20 69 66 0a 20 20 2a 2a  y be set if.  **
4140: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
4150: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  s not yet been c
4160: 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  reated..  */.  c
4170: 61 73 65 20 50 72 61 67 54 79 70 5f 50 41 47 45  ase PragTyp_PAGE
4180: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 42 74 72  _SIZE: {.    Btr
4190: 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70  ee *pBt = pDb->p
41a0: 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
41b0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  pBt!=0 );.    if
41c0: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
41d0: 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 41 4c     int size = AL
41e0: 57 41 59 53 28 70 42 74 29 20 3f 20 73 71 6c 69  WAYS(pBt) ? sqli
41f0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
4200: 69 7a 65 28 70 42 74 29 20 3a 20 30 3b 0a 20 20  ize(pBt) : 0;.  
4210: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
4220: 49 6e 74 28 76 2c 20 73 69 7a 65 29 3b 0a 20 20  Int(v, size);.  
4230: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
4240: 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79 20 66 61 69  * Malloc may fai
4250: 6c 20 77 68 65 6e 20 73 65 74 74 69 6e 67 20 74  l when setting t
4260: 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 73  he page-size, as
4270: 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 74   there is an int
4280: 65 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 62  ernal.      ** b
4290: 75 66 66 65 72 20 74 68 61 74 20 74 68 65 20 70  uffer that the p
42a0: 61 67 65 72 20 6d 6f 64 75 6c 65 20 72 65 73 69  ager module resi
42b0: 7a 65 73 20 75 73 69 6e 67 20 73 71 6c 69 74 65  zes using sqlite
42c0: 33 5f 72 65 61 6c 6c 6f 63 28 29 2e 0a 20 20 20  3_realloc()..   
42d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e     */.      db->
42e0: 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 73  nextPagesize = s
42f0: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
4300: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  t);.      if( SQ
4310: 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
4320: 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
4330: 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
4340: 74 50 61 67 65 73 69 7a 65 2c 2d 31 2c 30 29 20  tPagesize,-1,0) 
4350: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4360: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
4370: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4380: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
4390: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
43a0: 5b 73 63 68 65 6d 61 2e 5d 73 65 63 75 72 65 5f  [schema.]secure_
43b0: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 20 50 52 41  delete.  **  PRA
43c0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63  GMA [schema.]sec
43d0: 75 72 65 5f 64 65 6c 65 74 65 3d 4f 4e 2f 4f 46  ure_delete=ON/OF
43e0: 46 2f 46 41 53 54 0a 20 20 2a 2a 0a 20 20 2a 2a  F/FAST.  **.  **
43f0: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
4400: 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72  reports the curr
4410: 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ent setting for 
4420: 74 68 65 0a 20 20 2a 2a 20 73 65 63 75 72 65 5f  the.  ** secure_
4430: 64 65 6c 65 74 65 20 66 6c 61 67 2e 20 20 54 68  delete flag.  Th
4440: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 68  e second form ch
4450: 61 6e 67 65 73 20 74 68 65 20 73 65 63 75 72 65  anges the secure
4460: 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 66 6c 61  _delete.  ** fla
4470: 67 20 73 65 74 74 69 6e 67 20 61 6e 64 20 72 65  g setting and re
4480: 70 6f 72 74 73 20 74 68 65 20 6e 65 77 20 76 61  ports the new va
4490: 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  lue..  */.  case
44a0: 20 50 72 61 67 54 79 70 5f 53 45 43 55 52 45 5f   PragTyp_SECURE_
44b0: 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20 42 74  DELETE: {.    Bt
44c0: 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e  ree *pBt = pDb->
44d0: 70 42 74 3b 0a 20 20 20 20 69 6e 74 20 62 20 3d  pBt;.    int b =
44e0: 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
44f0: 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69   pBt!=0 );.    i
4500: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
4510: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
4520: 74 72 69 63 6d 70 28 7a 52 69 67 68 74 2c 20 22  tricmp(zRight, "
4530: 66 61 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  fast")==0 ){.   
4540: 20 20 20 20 20 62 20 3d 20 32 3b 0a 20 20 20 20       b = 2;.    
4550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4560: 20 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 42   b = sqlite3GetB
4570: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
4580: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4590: 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e  .    if( pId2->n
45a0: 3d 3d 30 20 26 26 20 62 3e 3d 30 20 29 7b 0a 20  ==0 && b>=0 ){. 
45b0: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
45c0: 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
45d0: 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a  db->nDb; ii++){.
45e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
45f0: 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
4600: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4610: 2c 20 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , b);.      }.  
4620: 20 20 7d 0a 20 20 20 20 62 20 3d 20 73 71 6c 69    }.    b = sqli
4630: 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
4640: 6c 65 74 65 28 70 42 74 2c 20 62 29 3b 0a 20 20  lete(pBt, b);.  
4650: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
4660: 74 28 76 2c 20 62 29 3b 0a 20 20 20 20 62 72 65  t(v, b);.    bre
4670: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
4680: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4690: 6d 61 2e 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75  ma.]max_page_cou
46a0: 6e 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  nt.  **  PRAGMA 
46b0: 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61 67  [schema.]max_pag
46c0: 65 5f 63 6f 75 6e 74 3d 4e 0a 20 20 2a 2a 0a 20  e_count=N.  **. 
46d0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
46e0: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
46f0: 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66  urrent setting f
4700: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 78 69  or the.  ** maxi
4710: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
4720: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
4730: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 0a  ase file.  The .
4740: 20 20 2a 2a 20 73 65 63 6f 6e 64 20 66 6f 72 6d    ** second form
4750: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 68 61   attempts to cha
4760: 6e 67 65 20 74 68 69 73 20 73 65 74 74 69 6e 67  nge this setting
4770: 2e 20 20 42 6f 74 68 0a 20 20 2a 2a 20 66 6f 72  .  Both.  ** for
4780: 6d 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  ms return the cu
4790: 72 72 65 6e 74 20 73 65 74 74 69 6e 67 2e 0a 20  rrent setting.. 
47a0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 62 73   **.  ** The abs
47b0: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 4e  olute value of N
47c0: 20 69 73 20 75 73 65 64 2e 20 20 54 68 69 73 20   is used.  This 
47d0: 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20  is undocumented 
47e0: 61 6e 64 20 6d 69 67 68 74 0a 20 20 2a 2a 20 63  and might.  ** c
47f0: 68 61 6e 67 65 2e 20 20 54 68 65 20 6f 6e 6c 79  hange.  The only
4800: 20 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20 70   purpose is to p
4810: 72 6f 76 69 64 65 20 61 6e 20 65 61 73 79 20 77  rovide an easy w
4820: 61 79 20 74 6f 20 74 65 73 74 0a 20 20 2a 2a 20  ay to test.  ** 
4830: 74 68 65 20 73 71 6c 69 74 65 33 41 62 73 49 6e  the sqlite3AbsIn
4840: 74 33 32 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  t32() function..
4850: 20 20 2a 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    **.  **  PRAGM
4860: 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f  A [schema.]page_
4870: 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  count.  **.  ** 
4880: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
4890: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
48a0: 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61  e specified data
48b0: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
48c0: 65 20 50 72 61 67 54 79 70 5f 50 41 47 45 5f 43  e PragTyp_PAGE_C
48d0: 4f 55 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  OUNT: {.    int 
48e0: 69 52 65 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  iReg;.    sqlite
48f0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
4900: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
4910: 20 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50 61      iReg = ++pPa
4920: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
4930: 66 28 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65  f( sqlite3Tolowe
4940: 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 70 27  r(zLeft[0])=='p'
4950: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4960: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4970: 50 5f 50 61 67 65 63 6f 75 6e 74 2c 20 69 44 62  P_Pagecount, iDb
4980: 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c  , iReg);.    }el
4990: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
49a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
49b0: 50 5f 4d 61 78 50 67 63 6e 74 2c 20 69 44 62 2c  P_MaxPgcnt, iDb,
49c0: 20 69 52 65 67 2c 20 0a 20 20 20 20 20 20 20 20   iReg, .        
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49e0: 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
49f0: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
4a00: 68 74 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ht)));.    }.   
4a10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4a20: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
4a30: 6f 77 2c 20 69 52 65 67 2c 20 31 29 3b 0a 20 20  ow, iReg, 1);.  
4a40: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
4a50: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
4a60: 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 69 6e 67  [schema.]locking
4a70: 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20 50 52 41 47  _mode.  **  PRAG
4a80: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b  MA [schema.]lock
4a90: 69 6e 67 5f 6d 6f 64 65 20 3d 20 28 6e 6f 72 6d  ing_mode = (norm
4aa0: 61 6c 7c 65 78 63 6c 75 73 69 76 65 29 0a 20 20  al|exclusive).  
4ab0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
4ac0: 70 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3a 20  p_LOCKING_MODE: 
4ad0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
4ae0: 20 2a 7a 52 65 74 20 3d 20 22 6e 6f 72 6d 61 6c   *zRet = "normal
4af0: 22 3b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65  ";.    int eMode
4b00: 20 3d 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64   = getLockingMod
4b10: 65 28 7a 52 69 67 68 74 29 3b 0a 0a 20 20 20 20  e(zRight);..    
4b20: 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26  if( pId2->n==0 &
4b30: 26 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  & eMode==PAGER_L
4b40: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
4b50: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6d   ){.      /* Sim
4b60: 70 6c 65 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b  ple "PRAGMA lock
4b70: 69 6e 67 5f 6d 6f 64 65 3b 22 20 73 74 61 74 65  ing_mode;" state
4b80: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20  ment. This is a 
4b90: 71 75 65 72 79 20 66 6f 72 0a 20 20 20 20 20 20  query for.      
4ba0: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  ** the current d
4bb0: 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 6d  efault locking m
4bc0: 6f 64 65 20 28 77 68 69 63 68 20 6d 61 79 20 62  ode (which may b
4bd0: 65 20 64 69 66 66 65 72 65 6e 74 20 74 6f 0a 20  e different to. 
4be0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b       ** the lock
4bf0: 69 6e 67 2d 6d 6f 64 65 20 6f 66 20 74 68 65 20  ing-mode of the 
4c00: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 29 2e 0a  main database)..
4c10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 65        */.      e
4c20: 4d 6f 64 65 20 3d 20 64 62 2d 3e 64 66 6c 74 4c  Mode = db->dfltL
4c30: 6f 63 6b 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c  ockMode;.    }el
4c40: 73 65 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20  se{.      Pager 
4c50: 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 69  *pPager;.      i
4c60: 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b  f( pId2->n==0 ){
4c70: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
4c80: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
4c90: 6e 6f 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  no database name
4ca0: 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 61   was specified a
4cb0: 73 20 70 61 72 74 0a 20 20 20 20 20 20 20 20 2a  s part.        *
4cc0: 2a 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  * of the PRAGMA 
4cd0: 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20 74 68 69 73  command. In this
4ce0: 20 63 61 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e   case the lockin
4cf0: 67 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 0a 20  g-mode must be. 
4d00: 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e         ** set on
4d10: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
4d20: 74 61 62 61 73 65 73 2c 20 61 73 20 77 65 6c 6c  tabases, as well
4d30: 20 61 73 20 74 68 65 20 6d 61 69 6e 20 64 62 20   as the main db 
4d40: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  file..        **
4d50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f  .        ** Also
4d60: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 2e 64 66  , the sqlite3.df
4d70: 6c 74 4c 6f 63 6b 4d 6f 64 65 20 76 61 72 69 61  ltLockMode varia
4d80: 62 6c 65 20 69 73 20 73 65 74 20 73 6f 20 74 68  ble is set so th
4d90: 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  at.        ** an
4da0: 79 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 61  y subsequently a
4db0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
4dc0: 73 20 61 6c 73 6f 20 75 73 65 20 74 68 65 20 73  s also use the s
4dd0: 70 65 63 69 66 69 65 64 0a 20 20 20 20 20 20 20  pecified.       
4de0: 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65   ** locking mode
4df0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
4e00: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
4e10: 20 20 20 20 20 61 73 73 65 72 74 28 70 44 62 3d       assert(pDb=
4e20: 3d 26 64 62 2d 3e 61 44 62 5b 30 5d 29 3b 0a 20  =&db->aDb[0]);. 
4e30: 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 32 3b         for(ii=2;
4e40: 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b   ii<db->nDb; ii+
4e50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50  +){.          pP
4e60: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
4e70: 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
4e80: 5b 69 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20  [ii].pBt);.     
4e90: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
4ea0: 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61  rLockingMode(pPa
4eb0: 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ger, eMode);.   
4ec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
4ed0: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
4ee0: 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 20  = (u8)eMode;.   
4ef0: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
4f00: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
4f10: 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Pager(pDb->pBt);
4f20: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 73  .      eMode = s
4f30: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
4f40: 6e 67 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65  ngMode(pPager, e
4f50: 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Mode);.    }..  
4f60: 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
4f70: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4f80: 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  DE_NORMAL.      
4f90: 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
4fa0: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
4fb0: 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
4fc0: 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41     if( eMode==PA
4fd0: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
4fe0: 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
4ff0: 20 20 20 7a 52 65 74 20 3d 20 22 65 78 63 6c 75     zRet = "exclu
5000: 73 69 76 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20  sive";.    }.   
5010: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
5020: 74 28 76 2c 20 7a 52 65 74 29 3b 0a 20 20 20 20  t(v, zRet);.    
5030: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
5040: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
5050: 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d  chema.]journal_m
5060: 6f 64 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ode.  **  PRAGMA
5070: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5080: 6c 5f 6d 6f 64 65 20 3d 0a 20 20 2a 2a 20 20 20  l_mode =.  **   
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 28 64 65 6c 65 74 65 7c 70 65 72 73 69     (delete|persi
50b0: 73 74 7c 6f 66 66 7c 74 72 75 6e 63 61 74 65 7c  st|off|truncate|
50c0: 6d 65 6d 6f 72 79 7c 77 61 6c 7c 6f 66 66 29 0a  memory|wal|off).
50d0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
50e0: 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f 4d 4f 44 45  Typ_JOURNAL_MODE
50f0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64  : {.    int eMod
5100: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  e;        /* One
5110: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
5120: 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 73 79  URNALMODE_XXX sy
5130: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74  mbols */.    int
5140: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 2f   ii;           /
5150: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
5160: 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  /..    if( zRigh
5170: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
5180: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
5190: 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 6f 66 20  "=MODE" part of 
51a0: 74 68 65 20 70 72 61 67 6d 61 2c 20 64 6f 20 61  the pragma, do a
51b0: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20   query for the. 
51c0: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
51d0: 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 65 4d  mode */.      eM
51e0: 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
51f0: 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20  NALMODE_QUERY;. 
5200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64  const char *zMod
5220: 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  e;.      int n =
5230: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
5240: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
5250: 66 6f 72 28 65 4d 6f 64 65 3d 30 3b 20 28 7a 4d  for(eMode=0; (zM
5260: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75  ode = sqlite3Jou
5270: 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28 65 4d 6f  rnalModename(eMo
5280: 64 65 29 29 21 3d 30 3b 20 65 4d 6f 64 65 2b 2b  de))!=0; eMode++
5290: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
52a0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
52b0: 52 69 67 68 74 2c 20 7a 4d 6f 64 65 2c 20 6e 29  Right, zMode, n)
52c0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
52d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
52e0: 7a 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  zMode ){.       
52f0: 20 2f 2a 20 49 66 20 74 68 65 20 22 3d 4d 4f 44   /* If the "=MOD
5300: 45 22 20 70 61 72 74 20 64 6f 65 73 20 6e 6f 74  E" part does not
5310: 20 6d 61 74 63 68 20 61 6e 79 20 6b 6e 6f 77 6e   match any known
5320: 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 0a 20   journal mode,. 
5330: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64         ** then d
5340: 6f 20 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  o a query */.   
5350: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
5360: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
5370: 55 45 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UERY;.      }.  
5380: 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 50      if( eMode==P
5390: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
53a0: 5f 4f 46 46 20 26 26 20 28 64 62 2d 3e 66 6c 61  _OFF && (db->fla
53b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 44 65 66 65  gs & SQLITE_Defe
53c0: 6e 73 69 76 65 29 21 3d 30 20 29 7b 0a 20 20 20  nsive)!=0 ){.   
53d0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
53e0: 6c 6c 6f 77 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  llow journal-mod
53f0: 65 20 22 4f 46 46 22 20 69 6e 20 64 65 66 65 6e  e "OFF" in defen
5400: 73 69 76 65 20 73 69 6e 63 65 20 74 68 65 20 64  sive since the d
5410: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20  atabase.        
5420: 2a 2a 20 63 61 6e 20 62 65 63 6f 6d 65 20 63 6f  ** can become co
5430: 72 72 75 70 74 65 64 20 75 73 69 6e 67 20 6f 72  rrupted using or
5440: 64 69 6e 61 72 79 20 53 51 4c 20 77 68 65 6e 20  dinary SQL when 
5450: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  the journal is o
5460: 66 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d  ff */.        eM
5470: 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
5480: 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20  NALMODE_QUERY;. 
5490: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
54a0: 20 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45   if( eMode==PAGE
54b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
54c0: 45 52 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d  ERY && pId2->n==
54d0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f  0 ){.      /* Co
54e0: 6e 76 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f  nvert "PRAGMA jo
54f0: 75 72 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f  urnal_mode" into
5500: 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f   "PRAGMA main.jo
5510: 75 72 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20  urnal_mode" */. 
5520: 20 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20       iDb = 0;.  
5530: 20 20 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b      pId2->n = 1;
5540: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
5550: 69 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e  i=db->nDb-1; ii>
5560: 3d 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20  =0; ii--){.     
5570: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d   if( db->aDb[ii]
5580: 2e 70 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62  .pBt && (ii==iDb
5590: 20 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20   || pId2->n==0) 
55a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
55b0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
55c0: 76 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20  v, ii);.        
55d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
55e0: 33 28 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d  3(v, OP_JournalM
55f0: 6f 64 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64  ode, ii, 1, eMod
5600: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
5610: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
5620: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
5630: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a  sultRow, 1, 1);.
5640: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
5650: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
5660: 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e  A [schema.]journ
5670: 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20  al_size_limit.  
5680: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
5690: 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  ma.]journal_size
56a0: 5f 6c 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20  _limit=N.  **.  
56b0: 2a 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68  ** Get or set th
56c0: 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20  e size limit on 
56d0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
56e0: 20 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63   files..  */.  c
56f0: 61 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52  ase PragTyp_JOUR
5700: 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20  NAL_SIZE_LIMIT: 
5710: 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
5720: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
5730: 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74  eePager(pDb->pBt
5740: 29 3b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69  );.    i64 iLimi
5750: 74 20 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20  t = -2;.    if( 
5760: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
5770: 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
5780: 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c  oI64(zRight, &iL
5790: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28  imit);.      if(
57a0: 20 69 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69   iLimit<-1 ) iLi
57b0: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  mit = -1;.    }.
57c0: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c      iLimit = sql
57d0: 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
57e0: 53 69 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72  SizeLimit(pPager
57f0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72  , iLimit);.    r
5800: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
5810: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62  , iLimit);.    b
5820: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69  reak;.  }..#endi
5830: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5840: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a  _PAGER_PRAGMAS *
5850: 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  /..  /*.  **  PR
5860: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75  AGMA [schema.]au
5870: 74 6f 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20  to_vacuum.  **  
5880: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
5890: 61 75 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20  auto_vacuum=N.  
58a0: 2a 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73  **.  ** Get or s
58b0: 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
58c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 27 61 75  the database 'au
58d0: 74 6f 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d  to-vacuum' param
58e0: 65 74 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76  eter..  ** The v
58f0: 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20  alue is one of: 
5900: 20 30 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32   0 NONE 1 FULL 2
5910: 20 49 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a   INCREMENTAL.  *
5920: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
5930: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
5940: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
5950: 41 55 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20  AUTO_VACUUM: {. 
5960: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
5970: 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  pDb->pBt;.    as
5980: 73 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a  sert( pBt!=0 );.
5990: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
59a0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
59b0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69  ingleInt(v, sqli
59c0: 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
59d0: 61 63 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20  acuum(pBt));.   
59e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
59f0: 74 20 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74  t eAuto = getAut
5a00: 6f 56 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b  oVacuum(zRight);
5a10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
5a20: 41 75 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f  Auto>=0 && eAuto
5a30: 3c 3d 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d  <=2 );.      db-
5a40: 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28  >nextAutovac = (
5a50: 75 38 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20  u8)eAuto;.      
5a60: 2f 2a 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56  /* Call SetAutoV
5a70: 61 63 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69  acuum() to set i
5a80: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e  nitialize the in
5a90: 74 65 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a  ternal auto and.
5aa0: 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61        ** incr-va
5ab0: 63 75 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73  cuum flags. This
5ac0: 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
5ad0: 63 61 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  case this connec
5ae0: 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72  tion.      ** cr
5af0: 65 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61  eates the databa
5b00: 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69  se file. It is i
5b10: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74  mportant that it
5b20: 20 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20   is created.    
5b30: 20 20 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d    ** as an auto-
5b40: 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64  vacuum capable d
5b50: 62 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  b..      */.    
5b60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5b70: 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
5b80: 28 70 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20  (pBt, eAuto);.  
5b90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
5ba0: 54 45 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d  TE_OK && (eAuto=
5bb0: 3d 31 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20  =1 || eAuto==2) 
5bc0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ){.        /* Wh
5bd0: 65 6e 20 73 65 74 74 69 6e 67 20 74 68 65 20 61  en setting the a
5be0: 75 74 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto_vacuum mode 
5bf0: 74 6f 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22  to either "full"
5c00: 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   or .        ** 
5c10: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77  "incremental", w
5c20: 72 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  rite the value o
5c30: 66 20 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65  f meta[6] in the
5c40: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
5c50: 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72    ** file. Befor
5c60: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74  e writing to met
5c70: 61 5b 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74  a[6], check that
5c80: 20 6d 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74   meta[3] indicat
5c90: 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  es.        ** th
5ca0: 61 74 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69  at this really i
5cb0: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
5cc0: 20 63 61 70 61 62 6c 65 20 64 61 74 61 62 61 73   capable databas
5cd0: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
5ce0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
5cf0: 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42  st int iLn = VDB
5d00: 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28  E_OFFSET_LINENO(
5d10: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74  2);.        stat
5d20: 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c  ic const VdbeOpL
5d30: 69 73 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d  ist setMeta6[] =
5d40: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f   {.          { O
5d50: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20  P_Transaction,  
5d60: 20 20 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20    0,         1, 
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20  0},    /* 0 */. 
5d90: 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65           { OP_Re
5da0: 61 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c  adCookie,     0,
5db0: 20 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20           1,     
5dc0: 20 20 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53      BTREE_LARGES
5dd0: 54 5f 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20  T_ROOT_PAGE},.  
5de0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c          { OP_If,
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
5e00: 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20          0,      
5e10: 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20             0},  
5e20: 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20    /* 2 */.      
5e30: 20 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20      { OP_Halt,  
5e40: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5e50: 4f 4b 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20  OK, OE_Abort,   
5e60: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
5e70: 20 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   3 */.          
5e80: 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  { OP_SetCookie, 
5e90: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
5ea0: 42 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55  BTREE_INCR_VACUU
5eb0: 4d 2c 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a  M, 0},    /* 4 *
5ec0: 2f 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20  /.        };.   
5ed0: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70       VdbeOp *aOp
5ee0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41  ;.        int iA
5ef0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
5f00: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
5f10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5f20: 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c  VdbeVerifyNoMall
5f30: 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72  ocRequired(v, Ar
5f40: 72 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36  raySize(setMeta6
5f50: 29 29 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20  ));.        aOp 
5f60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
5f70: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
5f80: 69 7a 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73  ize(setMeta6), s
5f90: 65 74 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20  etMeta6, iLn);. 
5fa0: 20 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f         if( ONLY_
5fb0: 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  IF_REALLOC_STRES
5fc0: 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61  S(aOp==0) ) brea
5fd0: 6b 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30  k;.        aOp[0
5fe0: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
5ff0: 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20      aOp[1].p1 = 
6000: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70  iDb;.        aOp
6010: 5b 32 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34  [2].p2 = iAddr+4
6020: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d  ;.        aOp[4]
6030: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
6040: 20 20 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65     aOp[4].p3 = e
6050: 41 75 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20  Auto - 1;.      
6060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
6070: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
6080: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6090: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
60a0: 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  dif..  /*.  **  
60b0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
60c0: 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75  incremental_vacu
60d0: 75 6d 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  um(N).  **.  ** 
60e0: 44 6f 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e  Do N steps of in
60f0: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
6100: 69 6e 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ing on a databas
6110: 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  e..  */.#ifndef 
6120: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6130: 56 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72  VACUUM.  case Pr
6140: 61 67 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41  agTyp_INCREMENTA
6150: 4c 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20  L_VACUUM: {.    
6160: 69 6e 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72  int iLimit, addr
6170: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
6180: 3d 3d 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47  ==0 || !sqlite3G
6190: 65 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20  etInt32(zRight, 
61a0: 26 69 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d  &iLimit) || iLim
61b0: 69 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  it<=0 ){.      i
61c0: 4c 69 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66  Limit = 0x7fffff
61d0: 66 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ff;.    }.    sq
61e0: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
61f0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
6200: 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
6210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6220: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
6230: 4c 69 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61  Limit, 1);.    a
6240: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
6250: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e  eAddOp1(v, OP_In
6260: 63 72 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20  crVacuum, iDb); 
6270: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6280: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6290: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
62a0: 75 6c 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  ultRow, 1);.    
62b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
62c0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
62d0: 31 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  1, -1);.    sqli
62e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
62f0: 20 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64   OP_IfPos, 1, ad
6300: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
6310: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
6320: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
6330: 20 61 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61   addr);.    brea
6340: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  k;.  }.#endif..#
6350: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6360: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
6370: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
6380: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6390: 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41  e_size.  **  PRA
63a0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63  GMA [schema.]cac
63b0: 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  he_size=N.  **. 
63c0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
63d0: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
63e0: 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74  urrent local set
63f0: 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a  ting for the.  *
6400: 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  * page cache siz
6410: 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  e. The second fo
6420: 72 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61  rm sets the loca
6430: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68  l.  ** page cach
6440: 65 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49  e size value.  I
6450: 66 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20  f N is positive 
6460: 74 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65  then that is the
6470: 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
6480: 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
6490: 68 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67  he.  If N is neg
64a0: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a  ative, then the.
64b0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
64c0: 61 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64  ages is adjusted
64d0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
64e0: 68 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62  he uses -N kibib
64f0: 79 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d  ytes.  ** of mem
6500: 6f 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ory..  */.  case
6510: 20 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53   PragTyp_CACHE_S
6520: 49 5a 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72  IZE: {.    asser
6530: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
6540: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
6550: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28  b, 0) );.    if(
6560: 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20   !zRight ){.    
6570: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
6580: 74 28 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d  t(v, pDb->pSchem
6590: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  a->cache_size);.
65a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
65b0: 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69   int size = sqli
65c0: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b  te3Atoi(zRight);
65d0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68  .      pDb->pSch
65e0: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20  ema->cache_size 
65f0: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  = size;.      sq
6600: 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
6610: 68 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c  heSize(pDb->pBt,
6620: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63   pDb->pSchema->c
6630: 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20  ache_size);.    
6640: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
6650: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
6660: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63  GMA [schema.]cac
6670: 68 65 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50  he_spill.  **  P
6680: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c  RAGMA cache_spil
6690: 6c 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20  l=BOOLEAN.  **  
66a0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
66b0: 63 61 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20  cache_spill=N.  
66c0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
66d0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
66e0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c  he current local
66f0: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65   setting for the
6700: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
6710: 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65   spill size. The
6720: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72   second form tur
6730: 6e 73 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f  ns cache spill o
6740: 6e 0a 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20  n.  ** or off.  
6750: 57 68 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61  When turnning ca
6760: 63 68 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68  che spill on, th
6770: 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
6780: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
6790: 74 20 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54  t cache_size.  T
67a0: 68 65 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65  he third form se
67b0: 74 73 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20  ts a spill size 
67c0: 74 68 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65  that.  ** may be
67d0: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20   different form 
67e0: 74 68 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a  the cache size..
67f0: 20 20 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73    ** If N is pos
6800: 69 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20  itive then that 
6810: 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62  is the.  ** numb
6820: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
6830: 68 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20  he cache.  If N 
6840: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
6850: 6e 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  n the.  ** numbe
6860: 72 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64  r of pages is ad
6870: 6a 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74  justed so that t
6880: 68 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e  he cache uses -N
6890: 20 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20   kibibytes.  ** 
68a0: 6f 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a  of memory..  **.
68b0: 20 20 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62    ** If the numb
68c0: 65 72 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c  er of cache_spil
68d0: 6c 20 70 61 67 65 73 20 69 73 20 6c 65 73 73 20  l pages is less 
68e0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
68f0: 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69  of.  ** cache_si
6900: 7a 65 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69  ze pages, no spi
6910: 6c 6c 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74  lling occurs unt
6920: 69 6c 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e  il the page coun
6930: 74 20 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74  t exceeds.  ** t
6940: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  he number of cac
6950: 68 65 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20  he_size pages.. 
6960: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63   **.  ** The cac
6970: 68 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e  he_spill=BOOLEAN
6980: 20 73 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73   setting applies
6990: 20 74 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64   to all attached
69a0: 20 73 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e   schemas,.  ** n
69b0: 6f 74 20 6a 75 73 74 20 74 68 65 20 73 63 68 65  ot just the sche
69c0: 6d 61 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  ma specified..  
69d0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
69e0: 70 5f 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b  p_CACHE_SPILL: {
69f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
6a00: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
6a10: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
6a20: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67  );.    if( !zRig
6a30: 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ht ){.      retu
6a40: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20  rnSingleInt(v,. 
6a50: 20 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61          (db->fla
6a60: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68  gs & SQLITE_Cach
6a70: 65 53 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a  eSpill)==0 ? 0 :
6a80: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71   .            sq
6a90: 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69  lite3BtreeSetSpi
6aa0: 6c 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c  llSize(pDb->pBt,
6ab0: 30 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0));.    }else{.
6ac0: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
6ad0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   1;.      if( sq
6ae0: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52  lite3GetInt32(zR
6af0: 69 67 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a  ight, &size) ){.
6b00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
6b10: 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65  treeSetSpillSize
6b20: 28 70 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29  (pDb->pBt, size)
6b30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6b40: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f  if( sqlite3GetBo
6b50: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69  olean(zRight, si
6b60: 7a 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ze!=0) ){.      
6b70: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
6b80: 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c  QLITE_CacheSpill
6b90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6ba0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
6bb0: 20 26 3d 20 7e 28 75 36 34 29 53 51 4c 49 54 45   &= ~(u64)SQLITE
6bc0: 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20  _CacheSpill;.   
6bd0: 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 41 6c     }.      setAl
6be0: 6c 50 61 67 65 72 46 6c 61 67 73 28 64 62 29 3b  lPagerFlags(db);
6bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6c00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
6c10: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
6c20: 2e 5d 6d 6d 61 70 5f 73 69 7a 65 28 4e 29 0a 20  .]mmap_size(N). 
6c30: 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 64 20 74 6f   **.  ** Used to
6c40: 20 73 65 74 20 6d 61 70 70 69 6e 67 20 73 69 7a   set mapping siz
6c50: 65 20 6c 69 6d 69 74 2e 20 54 68 65 20 6d 61 70  e limit. The map
6c60: 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 20  ping size limit 
6c70: 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20  is.  ** used to 
6c80: 6c 69 6d 69 74 20 74 68 65 20 61 67 67 72 65 67  limit the aggreg
6c90: 61 74 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  ate size of all 
6ca0: 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65  memory mapped re
6cb0: 67 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a  gions of the.  *
6cc0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
6cd0: 20 49 66 20 74 68 69 73 20 70 61 72 61 6d 65 74   If this paramet
6ce0: 65 72 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  er is set to zer
6cf0: 6f 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  o, then memory m
6d00: 61 70 70 69 6e 67 0a 20 20 2a 2a 20 69 73 20 6e  apping.  ** is n
6d10: 6f 74 20 75 73 65 64 20 61 74 20 61 6c 6c 2e 20  ot used at all. 
6d20: 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76   If N is negativ
6d30: 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65 66 61  e, then the defa
6d40: 75 6c 74 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20  ult memory map. 
6d50: 20 2a 2a 20 6c 69 6d 69 74 20 64 65 74 65 72 6d   ** limit determ
6d60: 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ined by sqlite3_
6d70: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
6d80: 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 29 20  NFIG_MMAP_SIZE) 
6d90: 69 73 20 73 65 74 2e 0a 20 20 2a 2a 20 54 68 65  is set..  ** The
6da0: 20 70 61 72 61 6d 65 74 65 72 20 4e 20 69 73 20   parameter N is 
6db0: 6d 65 61 73 75 72 65 64 20 69 6e 20 62 79 74 65  measured in byte
6dc0: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
6dd0: 73 20 76 61 6c 75 65 20 69 73 20 61 64 76 69 73  s value is advis
6de0: 6f 72 79 2e 20 20 54 68 65 20 75 6e 64 65 72 6c  ory.  The underl
6df0: 79 69 6e 67 20 56 46 53 20 69 73 20 66 72 65 65  ying VFS is free
6e00: 20 74 6f 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20   to memory map. 
6e10: 20 2a 2a 20 61 73 20 6c 69 74 74 6c 65 20 6f 72   ** as little or
6e20: 20 61 73 20 6d 75 63 68 20 61 73 20 69 74 20 77   as much as it w
6e30: 61 6e 74 73 2e 20 20 45 78 63 65 70 74 2c 20 69  ants.  Except, i
6e40: 66 20 4e 20 69 73 20 73 65 74 20 74 6f 20 30 20  f N is set to 0 
6e50: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 75 70  then the.  ** up
6e60: 70 65 72 20 6c 61 79 65 72 73 20 77 69 6c 6c 20  per layers will 
6e70: 6e 65 76 65 72 20 69 6e 76 6f 6b 65 20 74 68 65  never invoke the
6e80: 20 78 46 65 74 63 68 20 69 6e 74 65 72 66 61 63   xFetch interfac
6e90: 65 73 20 74 6f 20 74 68 65 20 56 46 53 2e 0a 20  es to the VFS.. 
6ea0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
6eb0: 79 70 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  yp_MMAP_SIZE: {.
6ec0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
6ed0: 34 20 73 7a 3b 0a 23 69 66 20 53 51 4c 49 54 45  4 sz;.#if SQLITE
6ee0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
6ef0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
6f00: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
6f10: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
6f20: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
6f30: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
6f40: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
6f50: 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52  DecOrHexToI64(zR
6f60: 69 67 68 74 2c 20 26 73 7a 29 3b 0a 20 20 20 20  ight, &sz);.    
6f70: 20 20 69 66 28 20 73 7a 3c 30 20 29 20 73 7a 20    if( sz<0 ) sz 
6f80: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
6f90: 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20  onfig.szMmap;.  
6fa0: 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d      if( pId2->n=
6fb0: 3d 30 20 29 20 64 62 2d 3e 73 7a 4d 6d 61 70 20  =0 ) db->szMmap 
6fc0: 3d 20 73 7a 3b 0a 20 20 20 20 20 20 66 6f 72 28  = sz;.      for(
6fd0: 69 69 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69  ii=db->nDb-1; ii
6fe0: 3e 3d 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20  >=0; ii--){.    
6ff0: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
7000: 69 69 5d 2e 70 42 74 20 26 26 20 28 69 69 3d 3d  ii].pBt && (ii==
7010: 69 44 62 20 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d  iDb || pId2->n==
7020: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
7030: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
7040: 6d 61 70 4c 69 6d 69 74 28 64 62 2d 3e 61 44 62  mapLimit(db->aDb
7050: 5b 69 69 5d 2e 70 42 74 2c 20 73 7a 29 3b 0a 20  [ii].pBt, sz);. 
7060: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7070: 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20  .    }.    sz = 
7080: 2d 31 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  -1;.    rc = sql
7090: 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
70a0: 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  l(db, zDb, SQLIT
70b0: 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
70c0: 45 2c 20 26 73 7a 29 3b 0a 23 65 6c 73 65 0a 20  E, &sz);.#else. 
70d0: 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 72     sz = 0;.    r
70e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
70f0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
7100: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7110: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
7120: 65 49 6e 74 28 76 2c 20 73 7a 29 3b 0a 20 20 20  eInt(v, sz);.   
7130: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
7140: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
7150: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
7160: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50  nErr++;.      pP
7170: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
7180: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
7190: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
71a0: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
71b0: 72 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  re.  **   PRAGMA
71c0: 20 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 22 64   temp_store = "d
71d0: 65 66 61 75 6c 74 22 7c 22 6d 65 6d 6f 72 79 22  efault"|"memory"
71e0: 7c 22 66 69 6c 65 22 0a 20 20 2a 2a 0a 20 20 2a  |"file".  **.  *
71f0: 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
7200: 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
7210: 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72  of the temp_stor
7220: 65 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e  e flag.  Changin
7230: 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c  g.  ** the local
7240: 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20   value does not 
7250: 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20  make changes to 
7260: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e  the disk file an
7270: 64 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20  d the default.  
7280: 2a 2a 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  ** value will be
7290: 20 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65   restored the ne
72a0: 78 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  xt time the data
72b0: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2e 0a  base is opened..
72c0: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
72d0: 68 61 74 20 69 74 20 69 73 20 70 6f 73 73 69 62  hat it is possib
72e0: 6c 65 20 66 6f 72 20 74 68 65 20 6c 69 62 72 61  le for the libra
72f0: 72 79 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ry compile-time 
7300: 6f 70 74 69 6f 6e 73 20 74 6f 0a 20 20 2a 2a 20  options to.  ** 
7310: 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 73 65  override this se
7320: 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 63 61 73  tting.  */.  cas
7330: 65 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53  e PragTyp_TEMP_S
7340: 54 4f 52 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  TORE: {.    if( 
7350: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
7360: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
7370: 28 76 2c 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  (v, db->temp_sto
7380: 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  re);.    }else{.
7390: 20 20 20 20 20 20 63 68 61 6e 67 65 54 65 6d 70        changeTemp
73a0: 53 74 6f 72 61 67 65 28 70 50 61 72 73 65 2c 20  Storage(pParse, 
73b0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  zRight);.    }. 
73c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
73d0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
73e0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
73f0: 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52  ectory.  **   PR
7400: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
7410: 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c 22  directory = ""|"
7420: 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a  directory_name".
7430: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
7440: 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61   or set the loca
7450: 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74  l value of the t
7460: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
7470: 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e 67  ory flag.  Chang
7480: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c  ing.  ** the val
7490: 75 65 20 73 65 74 73 20 61 20 73 70 65 63 69 66  ue sets a specif
74a0: 69 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  ic directory to 
74b0: 62 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70  be used for temp
74c0: 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 20 20 2a  orary files..  *
74d0: 2a 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e  * Setting to a n
74e0: 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72  ull string rever
74f0: 74 73 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c  ts to the defaul
7500: 74 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  t temporary dire
7510: 63 74 6f 72 79 20 73 65 61 72 63 68 2e 0a 20 20  ctory search..  
7520: 2a 2a 20 49 66 20 74 65 6d 70 6f 72 61 72 79 20  ** If temporary 
7530: 64 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61  directory is cha
7540: 6e 67 65 64 2c 20 74 68 65 6e 20 69 6e 76 61 6c  nged, then inval
7550: 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65  idateTempStorage
7560: 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61  ..  **.  */.  ca
7570: 73 65 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f  se PragTyp_TEMP_
7580: 53 54 4f 52 45 5f 44 49 52 45 43 54 4f 52 59 3a  STORE_DIRECTORY:
7590: 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67   {.    if( !zRig
75a0: 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ht ){.      retu
75b0: 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20  rnSingleText(v, 
75c0: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
75d0: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c  ectory);.    }el
75e0: 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se{.#ifndef SQLI
75f0: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20  TE_OMIT_WSD.    
7600: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
7610: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
7620: 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  es;.        rc =
7630: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
7640: 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68  (db->pVfs, zRigh
7650: 74 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  t, SQLITE_ACCESS
7660: 5f 52 45 41 44 57 52 49 54 45 2c 20 26 72 65 73  _READWRITE, &res
7670: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
7680: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
7690: 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
76a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
76b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74  Msg(pParse, "not
76c0: 20 61 20 77 72 69 74 61 62 6c 65 20 64 69 72 65   a writable dire
76d0: 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20  ctory");.       
76e0: 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f     goto pragma_o
76f0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
7700: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7710: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7720: 45 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  E==0.       || (
7730: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7740: 45 3d 3d 31 20 26 26 20 64 62 2d 3e 74 65 6d 70  E==1 && db->temp
7750: 5f 73 74 6f 72 65 3c 3d 31 29 0a 20 20 20 20 20  _store<=1).     
7760: 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d    || (SQLITE_TEM
7770: 50 5f 53 54 4f 52 45 3d 3d 32 20 26 26 20 64 62  P_STORE==2 && db
7780: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 31 29  ->temp_store==1)
7790: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
77a0: 20 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70    invalidateTemp
77b0: 53 74 6f 72 61 67 65 28 70 50 61 72 73 65 29 3b  Storage(pParse);
77c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
77d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69  qlite3_free(sqli
77e0: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
77f0: 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ry);.      if( z
7800: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7810: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70      sqlite3_temp
7820: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c  _directory = sql
7830: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
7840: 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  ", zRight);.    
7850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7860: 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
7870: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20  rectory = 0;.   
7880: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
7890: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a  QLITE_OMIT_WSD *
78a0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  /.    }.    brea
78b0: 6b 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  k;.  }..#if SQLI
78c0: 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 2f 2a 0a 20  TE_OS_WIN.  /*. 
78d0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 64 61 74   **   PRAGMA dat
78e0: 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
78f0: 79 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  y.  **   PRAGMA 
7900: 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
7910: 74 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63  tory = ""|"direc
7920: 74 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a  tory_name".  **.
7930: 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73    ** Return or s
7940: 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c  et the local val
7950: 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 5f 73  ue of the data_s
7960: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66  tore_directory f
7970: 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20  lag.  Changing. 
7980: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65   ** the value se
7990: 74 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69  ts a specific di
79a0: 72 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73  rectory to be us
79b0: 65 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ed for database 
79c0: 66 69 6c 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  files that.  ** 
79d0: 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 77  were specified w
79e0: 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
79f0: 61 74 68 6e 61 6d 65 2e 20 20 53 65 74 74 69 6e  athname.  Settin
7a00: 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69  g to a null stri
7a10: 6e 67 20 72 65 76 65 72 74 73 0a 20 20 2a 2a 20  ng reverts.  ** 
7a20: 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 64  to the default d
7a30: 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72  atabase director
7a40: 79 2c 20 77 68 69 63 68 20 66 6f 72 20 64 61 74  y, which for dat
7a50: 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65 63  abase files spec
7a60: 69 66 69 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  ified with.  ** 
7a70: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
7a80: 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 62 65  will probably be
7a90: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75   based on the cu
7aa0: 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20  rrent directory 
7ab0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f  for the.  ** pro
7ac0: 63 65 73 73 2e 20 20 44 61 74 61 62 61 73 65 20  cess.  Database 
7ad0: 66 69 6c 65 20 73 70 65 63 69 66 69 65 64 20 77  file specified w
7ae0: 69 74 68 20 61 6e 20 61 62 73 6f 6c 75 74 65 20  ith an absolute 
7af0: 70 61 74 68 20 61 72 65 20 6e 6f 74 20 69 6d 70  path are not imp
7b00: 61 63 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  acted.  ** by th
7b10: 69 73 20 73 65 74 74 69 6e 67 2c 20 72 65 67 61  is setting, rega
7b20: 72 64 6c 65 73 73 20 6f 66 20 69 74 73 20 76 61  rdless of its va
7b30: 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20  lue..  **.  */. 
7b40: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 41   case PragTyp_DA
7b50: 54 41 5f 53 54 4f 52 45 5f 44 49 52 45 43 54 4f  TA_STORE_DIRECTO
7b60: 52 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a  RY: {.    if( !z
7b70: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72  Right ){.      r
7b80: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
7b90: 76 2c 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  v, sqlite3_data_
7ba0: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
7bb0: 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53  }else{.#ifndef S
7bc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
7bd0: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
7be0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  0] ){.        in
7bf0: 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72  t res;.        r
7c00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
7c10: 65 73 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52  ess(db->pVfs, zR
7c20: 69 67 68 74 2c 20 53 51 4c 49 54 45 5f 41 43 43  ight, SQLITE_ACC
7c30: 45 53 53 5f 52 45 41 44 57 52 49 54 45 2c 20 26  ESS_READWRITE, &
7c40: 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  res);.        if
7c50: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7c60: 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  || res==0 ){.   
7c70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7c80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7c90: 6e 6f 74 20 61 20 77 72 69 74 61 62 6c 65 20 64  not a writable d
7ca0: 69 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 20 20  irectory");.    
7cb0: 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d        goto pragm
7cc0: 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  a_out;.        }
7cd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
7ce0: 71 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69  qlite3_free(sqli
7cf0: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
7d00: 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ry);.      if( z
7d10: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7d20: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
7d30: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c  _directory = sql
7d40: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
7d50: 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  ", zRight);.    
7d60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7d70: 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
7d80: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20  rectory = 0;.   
7d90: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
7da0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a  QLITE_OMIT_WSD *
7db0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  /.    }.    brea
7dc0: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  k;.  }.#endif..#
7dd0: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
7de0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
7df0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
7e00: 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f  A [schema.]lock_
7e10: 70 72 6f 78 79 5f 66 69 6c 65 0a 20 20 2a 2a 20  proxy_file.  ** 
7e20: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
7e30: 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
7e40: 65 20 3d 20 22 3a 61 75 74 6f 3a 22 7c 22 6c 6f  e = ":auto:"|"lo
7e50: 63 6b 5f 66 69 6c 65 5f 70 61 74 68 22 0a 20 20  ck_file_path".  
7e60: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
7e70: 72 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  r set the value 
7e80: 6f 66 20 74 68 65 20 6c 6f 63 6b 5f 70 72 6f 78  of the lock_prox
7e90: 79 5f 66 69 6c 65 20 66 6c 61 67 2e 20 20 43 68  y_file flag.  Ch
7ea0: 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anging.  ** the 
7eb0: 76 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65  value sets a spe
7ec0: 63 69 66 69 63 20 66 69 6c 65 20 74 6f 20 62 65  cific file to be
7ed0: 20 75 73 65 64 20 66 6f 72 20 64 61 74 61 62 61   used for databa
7ee0: 73 65 20 61 63 63 65 73 73 20 6c 6f 63 6b 73 2e  se access locks.
7ef0: 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73  .  **.  */.  cas
7f00: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 50  e PragTyp_LOCK_P
7f10: 52 4f 58 59 5f 46 49 4c 45 3a 20 7b 0a 20 20 20  ROXY_FILE: {.   
7f20: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7f30: 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
7f40: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
7f50: 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74  eePager(pDb->pBt
7f60: 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  );.      char *p
7f70: 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 20 3d  roxy_file_path =
7f80: 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 73 71 6c   NULL;.      sql
7f90: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
7fa0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
7fb0: 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
7fc0: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
7fd0: 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c  ControlHint(pFil
7fe0: 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  e, SQLITE_GET_LO
7ff0: 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20  CKPROXYFILE, .  
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8010: 20 20 20 20 20 20 20 20 20 26 70 72 6f 78 79 5f           &proxy_
8020: 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20 20  file_path);.    
8030: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65    returnSingleTe
8040: 78 74 28 76 2c 20 70 72 6f 78 79 5f 66 69 6c 65  xt(v, proxy_file
8050: 5f 70 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73  _path);.    }els
8060: 65 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  e{.      Pager *
8070: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
8080: 42 74 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e  BtreePager(pDb->
8090: 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pBt);.      sqli
80a0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20  te3_file *pFile 
80b0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
80c0: 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  le(pPager);.    
80d0: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
80e0: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
80f0: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 3d 73 71  {.        res=sq
8100: 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
8110: 6f 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  ol(pFile, SQLITE
8120: 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
8130: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8150: 20 20 20 20 20 20 20 20 20 20 7a 52 69 67 68 74            zRight
8160: 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
8170: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 3d 73 71  {.        res=sq
8180: 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
8190: 6f 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  ol(pFile, SQLITE
81a0: 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
81b0: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b            NULL);
81e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
81f0: 66 28 20 72 65 73 21 3d 53 51 4c 49 54 45 5f 4f  f( res!=SQLITE_O
8200: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
8210: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8220: 72 73 65 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  rse, "failed to 
8230: 73 65 74 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  set lock proxy f
8240: 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 67  ile");.        g
8250: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
8260: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8270: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
8280: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
8290: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
82a0: 4c 45 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20  LE */      .    
82b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
82c0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e  GMA [schema.]syn
82d0: 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 20  chronous.  **   
82e0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
82f0: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 7c  synchronous=OFF|
8300: 4f 4e 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 7c 45  ON|NORMAL|FULL|E
8310: 58 54 52 41 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  XTRA.  **.  ** R
8320: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
8330: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20   local value of 
8340: 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  the synchronous 
8350: 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a  flag.  Changing.
8360: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76    ** the local v
8370: 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  alue does not ma
8380: 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ke changes to th
8390: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20  e disk file and 
83a0: 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74  the.  ** default
83b0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72   value will be r
83c0: 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74  estored the next
83d0: 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61   time the databa
83e0: 73 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65  se is.  ** opene
83f0: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  d..  */.  case P
8400: 72 61 67 54 79 70 5f 53 59 4e 43 48 52 4f 4e 4f  ragTyp_SYNCHRONO
8410: 55 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a  US: {.    if( !z
8420: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72  Right ){.      r
8430: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
8440: 2c 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65  , pDb->safety_le
8450: 76 65 6c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73  vel-1);.    }els
8460: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64 62  e{.      if( !db
8470: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
8480: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8490: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
84a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 61  .            "Sa
84b0: 66 65 74 79 20 6c 65 76 65 6c 20 6d 61 79 20 6e  fety level may n
84c0: 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20 69 6e  ot be changed in
84d0: 73 69 64 65 20 61 20 74 72 61 6e 73 61 63 74 69  side a transacti
84e0: 6f 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  on");.      }els
84f0: 65 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a  e if( iDb!=1 ){.
8500: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 76          int iLev
8510: 65 6c 20 3d 20 28 67 65 74 53 61 66 65 74 79 4c  el = (getSafetyL
8520: 65 76 65 6c 28 7a 52 69 67 68 74 2c 30 2c 31 29  evel(zRight,0,1)
8530: 2b 31 29 20 26 20 50 41 47 45 52 5f 53 59 4e 43  +1) & PAGER_SYNC
8540: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20  HRONOUS_MASK;.  
8550: 20 20 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c        if( iLevel
8560: 3d 3d 30 20 29 20 69 4c 65 76 65 6c 20 3d 20 31  ==0 ) iLevel = 1
8570: 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  ;.        pDb->s
8580: 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 69 4c  afety_level = iL
8590: 65 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 70 44  evel;.        pD
85a0: 62 2d 3e 62 53 79 6e 63 53 65 74 20 3d 20 31 3b  b->bSyncSet = 1;
85b0: 0a 20 20 20 20 20 20 20 20 73 65 74 41 6c 6c 50  .        setAllP
85c0: 61 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20  agerFlags(db);. 
85d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
85e0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
85f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
8600: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20  T_PAGER_PRAGMAS 
8610: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
8620: 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41  TE_OMIT_FLAG_PRA
8630: 47 4d 41 53 0a 20 20 63 61 73 65 20 50 72 61 67  GMAS.  case Prag
8640: 54 79 70 5f 46 4c 41 47 3a 20 7b 0a 20 20 20 20  Typ_FLAG: {.    
8650: 69 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b  if( zRight==0 ){
8660: 0a 20 20 20 20 20 20 73 65 74 50 72 61 67 6d 61  .      setPragma
8670: 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65  ResultColumnName
8680: 73 28 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20  s(v, pPragma);. 
8690: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
86a0: 65 49 6e 74 28 76 2c 20 28 64 62 2d 3e 66 6c 61  eInt(v, (db->fla
86b0: 67 73 20 26 20 70 50 72 61 67 6d 61 2d 3e 69 41  gs & pPragma->iA
86c0: 72 67 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d 65  rg)!=0 );.    }e
86d0: 6c 73 65 7b 0a 20 20 20 20 20 20 75 36 34 20 6d  lse{.      u64 m
86e0: 61 73 6b 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69  ask = pPragma->i
86f0: 41 72 67 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  Arg;    /* Mask 
8700: 6f 66 20 62 69 74 73 20 74 6f 20 73 65 74 20 6f  of bits to set o
8710: 72 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 20 20  r clear. */.    
8720: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
8730: 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
8740: 20 20 20 2f 2a 20 46 6f 72 65 69 67 6e 20 6b 65     /* Foreign ke
8750: 79 20 73 75 70 70 6f 72 74 20 6d 61 79 20 6e 6f  y support may no
8760: 74 20 62 65 20 65 6e 61 62 6c 65 64 20 6f 72 20  t be enabled or 
8770: 64 69 73 61 62 6c 65 64 20 77 68 69 6c 65 20 6e  disabled while n
8780: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ot.        ** in
8790: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64   auto-commit mod
87a0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  e.  */.        m
87b0: 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ask &= ~(SQLITE_
87c0: 46 6f 72 65 69 67 6e 4b 65 79 73 29 3b 0a 20 20  ForeignKeys);.  
87d0: 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
87e0: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
87f0: 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 64  TION.      if( d
8800: 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65  b->auth.authLeve
8810: 6c 3d 3d 55 41 55 54 48 5f 55 73 65 72 20 29 7b  l==UAUTH_User ){
8820: 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  .        /* Do n
8830: 6f 74 20 61 6c 6c 6f 77 20 6e 6f 6e 2d 61 64 6d  ot allow non-adm
8840: 69 6e 20 75 73 65 72 73 20 74 6f 20 6d 6f 64 69  in users to modi
8850: 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 61 72  fy the schema ar
8860: 62 69 74 72 61 72 69 6c 79 20 2a 2f 0a 20 20 20  bitrarily */.   
8870: 20 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53       mask &= ~(S
8880: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
8890: 61 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  a);.      }.#end
88a0: 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71  if..      if( sq
88b0: 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
88c0: 7a 52 69 67 68 74 2c 20 30 29 20 29 7b 0a 20 20  zRight, 0) ){.  
88d0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
88e0: 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  |= mask;.      }
88f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62  else{.        db
8900: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  ->flags &= ~mask
8910: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 61  ;.        if( ma
8920: 73 6b 3d 3d 53 51 4c 49 54 45 5f 44 65 66 65 72  sk==SQLITE_Defer
8930: 46 4b 73 20 29 20 64 62 2d 3e 6e 44 65 66 65 72  FKs ) db->nDefer
8940: 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a  redImmCons = 0;.
8950: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
8960: 2a 20 4d 61 6e 79 20 6f 66 20 74 68 65 20 66 6c  * Many of the fl
8970: 61 67 2d 70 72 61 67 6d 61 73 20 6d 6f 64 69 66  ag-pragmas modif
8980: 79 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  y the code gener
8990: 61 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 20  ated by the SQL 
89a0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
89b0: 65 72 20 28 65 67 2e 20 63 6f 75 6e 74 5f 63 68  er (eg. count_ch
89c0: 61 6e 67 65 73 29 2e 20 53 6f 20 61 64 64 20 61  anges). So add a
89d0: 6e 20 6f 70 63 6f 64 65 20 74 6f 20 65 78 70 69  n opcode to expi
89e0: 72 65 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  re all.      ** 
89f0: 63 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73 74 61  compiled SQL sta
8a00: 74 65 6d 65 6e 74 73 20 61 66 74 65 72 20 6d 6f  tements after mo
8a10: 64 69 66 79 69 6e 67 20 61 20 70 72 61 67 6d 61  difying a pragma
8a20: 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f   value..      */
8a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8a40: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45  beAddOp0(v, OP_E
8a50: 78 70 69 72 65 29 3b 0a 20 20 20 20 20 20 73 65  xpire);.      se
8a60: 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 64  tAllPagerFlags(d
8a70: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  b);.    }.    br
8a80: 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  eak;.  }.#endif 
8a90: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  /* SQLITE_OMIT_F
8aa0: 4c 41 47 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  LAG_PRAGMAS */..
8ab0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8ac0: 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d  MIT_SCHEMA_PRAGM
8ad0: 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  AS.  /*.  **   P
8ae0: 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f  RAGMA table_info
8af0: 28 3c 74 61 62 6c 65 3e 29 0a 20 20 2a 2a 0a 20  (<table>).  **. 
8b00: 20 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6e   ** Return a sin
8b10: 67 6c 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68  gle row for each
8b20: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6e   column of the n
8b30: 61 6d 65 64 20 74 61 62 6c 65 2e 20 54 68 65 20  amed table. The 
8b40: 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20  columns of.  ** 
8b50: 74 68 65 20 72 65 74 75 72 6e 65 64 20 64 61 74  the returned dat
8b60: 61 20 73 65 74 20 61 72 65 3a 0a 20 20 2a 2a 0a  a set are:.  **.
8b70: 20 20 2a 2a 20 63 69 64 3a 20 20 20 20 20 20 20    ** cid:       
8b80: 20 43 6f 6c 75 6d 6e 20 69 64 20 28 6e 75 6d 62   Column id (numb
8b90: 65 72 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74  ered from left t
8ba0: 6f 20 72 69 67 68 74 2c 20 73 74 61 72 74 69 6e  o right, startin
8bb0: 67 20 61 74 20 30 29 0a 20 20 2a 2a 20 6e 61 6d  g at 0).  ** nam
8bc0: 65 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  e:       Column 
8bd0: 6e 61 6d 65 0a 20 20 2a 2a 20 74 79 70 65 3a 20  name.  ** type: 
8be0: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 64 65 63        Column dec
8bf0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 2e 0a 20  laration type.. 
8c00: 20 2a 2a 20 6e 6f 74 6e 75 6c 6c 3a 20 20 20 20   ** notnull:    
8c10: 54 72 75 65 20 69 66 20 27 4e 4f 54 20 4e 55 4c  True if 'NOT NUL
8c20: 4c 27 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f  L' is part of co
8c30: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
8c40: 0a 20 20 2a 2a 20 64 66 6c 74 5f 76 61 6c 75 65  .  ** dflt_value
8c50: 3a 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  : The default va
8c60: 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  lue for the colu
8c70: 6d 6e 2c 20 69 66 20 61 6e 79 2e 0a 20 20 2a 2a  mn, if any..  **
8c80: 20 70 6b 3a 20 20 20 20 20 20 20 20 20 4e 6f 6e   pk:         Non
8c90: 2d 7a 65 72 6f 20 66 6f 72 20 50 4b 20 66 69 65  -zero for PK fie
8ca0: 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  lds..  */.  case
8cb0: 20 50 72 61 67 54 79 70 5f 54 41 42 4c 45 5f 49   PragTyp_TABLE_I
8cc0: 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20  NFO: if( zRight 
8cd0: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
8ce0: 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  ab;.    pTab = s
8cf0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
8d00: 65 28 70 50 61 72 73 65 2c 20 4c 4f 43 41 54 45  e(pParse, LOCATE
8d10: 5f 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c 20  _NOERR, zRight, 
8d20: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
8d30: 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab ){.      int 
8d40: 69 54 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33  iTabDb = sqlite3
8d50: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
8d60: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
8d70: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b  ;.      int i, k
8d80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64  ;.      int nHid
8d90: 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43  den = 0;.      C
8da0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20  olumn *pCol;.   
8db0: 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
8dc0: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
8dd0: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
8de0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8df0: 20 3d 20 37 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 7;.      sqli
8e00: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
8e10: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61 62  ema(pParse, iTab
8e20: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
8e30: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
8e40: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
8e50: 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  b);.      for(i=
8e60: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  0, pCol=pTab->aC
8e70: 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; i<pTab->nCol
8e80: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
8e90: 20 20 20 20 20 20 20 20 69 6e 74 20 69 73 48 69          int isHi
8ea0: 64 64 65 6e 20 3d 20 49 73 48 69 64 64 65 6e 43  dden = IsHiddenC
8eb0: 6f 6c 75 6d 6e 28 70 43 6f 6c 29 3b 0a 20 20 20  olumn(pCol);.   
8ec0: 20 20 20 20 20 69 66 28 20 69 73 48 69 64 64 65       if( isHidde
8ed0: 6e 20 26 26 20 70 50 72 61 67 6d 61 2d 3e 69 41  n && pPragma->iA
8ee0: 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rg==0 ){.       
8ef0: 20 20 20 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20     nHidden++;.  
8f00: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
8f10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8f20: 20 20 20 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63      if( (pCol->c
8f30: 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
8f40: 47 5f 50 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b  G_PRIMKEY)==0 ){
8f50: 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30  .          k = 0
8f60: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
8f70: 69 66 28 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20  if( pPk==0 ){.  
8f80: 20 20 20 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20          k = 1;. 
8f90: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8fa0: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b          for(k=1;
8fb0: 20 6b 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26   k<=pTab->nCol &
8fc0: 26 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  & pPk->aiColumn[
8fd0: 6b 2d 31 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a  k-1]!=i; k++){}.
8fe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8ff0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
9000: 70 44 66 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c  pDflt==0 || pCol
9010: 2d 3e 70 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pDflt->op==TK_
9020: 53 50 41 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  SPAN );.        
9030: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9040: 4c 6f 61 64 28 76 2c 20 31 2c 20 70 50 72 61 67  Load(v, 1, pPrag
9050: 6d 61 2d 3e 69 41 72 67 20 3f 20 22 69 73 73 69  ma->iArg ? "issi
9060: 73 69 69 22 20 3a 20 22 69 73 73 69 73 69 22 2c  sii" : "issisi",
9070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9080: 69 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20 20  i-nHidden,.     
9090: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
90a0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
90b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c        sqlite3Col
90c0: 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29  umnType(pCol,"")
90d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
90e0: 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f   pCol->notNull ?
90f0: 20 31 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20   1 : 0,.        
9100: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66         pCol->pDf
9110: 6c 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  lt ? pCol->pDflt
9120: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c 0a  ->u.zToken : 0,.
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
9140: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9150: 20 69 73 48 69 64 64 65 6e 29 3b 0a 20 20 20 20   isHidden);.    
9160: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9170: 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66 20 53  break;..#ifdef S
9180: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 63 61  QLITE_DEBUG.  ca
9190: 73 65 20 50 72 61 67 54 79 70 5f 53 54 41 54 53  se PragTyp_STATS
91a0: 3a 20 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  : {.    Index *p
91b0: 49 64 78 3b 0a 20 20 20 20 48 61 73 68 45 6c 65  Idx;.    HashEle
91c0: 6d 20 2a 69 3b 0a 20 20 20 20 70 50 61 72 73 65  m *i;.    pParse
91d0: 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20  ->nMem = 5;.    
91e0: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
91f0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
9200: 69 44 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  iDb);.    for(i=
9210: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
9220: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
9230: 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71  blHash); i; i=sq
9240: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
9250: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
9260: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
9270: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 20 20 73  Data(i);.      s
9280: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
9290: 6f 61 64 28 76 2c 20 31 2c 20 22 73 73 69 69 69  oad(v, 1, "ssiii
92a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
92b0: 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
92c0: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
92d0: 20 20 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52      pTab->szTabR
92e0: 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
92f0: 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 2c  Tab->nRowLogEst,
9300: 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
9310: 2d 3e 74 61 62 46 6c 61 67 73 29 3b 0a 20 20 20  ->tabFlags);.   
9320: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
9330: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
9340: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
9350: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9360: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
9370: 76 2c 20 32 2c 20 22 73 69 69 69 58 22 2c 0a 20  v, 2, "siiiX",. 
9380: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
9390: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
93a0: 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77    pIdx->szIdxRow
93b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64  ,.           pId
93c0: 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  x->aiRowLogEst[0
93d0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  ],.           pI
93e0: 64 78 2d 3e 68 61 73 53 74 61 74 31 29 3b 0a 20  dx->hasStat1);. 
93f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9400: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
9410: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 35 29 3b  esultRow, 1, 5);
9420: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9430: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
9440: 69 66 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  if..  case PragT
9450: 79 70 5f 49 4e 44 45 58 5f 49 4e 46 4f 3a 20 69  yp_INDEX_INFO: i
9460: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
9470: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9480: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
9490: 20 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65     pIdx = sqlite
94a0: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
94b0: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
94c0: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a   if( pIdx==0 ){.
94d0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
94e0: 65 20 69 73 20 6e 6f 20 69 6e 64 65 78 20 6e 61  e is no index na
94f0: 6d 65 64 20 7a 52 69 67 68 74 2c 20 63 68 65 63  med zRight, chec
9500: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
9510: 65 20 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  e is a.      ** 
9520: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
9530: 62 6c 65 20 6e 61 6d 65 64 20 7a 52 69 67 68 74  ble named zRight
9540: 2c 20 61 6e 64 20 69 66 20 74 68 65 72 65 20 69  , and if there i
9550: 73 2c 20 73 68 6f 77 20 74 68 65 0a 20 20 20 20  s, show the.    
9560: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6f    ** structure o
9570: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
9580: 59 20 69 6e 64 65 78 20 66 6f 72 20 74 68 61 74  Y index for that
9590: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20   table. */.     
95a0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
95b0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
95c0: 65 2c 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 2c  e, LOCATE_NOERR,
95d0: 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20   zRight, zDb);. 
95e0: 20 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26       if( pTab &&
95f0: 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
9600: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
9610: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
9620: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
9630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9640: 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20     if( pIdx ){. 
9650: 20 20 20 20 20 69 6e 74 20 69 49 64 78 44 62 20       int iIdxDb 
9660: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
9670: 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78 2d  oIndex(db, pIdx-
9680: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
9690: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
96a0: 74 20 6d 78 3b 0a 20 20 20 20 20 20 69 66 28 20  t mx;.      if( 
96b0: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20 29 7b  pPragma->iArg ){
96c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47  .        /* PRAG
96d0: 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20 28  MA index_xinfo (
96e0: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 20 77 69  newer version wi
96f0: 74 68 20 6d 6f 72 65 20 72 6f 77 73 20 61 6e 64  th more rows and
9700: 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0a 20 20 20   columns) */.   
9710: 20 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e       mx = pIdx->
9720: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  nColumn;.       
9730: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9740: 36 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  6;.      }else{.
9750: 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d          /* PRAGM
9760: 41 20 69 6e 64 65 78 5f 69 6e 66 6f 20 28 6c 65  A index_info (le
9770: 67 61 63 79 20 76 65 72 73 69 6f 6e 29 20 2a 2f  gacy version) */
9780: 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20 70 49  .        mx = pI
9790: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  dx->nKeyCol;.   
97a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
97b0: 6d 20 3d 20 33 3b 0a 20 20 20 20 20 20 7d 0a 20  m = 3;.      }. 
97c0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 64 78       pTab = pIdx
97d0: 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->pTable;.      
97e0: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
97f0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
9800: 69 49 64 78 44 62 29 3b 0a 20 20 20 20 20 20 61  iIdxDb);.      a
9810: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
9820: 4d 65 6d 3c 3d 70 50 72 61 67 6d 61 2d 3e 6e 50  Mem<=pPragma->nP
9830: 72 61 67 43 4e 61 6d 65 20 29 3b 0a 20 20 20 20  ragCName );.    
9840: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 3b    for(i=0; i<mx;
9850: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
9860: 31 36 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e  16 cnum = pIdx->
9870: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
9880: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9890: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
98a0: 22 69 69 73 58 22 2c 20 69 2c 20 63 6e 75 6d 2c  "iisX", i, cnum,
98b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6e                cn
98d0: 75 6d 3c 30 20 3f 20 30 20 3a 20 70 54 61 62 2d  um<0 ? 0 : pTab-
98e0: 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d  >aCol[cnum].zNam
98f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
9900: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20 29 7b  pPragma->iArg ){
9910: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9920: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
9930: 76 2c 20 34 2c 20 22 69 73 69 58 22 2c 0a 20 20  v, 4, "isiX",.  
9940: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
9950: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 2c 0a 20  aSortOrder[i],. 
9960: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
9970: 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 0a 20 20 20 20  >azColl[i],.    
9980: 20 20 20 20 20 20 20 20 69 3c 70 49 64 78 2d 3e          i<pIdx->
9990: 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20  nKeyCol);.      
99a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
99b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
99c0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
99d0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  , pParse->nMem);
99e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
99f0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63   }.  break;..  c
9a00: 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45  ase PragTyp_INDE
9a10: 58 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52 69 67  X_LIST: if( zRig
9a20: 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  ht ){.    Index 
9a30: 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65  *pIdx;.    Table
9a40: 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20   *pTab;.    int 
9a50: 69 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  i;.    pTab = sq
9a60: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
9a70: 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  b, zRight, zDb);
9a80: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
9a90: 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 44  .      int iTabD
9aa0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
9ab0: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
9ac0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
9ad0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9ae0: 3d 20 35 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 5;.      sqlit
9af0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
9b00: 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61 62 44  ma(pParse, iTabD
9b10: 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  b);.      for(pI
9b20: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  dx=pTab->pIndex,
9b30: 20 69 3d 30 3b 20 70 49 64 78 3b 20 70 49 64 78   i=0; pIdx; pIdx
9b40: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b  =pIdx->pNext, i+
9b50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
9b60: 74 20 63 68 61 72 20 2a 61 7a 4f 72 69 67 69 6e  t char *azOrigin
9b70: 5b 5d 20 3d 20 7b 20 22 63 22 2c 20 22 75 22 2c  [] = { "c", "u",
9b80: 20 22 70 6b 22 20 7d 3b 0a 20 20 20 20 20 20 20   "pk" };.       
9b90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
9ba0: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 69  iLoad(v, 1, "isi
9bb0: 73 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  si",.           
9bc0: 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  i,.           pI
9bd0: 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  dx->zName,.     
9be0: 20 20 20 20 20 20 49 73 55 6e 69 71 75 65 49 6e        IsUniqueIn
9bf0: 64 65 78 28 70 49 64 78 29 2c 0a 20 20 20 20 20  dex(pIdx),.     
9c00: 20 20 20 20 20 20 61 7a 4f 72 69 67 69 6e 5b 70        azOrigin[p
9c10: 49 64 78 2d 3e 69 64 78 54 79 70 65 5d 2c 0a 20  Idx->idxType],. 
9c20: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
9c30: 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
9c40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9c50: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20  .  }.  break;.. 
9c60: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 41   case PragTyp_DA
9c70: 54 41 42 41 53 45 5f 4c 49 53 54 3a 20 7b 0a 20  TABASE_LIST: {. 
9c80: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50     int i;.    pP
9c90: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a  arse->nMem = 3;.
9ca0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
9cb0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
9cc0: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
9cd0: 69 5d 2e 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74  i].pBt==0 ) cont
9ce0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
9cf0: 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  rt( db->aDb[i].z
9d00: 44 62 53 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  DbSName!=0 );.  
9d10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9d20: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
9d30: 69 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 69  iss",.         i
9d40: 2c 0a 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  ,.         db->a
9d50: 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 0a  Db[i].zDbSName,.
9d60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9d70: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
9d80: 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  (db->aDb[i].pBt)
9d90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  );.    }.  }.  b
9da0: 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72  reak;..  case Pr
9db0: 61 67 54 79 70 5f 43 4f 4c 4c 41 54 49 4f 4e 5f  agTyp_COLLATION_
9dc0: 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  LIST: {.    int 
9dd0: 69 20 3d 20 30 3b 0a 20 20 20 20 48 61 73 68 45  i = 0;.    HashE
9de0: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 70 50 61 72  lem *p;.    pPar
9df0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20  se->nMem = 2;.  
9e00: 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61    for(p=sqliteHa
9e10: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f  shFirst(&db->aCo
9e20: 6c 6c 53 65 71 29 3b 20 70 3b 20 70 3d 73 71 6c  llSeq); p; p=sql
9e30: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
9e40: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
9e50: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
9e60: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
9e70: 61 28 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  a(p);.      sqli
9e80: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9e90: 28 76 2c 20 31 2c 20 22 69 73 22 2c 20 69 2b 2b  (v, 1, "is", i++
9ea0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
9eb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
9ec0: 61 6b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ak;..#ifdef SQLI
9ed0: 54 45 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e  TE_INTROSPECTION
9ee0: 5f 50 52 41 47 4d 41 53 0a 20 20 63 61 73 65 20  _PRAGMAS.  case 
9ef0: 50 72 61 67 54 79 70 5f 46 55 4e 43 54 49 4f 4e  PragTyp_FUNCTION
9f00: 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74  _LIST: {.    int
9f10: 20 69 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d   i;.    HashElem
9f20: 20 2a 6a 3b 0a 20 20 20 20 46 75 6e 63 44 65 66   *j;.    FuncDef
9f30: 20 2a 70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   *p;.    pParse-
9f40: 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66  >nMem = 2;.    f
9f50: 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45  or(i=0; i<SQLITE
9f60: 5f 46 55 4e 43 5f 48 41 53 48 5f 53 5a 3b 20 69  _FUNC_HASH_SZ; i
9f70: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
9f80: 3d 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e 46  =sqlite3BuiltinF
9f90: 75 6e 63 74 69 6f 6e 73 2e 61 5b 69 5d 3b 20 70  unctions.a[i]; p
9fa0: 3b 20 70 3d 70 2d 3e 75 2e 70 48 61 73 68 20 29  ; p=p->u.pHash )
9fb0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
9fc0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
9fd0: 49 54 45 5f 46 55 4e 43 5f 49 4e 54 45 52 4e 41  ITE_FUNC_INTERNA
9fe0: 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
9ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a000: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
a010: 20 22 73 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c   "si", p->zName,
a020: 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
a030: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c   }.    for(j=sql
a040: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
a050: 2d 3e 61 46 75 6e 63 29 3b 20 6a 3b 20 6a 3d 73  ->aFunc); j; j=s
a060: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6a 29  qliteHashNext(j)
a070: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 28 46 75  ){.      p = (Fu
a080: 6e 63 44 65 66 2a 29 73 71 6c 69 74 65 48 61 73  ncDef*)sqliteHas
a090: 68 44 61 74 61 28 6a 29 3b 0a 20 20 20 20 20 20  hData(j);.      
a0a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
a0b0: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 69 22 2c  Load(v, 1, "si",
a0c0: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20   p->zName, 0);. 
a0d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
a0e0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
a0f0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
a100: 42 4c 45 0a 20 20 63 61 73 65 20 50 72 61 67 54  BLE.  case PragT
a110: 79 70 5f 4d 4f 44 55 4c 45 5f 4c 49 53 54 3a 20  yp_MODULE_LIST: 
a120: 7b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a  {.    HashElem *
a130: 6a 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  j;.    pParse->n
a140: 4d 65 6d 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  Mem = 1;.    for
a150: 28 6a 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (j=sqliteHashFir
a160: 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  st(&db->aModule)
a170: 3b 20 6a 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73  ; j; j=sqliteHas
a180: 68 4e 65 78 74 28 6a 29 29 7b 0a 20 20 20 20 20  hNext(j)){.     
a190: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
a1a0: 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 48  (Module*)sqliteH
a1b0: 61 73 68 44 61 74 61 28 6a 29 3b 0a 20 20 20 20  ashData(j);.    
a1c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
a1d0: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 22  tiLoad(v, 1, "s"
a1e0: 2c 20 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pMod->zName);.
a1f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
a200: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
a210: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
a220: 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 63 61 73 65  TABLE */..  case
a230: 20 50 72 61 67 54 79 70 5f 50 52 41 47 4d 41 5f   PragTyp_PRAGMA_
a240: 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  LIST: {.    int 
a250: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
a260: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 50 72 61  i<ArraySize(aPra
a270: 67 6d 61 4e 61 6d 65 29 3b 20 69 2b 2b 29 7b 0a  gmaName); i++){.
a280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a290: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
a2a0: 20 22 73 22 2c 20 61 50 72 61 67 6d 61 4e 61 6d   "s", aPragmaNam
a2b0: 65 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  e[i].zName);.   
a2c0: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
a2d0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a2e0: 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50  _INTROSPECTION_P
a2f0: 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 65 6e 64 69  RAGMAS */..#endi
a300: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
a310: 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d 41 53 20  _SCHEMA_PRAGMAS 
a320: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
a330: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
a340: 4b 45 59 0a 20 20 63 61 73 65 20 50 72 61 67 54  KEY.  case PragT
a350: 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c  yp_FOREIGN_KEY_L
a360: 49 53 54 3a 20 69 66 28 20 7a 52 69 67 68 74 20  IST: if( zRight 
a370: 29 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b  ){.    FKey *pFK
a380: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
a390: 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  b;.    pTab = sq
a3a0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
a3b0: 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  b, zRight, zDb);
a3c0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
a3d0: 0a 20 20 20 20 20 20 70 46 4b 20 3d 20 70 54 61  .      pFK = pTa
a3e0: 62 2d 3e 70 46 4b 65 79 3b 0a 20 20 20 20 20 20  b->pFKey;.      
a3f0: 69 66 28 20 70 46 4b 20 29 7b 0a 20 20 20 20 20  if( pFK ){.     
a400: 20 20 20 69 6e 74 20 69 54 61 62 44 62 20 3d 20     int iTabDb = 
a410: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
a420: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
a430: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
a440: 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20   int i = 0; .   
a450: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
a460: 6d 20 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 73  m = 8;.        s
a470: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
a480: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
a490: 54 61 62 44 62 29 3b 0a 20 20 20 20 20 20 20 20  TabDb);.        
a4a0: 77 68 69 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20  while(pFK){.    
a4b0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
a4c0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
a4d0: 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  j<pFK->nCol; j++
a4e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
a4f0: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
a500: 6f 61 64 28 76 2c 20 31 2c 20 22 69 69 73 73 73  oad(v, 1, "iisss
a510: 73 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  sss",.          
a520: 20 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20           i,.    
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
a540: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a550: 20 20 20 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20       pFK->zTo,. 
a560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a570: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b    pTab->aCol[pFK
a580: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d  ->aCol[j].iFrom]
a590: 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  .zName,.        
a5a0: 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d 3e             pFK->
a5b0: 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20  aCol[j].zCol,.  
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d   actionName(pFK-
a5e0: 3e 61 41 63 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f  >aAction[1]),  /
a5f0: 2a 20 4f 4e 20 55 50 44 41 54 45 20 2a 2f 0a 20  * ON UPDATE */. 
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b    actionName(pFK
a620: 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29 2c 20 20  ->aAction[0]),  
a630: 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 2a 2f 0a  /* ON DELETE */.
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 22 4e 4f 4e 45 22 29 3b 0a 20 20 20 20     "NONE");.    
a660: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a670: 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20 20 20 20    ++i;.         
a680: 20 70 46 4b 20 3d 20 70 46 4b 2d 3e 70 4e 65 78   pFK = pFK->pNex
a690: 74 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20 7d  tFrom;.        }
a6a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a6b0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
a6c0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
a6d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
a6e0: 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e  GN_KEY) */..#ifn
a6f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a700: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 23 69 66 6e  FOREIGN_KEY.#ifn
a710: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a720: 54 52 49 47 47 45 52 0a 20 20 63 61 73 65 20 50  TRIGGER.  case P
a730: 72 61 67 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b  ragTyp_FOREIGN_K
a740: 45 59 5f 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20  EY_CHECK: {.    
a750: 46 4b 65 79 20 2a 70 46 4b 3b 20 20 20 20 20 20  FKey *pFK;      
a760: 20 20 20 20 20 20 20 2f 2a 20 41 20 66 6f 72 65         /* A fore
a770: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
a780: 6e 74 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  nt */.    Table 
a790: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
a7a0: 20 2f 2a 20 43 68 69 6c 64 20 74 61 62 6c 65 20   /* Child table 
a7b0: 63 6f 6e 74 61 69 6e 20 22 52 45 46 45 52 45 4e  contain "REFEREN
a7c0: 43 45 53 22 20 6b 65 79 77 6f 72 64 20 2a 2f 0a  CES" keyword */.
a7d0: 20 20 20 20 54 61 62 6c 65 20 2a 70 50 61 72 65      Table *pPare
a7e0: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61  nt;        /* Pa
a7f0: 72 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 20  rent table that 
a800: 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20  child points to 
a810: 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
a820: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dx;           /*
a830: 20 49 6e 64 65 78 20 69 6e 20 74 68 65 20 70 61   Index in the pa
a840: 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
a850: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
a860: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
a870: 20 63 6f 75 6e 74 65 72 3a 20 20 46 6f 72 65 69   counter:  Forei
a880: 67 6e 20 6b 65 79 20 6e 75 6d 62 65 72 20 66 6f  gn key number fo
a890: 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 69 6e  r pTab */.    in
a8a0: 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
a8b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
a8c0: 6e 74 65 72 3a 20 20 46 69 65 6c 64 20 6f 66 20  nter:  Field of 
a8d0: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
a8e0: 2a 2f 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20  */.    HashElem 
a8f0: 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *k;           /*
a900: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20   Loop counter:  
a910: 4e 65 78 74 20 74 61 62 6c 65 20 69 6e 20 73 63  Next table in sc
a920: 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  hema */.    int 
a930: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
a940: 20 20 20 2f 2a 20 72 65 73 75 6c 74 20 76 61 72     /* result var
a950: 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  iable */.    int
a960: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
a970: 20 20 20 20 2f 2a 20 33 20 72 65 67 69 73 74 65      /* 3 registe
a980: 72 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 65 73  rs to hold a res
a990: 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69  ult row */.    i
a9a0: 6e 74 20 72 65 67 4b 65 79 3b 20 20 20 20 20 20  nt regKey;      
a9b0: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
a9c0: 72 20 74 6f 20 68 6f 6c 64 20 6b 65 79 20 66 6f  r to hold key fo
a9d0: 72 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 46  r checking the F
a9e0: 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  K */.    int reg
a9f0: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
aa00: 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f 20  /* Registers to 
aa10: 68 6f 6c 64 20 61 20 72 6f 77 20 66 72 6f 6d 20  hold a row from 
aa20: 70 54 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20  pTab */.    int 
aa30: 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
aa40: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 61 20 6c     /* Top of a l
aa50: 6f 6f 70 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  oop checking for
aa60: 65 69 67 6e 20 6b 65 79 73 20 2a 2f 0a 20 20 20  eign keys */.   
aa70: 20 69 6e 74 20 61 64 64 72 4f 6b 3b 20 20 20 20   int addrOk;    
aa80: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
aa90: 68 65 72 65 20 69 66 20 74 68 65 20 6b 65 79 20  here if the key 
aaa0: 69 73 20 4f 4b 20 2a 2f 0a 20 20 20 20 69 6e 74  is OK */.    int
aab0: 20 2a 61 69 43 6f 6c 73 3b 20 20 20 20 20 20 20   *aiCols;       
aac0: 20 20 20 20 2f 2a 20 63 68 69 6c 64 20 74 6f 20      /* child to 
aad0: 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 6d 61  parent column ma
aae0: 70 70 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 65  pping */..    re
aaf0: 67 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65  gResult = pParse
ab00: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
ab10: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 34 3b  arse->nMem += 4;
ab20: 0a 20 20 20 20 72 65 67 4b 65 79 20 3d 20 2b 2b  .    regKey = ++
ab30: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
ab40: 20 20 72 65 67 52 6f 77 20 3d 20 2b 2b 70 50 61    regRow = ++pPa
ab50: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 6b  rse->nMem;.    k
ab60: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 72   = sqliteHashFir
ab70: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d  st(&db->aDb[iDb]
ab80: 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
ab90: 68 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6b  h);.    while( k
aba0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
abb0: 61 62 44 62 3b 0a 20 20 20 20 20 20 69 66 28 20  abDb;.      if( 
abc0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
abd0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
abe0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
abf0: 73 65 2c 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a  se, 0, zRight, z
ac00: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d  Db);.        k =
ac10: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
ac20: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
ac30: 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
ac40: 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
ac50: 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73     k = sqliteHas
ac60: 68 4e 65 78 74 28 6b 29 3b 0a 20 20 20 20 20 20  hNext(k);.      
ac70: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  }.      if( pTab
ac80: 3d 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b  ==0 || pTab->pFK
ac90: 65 79 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ey==0 ) continue
aca0: 3b 0a 20 20 20 20 20 20 69 54 61 62 44 62 20 3d  ;.      iTabDb =
acb0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
acc0: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
acd0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
ace0: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
acf0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
ad00: 69 54 61 62 44 62 29 3b 0a 20 20 20 20 20 20 73  iTabDb);.      s
ad10: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
ad20: 70 50 61 72 73 65 2c 20 69 54 61 62 44 62 2c 20  pParse, iTabDb, 
ad30: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
ad40: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
ad50: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f     if( pTab->nCo
ad60: 6c 2b 72 65 67 52 6f 77 3e 70 50 61 72 73 65 2d  l+regRow>pParse-
ad70: 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73 65 2d 3e  >nMem ) pParse->
ad80: 6e 4d 65 6d 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  nMem = pTab->nCo
ad90: 6c 20 2b 20 72 65 67 52 6f 77 3b 0a 20 20 20 20  l + regRow;.    
ada0: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
adb0: 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 69 54  le(pParse, 0, iT
adc0: 61 62 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f  abDb, pTab, OP_O
add0: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
ade0: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
adf0: 74 72 69 6e 67 28 76 2c 20 72 65 67 52 65 73 75  tring(v, regResu
ae00: 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  lt, pTab->zName)
ae10: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c  ;.      for(i=1,
ae20: 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79   pFK=pTab->pFKey
ae30: 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d  ; pFK; i++, pFK=
ae40: 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pFK->pNextFrom){
ae50: 0a 20 20 20 20 20 20 20 20 70 50 61 72 65 6e 74  .        pParent
ae60: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
ae70: 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f  ble(db, pFK->zTo
ae80: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , zDb);.        
ae90: 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29  if( pParent==0 )
aea0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
aeb0: 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20     pIdx = 0;.   
aec0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
aed0: 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 54  eLock(pParse, iT
aee0: 61 62 44 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74  abDb, pParent->t
aef0: 6e 75 6d 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d  num, 0, pParent-
af00: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
af10: 20 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f   x = sqlite3FkLo
af20: 63 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  cateIndex(pParse
af30: 2c 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20  , pParent, pFK, 
af40: 26 70 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20  &pIdx, 0);.     
af50: 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20     if( x==0 ){. 
af60: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
af70: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
af80: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
af90: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 2c 20  able(pParse, i, 
afa0: 69 54 61 62 44 62 2c 20 70 50 61 72 65 6e 74 2c  iTabDb, pParent,
afb0: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
afc0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
afe0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
aff0: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 2c   OP_OpenRead, i,
b000: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 54 61   pIdx->tnum, iTa
b010: 62 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  bDb);.          
b020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
b030: 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
b040: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
b050: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
b060: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20  se{.          k 
b070: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 0;.          b
b080: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
b090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
b0a0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
b0b0: 72 72 3e 30 20 7c 7c 20 70 46 4b 3d 3d 30 20 29  rr>0 || pFK==0 )
b0c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 4b 20  ;.      if( pFK 
b0d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
b0e0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3c  f( pParse->nTab<
b0f0: 69 20 29 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  i ) pParse->nTab
b100: 20 3d 20 69 3b 0a 20 20 20 20 20 20 61 64 64 72   = i;.      addr
b110: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
b120: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
b130: 77 69 6e 64 2c 20 30 29 3b 20 56 64 62 65 43 6f  wind, 0); VdbeCo
b140: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b150: 20 66 6f 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54   for(i=1, pFK=pT
b160: 61 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20  ab->pFKey; pFK; 
b170: 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e  i++, pFK=pFK->pN
b180: 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20  extFrom){.      
b190: 20 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69    pParent = sqli
b1a0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
b1b0: 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b   pFK->zTo, zDb);
b1c0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20  .        pIdx = 
b1d0: 30 3b 0a 20 20 20 20 20 20 20 20 61 69 43 6f 6c  0;.        aiCol
b1e0: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  s = 0;.        i
b1f0: 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
b200: 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69          x = sqli
b210: 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78  te3FkLocateIndex
b220: 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74  (pParse, pParent
b230: 2c 20 70 46 4b 2c 20 26 70 49 64 78 2c 20 26 61  , pFK, &pIdx, &a
b240: 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 20 20  iCols);.        
b250: 20 20 61 73 73 65 72 74 28 20 78 3d 3d 30 20 29    assert( x==0 )
b260: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b270: 20 20 20 20 61 64 64 72 4f 6b 20 3d 20 73 71 6c      addrOk = sql
b280: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
b290: 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  l(pParse);..    
b2a0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
b2b0: 63 6f 64 65 20 74 6f 20 72 65 61 64 20 74 68 65  code to read the
b2c0: 20 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65   child key value
b2d0: 73 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73  s into registers
b2e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 67 52  .        ** regR
b2f0: 6f 77 2e 2e 72 65 67 52 6f 77 2b 6e 2e 20 49 66  ow..regRow+n. If
b300: 20 61 6e 79 20 6f 66 20 74 68 65 20 63 68 69 6c   any of the chil
b310: 64 20 6b 65 79 20 76 61 6c 75 65 73 20 61 72 65  d key values are
b320: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 0a 20 20 20   NULL, this .   
b330: 20 20 20 20 20 2a 2a 20 72 6f 77 20 63 61 6e 6e       ** row cann
b340: 6f 74 20 63 61 75 73 65 20 61 6e 20 46 4b 20 76  ot cause an FK v
b350: 69 6f 6c 61 74 69 6f 6e 2e 20 4a 75 6d 70 20 64  iolation. Jump d
b360: 69 72 65 63 74 6c 79 20 74 6f 20 61 64 64 72 4f  irectly to addrO
b370: 6b 20 69 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  k in .        **
b380: 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20   this case. */. 
b390: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
b3a0: 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  j<pFK->nCol; j++
b3b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
b3c0: 20 69 43 6f 6c 20 3d 20 61 69 43 6f 6c 73 20 3f   iCol = aiCols ?
b3d0: 20 61 69 43 6f 6c 73 5b 6a 5d 20 3a 20 70 46 4b   aiCols[j] : pFK
b3e0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 3b  ->aCol[j].iFrom;
b3f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b400: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
b410: 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
b420: 61 62 2c 20 30 2c 20 69 43 6f 6c 2c 20 72 65 67  ab, 0, iCol, reg
b430: 52 6f 77 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Row+j);.        
b440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b450: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
b460: 2c 20 72 65 67 52 6f 77 2b 6a 2c 20 61 64 64 72  , regRow+j, addr
b470: 4f 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ok); VdbeCoverag
b480: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  e(v);.        }.
b490: 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  .        /* Gene
b4a0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 71 75 65  rate code to que
b4b0: 72 79 20 74 68 65 20 70 61 72 65 6e 74 20 69 6e  ry the parent in
b4c0: 64 65 78 20 66 6f 72 20 61 20 6d 61 74 63 68 69  dex for a matchi
b4d0: 6e 67 20 70 61 72 65 6e 74 0a 20 20 20 20 20 20  ng parent.      
b4e0: 20 20 2a 2a 20 6b 65 79 2e 20 49 66 20 61 20 6d    ** key. If a m
b4f0: 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 6a  atch is found, j
b500: 75 6d 70 20 74 6f 20 61 64 64 72 4f 6b 2e 20 2a  ump to addrOk. *
b510: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
b520: 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dx ){.          
b530: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b540: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
b550: 72 64 2c 20 72 65 67 52 6f 77 2c 20 70 46 4b 2d  rd, regRow, pFK-
b560: 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65 79 2c 0a 20  >nCol, regKey,. 
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
b580: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
b590: 79 53 74 72 28 64 62 2c 70 49 64 78 29 2c 20 70  yStr(db,pIdx), p
b5a0: 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  FK->nCol);.     
b5b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b5c0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
b5d0: 46 6f 75 6e 64 2c 20 69 2c 20 61 64 64 72 4f 6b  Found, i, addrOk
b5e0: 2c 20 72 65 67 4b 65 79 2c 20 30 29 3b 0a 20 20  , regKey, 0);.  
b5f0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
b600: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
b610: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
b620: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
b630: 69 6e 74 20 6a 6d 70 20 3d 20 73 71 6c 69 74 65  int jmp = sqlite
b640: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
b650: 28 76 29 2b 32 3b 0a 20 20 20 20 20 20 20 20 20  (v)+2;.         
b660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b670: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
b680: 69 64 2c 20 69 2c 20 6a 6d 70 2c 20 72 65 67 52  id, i, jmp, regR
b690: 6f 77 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ow); VdbeCoverag
b6a0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
b6b0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
b6c0: 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20  v, addrOk);.    
b6d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
b6e0: 4b 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  K->nCol==1 );.  
b6f0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
b700: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
b710: 65 20 74 6f 20 72 65 70 6f 72 74 20 61 6e 20 46  e to report an F
b720: 4b 20 76 69 6f 6c 61 74 69 6f 6e 20 74 6f 20 74  K violation to t
b730: 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20  he caller. */.  
b740: 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
b750: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
b760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b770: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
b780: 77 69 64 2c 20 30 2c 20 72 65 67 52 65 73 75 6c  wid, 0, regResul
b790: 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  t+1);.        }e
b7a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
b7b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b7c0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
b7d0: 72 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20  regResult+1);.  
b7e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b7f0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
b800: 4c 6f 61 64 28 76 2c 20 72 65 67 52 65 73 75 6c  Load(v, regResul
b810: 74 2b 32 2c 20 22 73 69 58 22 2c 20 70 46 4b 2d  t+2, "siX", pFK-
b820: 3e 7a 54 6f 2c 20 69 2d 31 29 3b 0a 20 20 20 20  >zTo, i-1);.    
b830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b840: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
b850: 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74  ltRow, regResult
b860: 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 4);.        sq
b870: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
b880: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 6b 29  Label(v, addrOk)
b890: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b8a0: 33 44 62 46 72 65 65 28 64 62 2c 20 61 69 43 6f  3DbFree(db, aiCo
b8b0: 6c 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ls);.      }.   
b8c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b8d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
b8e0: 20 30 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20   0, addrTop+1); 
b8f0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b910: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b920: 64 72 54 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  drTop);.    }.  
b930: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
b940: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
b950: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
b960: 52 29 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  R) */.#endif /* 
b970: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b980: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
b990: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
b9a0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 45 5f 53  LITE_OMIT_CASE_S
b9b0: 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 5f 50 52  ENSITIVE_LIKE_PR
b9c0: 41 47 4d 41 0a 20 20 2f 2a 20 52 65 69 6e 73 74  AGMA.  /* Reinst
b9d0: 61 6c 6c 20 74 68 65 20 4c 49 4b 45 20 61 6e 64  all the LIKE and
b9e0: 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e   GLOB functions.
b9f0: 20 20 54 68 65 20 76 61 72 69 61 6e 74 20 6f 66    The variant of
ba00: 20 4c 49 4b 45 0a 20 20 2a 2a 20 75 73 65 64 20   LIKE.  ** used 
ba10: 77 69 6c 6c 20 62 65 20 63 61 73 65 20 73 65 6e  will be case sen
ba20: 73 69 74 69 76 65 20 6f 72 20 6e 6f 74 20 64 65  sitive or not de
ba30: 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 52  pending on the R
ba40: 48 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  HS..  */.  case 
ba50: 50 72 61 67 54 79 70 5f 43 41 53 45 5f 53 45 4e  PragTyp_CASE_SEN
ba60: 53 49 54 49 56 45 5f 4c 49 4b 45 3a 20 7b 0a 20  SITIVE_LIKE: {. 
ba70: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
ba80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
ba90: 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69  gisterLikeFuncti
baa0: 6f 6e 73 28 64 62 2c 20 73 71 6c 69 74 65 33 47  ons(db, sqlite3G
bab0: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
bac0: 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , 0));.    }.  }
bad0: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
bae0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
baf0: 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c  CASE_SENSITIVE_L
bb00: 49 4b 45 5f 50 52 41 47 4d 41 20 2a 2f 0a 0a 23  IKE_PRAGMA */..#
bb10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49 4e  ifndef SQLITE_IN
bb20: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52  TEGRITY_CHECK_ER
bb30: 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65  ROR_MAX.# define
bb40: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54   SQLITE_INTEGRIT
bb50: 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41  Y_CHECK_ERROR_MA
bb60: 58 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69  X 100.#endif..#i
bb70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bb80: 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
bb90: 4b 0a 20 20 2f 2a 20 20 20 20 50 52 41 47 4d 41  K.  /*    PRAGMA
bba0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
bbb0: 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20  .  **    PRAGMA 
bbc0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28  integrity_check(
bbd0: 4e 29 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d  N).  **    PRAGM
bbe0: 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20  A quick_check.  
bbf0: 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75 69  **    PRAGMA qui
bc00: 63 6b 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a  ck_check(N).  **
bc10: 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 65  .  ** Verify the
bc20: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
bc30: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
bc40: 0a 20 20 2a 2a 20 54 68 65 20 22 71 75 69 63 6b  .  ** The "quick
bc50: 5f 63 68 65 63 6b 22 20 69 73 20 72 65 64 75 63  _check" is reduc
bc60: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  ed version of . 
bc70: 20 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f 63 68   ** integrity_ch
bc80: 65 63 6b 20 64 65 73 69 67 6e 65 64 20 74 6f 20  eck designed to 
bc90: 64 65 74 65 63 74 20 6d 6f 73 74 20 64 61 74 61  detect most data
bca0: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 0a  base corruption.
bcb0: 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 74 68 65    ** without the
bcc0: 20 6f 76 65 72 68 65 61 64 20 6f 66 20 63 72 6f   overhead of cro
bcd0: 73 73 2d 63 68 65 63 6b 69 6e 67 20 69 6e 64 65  ss-checking inde
bce0: 78 65 73 2e 20 20 51 75 69 63 6b 5f 63 68 65 63  xes.  Quick_chec
bcf0: 6b 0a 20 20 2a 2a 20 69 73 20 6c 69 6e 65 61 72  k.  ** is linear
bd00: 20 74 69 6d 65 20 77 68 65 72 65 61 73 65 20 69   time wherease i
bd10: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 69  ntegrity_check i
bd20: 73 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a 2f  s O(NlogN)..  */
bd30: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
bd40: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 3a  INTEGRITY_CHECK:
bd50: 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c   {.    int i, j,
bd60: 20 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a 0a 20   addr, mxErr;.. 
bd70: 20 20 20 69 6e 74 20 69 73 51 75 69 63 6b 20 3d     int isQuick =
bd80: 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72   (sqlite3Tolower
bd90: 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71 27 29  (zLeft[0])=='q')
bda0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
bdb0: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20   PRAGMA command 
bdc0: 77 61 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  was of the form 
bdd0: 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69 6e 74  "PRAGMA <db>.int
bde0: 65 67 72 69 74 79 5f 63 68 65 63 6b 22 2c 0a 20  egrity_check",. 
bdf0: 20 20 20 2a 2a 20 74 68 65 6e 20 69 44 62 20 69     ** then iDb i
be00: 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
be10: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
be20: 73 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  se identified by
be30: 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e   <db>..    ** In
be40: 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
be50: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 64 61 74  integrity of dat
be60: 61 62 61 73 65 20 69 44 62 20 6f 6e 6c 79 20 69  abase iDb only i
be70: 73 20 76 65 72 69 66 69 65 64 20 62 79 0a 20 20  s verified by.  
be80: 20 20 2a 2a 20 74 68 65 20 56 44 42 45 20 63 72    ** the VDBE cr
be90: 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20 20 20  eated below..   
bea0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72   **.    ** Other
beb0: 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6d  wise, if the com
bec0: 6d 61 6e 64 20 77 61 73 20 73 69 6d 70 6c 79 20  mand was simply 
bed0: 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  "PRAGMA integrit
bee0: 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20 20 20  y_check" (or.   
bef0: 20 2a 2a 20 22 50 52 41 47 4d 41 20 71 75 69 63   ** "PRAGMA quic
bf00: 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68 65 6e 20  k_check"), then 
bf10: 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 30 2e  iDb is set to 0.
bf20: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
bf30: 65 74 20 69 44 62 0a 20 20 20 20 2a 2a 20 74 6f  et iDb.    ** to
bf40: 20 2d 31 20 68 65 72 65 2c 20 74 6f 20 69 6e 64   -1 here, to ind
bf50: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 56  icate that the V
bf60: 44 42 45 20 73 68 6f 75 6c 64 20 76 65 72 69 66  DBE should verif
bf70: 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 0a  y the integrity.
bf80: 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 61 74      ** of all at
bf90: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
bfa0: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
bfb0: 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20  ( iDb>=0 );.    
bfc0: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 7c  assert( iDb==0 |
bfd0: 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20 20 20  | pId2->z );.   
bfe0: 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d 30 20   if( pId2->z==0 
bff0: 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20 20 20  ) iDb = -1;..   
c000: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
c010: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
c020: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
c030: 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a  Mem = 6;..    /*
c040: 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
c050: 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a   error count */.
c060: 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49      mxErr = SQLI
c070: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
c080: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20  CK_ERROR_MAX;.  
c090: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
c0a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
c0b0: 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 6d  Int32(zRight, &m
c0c0: 78 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28  xErr);.      if(
c0d0: 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20 20   mxErr<=0 ){.   
c0e0: 20 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c       mxErr = SQL
c0f0: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
c100: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20  ECK_ERROR_MAX;. 
c110: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c130: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
c140: 2c 20 6d 78 45 72 72 2d 31 2c 20 31 29 3b 20 2f  , mxErr-1, 1); /
c150: 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20 65  * reg[1] holds e
c160: 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a 20  rrors left */.. 
c170: 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65     /* Do an inte
c180: 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6e 20 65  grity check on e
c190: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
c1a0: 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  e */.    for(i=0
c1b0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
c1c0: 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c 65  ){.      HashEle
c1d0: 6d 20 2a 78 3b 20 20 20 20 20 2f 2a 20 46 6f 72  m *x;     /* For
c1e0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
c1f0: 62 6c 65 73 20 69 6e 20 74 68 65 20 73 63 68 65  bles in the sche
c200: 6d 61 20 2a 2f 0a 20 20 20 20 20 20 48 61 73 68  ma */.      Hash
c210: 20 2a 70 54 62 6c 73 3b 20 20 20 20 20 2f 2a 20   *pTbls;     /* 
c220: 53 65 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  Set of all table
c230: 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  s in the schema 
c240: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 52  */.      int *aR
c250: 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 72  oot;      /* Arr
c260: 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 20  ay of root page 
c270: 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20 62  numbers of all b
c280: 74 72 65 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  trees */.      i
c290: 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20  nt cnt = 0;     
c2a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
c2b0: 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20  ries in aRoot[] 
c2c0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 49  */.      int mxI
c2d0: 64 78 20 3d 20 30 3b 20 20 20 2f 2a 20 4d 61 78  dx = 0;   /* Max
c2e0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
c2f0: 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 79 20 74  ndexes for any t
c300: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69  able */..      i
c310: 66 28 20 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  f( OMIT_TEMPDB &
c320: 26 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75  & i==1 ) continu
c330: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62  e;.      if( iDb
c340: 3e 3d 30 20 26 26 20 69 21 3d 69 44 62 20 29 20  >=0 && i!=iDb ) 
c350: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
c360: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
c370: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
c380: 20 69 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44   i);..      /* D
c390: 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63  o an integrity c
c3a0: 68 65 63 6b 20 6f 66 20 74 68 65 20 42 2d 54 72  heck of the B-Tr
c3b0: 65 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  ee.      **.    
c3c0: 20 20 2a 2a 20 42 65 67 69 6e 20 62 79 20 66 69    ** Begin by fi
c3d0: 6e 64 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 70  nding the root p
c3e0: 61 67 65 73 20 6e 75 6d 62 65 72 73 0a 20 20 20  ages numbers.   
c3f0: 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61     ** for all ta
c400: 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
c410: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
c420: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c430: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c440: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
c450: 64 62 2c 20 69 2c 20 30 29 20 29 3b 0a 20 20 20  db, i, 0) );.   
c460: 20 20 20 70 54 62 6c 73 20 3d 20 26 64 62 2d 3e     pTbls = &db->
c470: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 2d 3e  aDb[i].pSchema->
c480: 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 20 20 66  tblHash;.      f
c490: 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69  or(cnt=0, x=sqli
c4a0: 74 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c  teHashFirst(pTbl
c4b0: 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48  s); x; x=sqliteH
c4c0: 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20  ashNext(x)){.   
c4d0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
c4e0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
c4f0: 61 28 78 29 3b 20 20 2f 2a 20 43 75 72 72 65 6e  a(x);  /* Curren
c500: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  t table */.     
c510: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c530: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
c540: 20 6f 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   on pTab */.    
c550: 20 20 20 20 69 6e 74 20 6e 49 64 78 3b 20 20 20      int nIdx;   
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c580: 6f 66 20 69 6e 64 65 78 65 73 20 6f 6e 20 70 54  of indexes on pT
c590: 61 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ab */.        if
c5a0: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
c5b0: 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20   ) cnt++;.      
c5c0: 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49    for(nIdx=0, pI
c5d0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
c5e0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
c5f0: 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29  ->pNext, nIdx++)
c600: 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20 20  { cnt++; }.     
c610: 20 20 20 69 66 28 20 6e 49 64 78 3e 6d 78 49 64     if( nIdx>mxId
c620: 78 20 29 20 6d 78 49 64 78 20 3d 20 6e 49 64 78  x ) mxIdx = nIdx
c630: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c640: 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 44  aRoot = sqlite3D
c650: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c660: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 63 6e   sizeof(int)*(cn
c670: 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28  t+1));.      if(
c680: 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72 65 61   aRoot==0 ) brea
c690: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74  k;.      for(cnt
c6a0: 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68  =0, x=sqliteHash
c6b0: 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b  First(pTbls); x;
c6c0: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   x=sqliteHashNex
c6d0: 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(x)){.        T
c6e0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
c6f0: 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a  iteHashData(x);.
c700: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
c710: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Idx;.        if(
c720: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
c730: 29 20 61 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20 3d  ) aRoot[++cnt] =
c740: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pTab->tnum;.   
c750: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
c760: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
c770: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
c780: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  xt){.          a
c790: 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20 3d 20 70 49  Root[++cnt] = pI
c7a0: 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
c7b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
c7c0: 20 20 61 52 6f 6f 74 5b 30 5d 20 3d 20 63 6e 74    aRoot[0] = cnt
c7d0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  ;..      /* Make
c7e0: 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
c7f0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   number of regis
c800: 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  ters have been a
c810: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20  llocated */.    
c820: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
c830: 20 4d 41 58 28 20 70 50 61 72 73 65 2d 3e 6e 4d   MAX( pParse->nM
c840: 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b 0a 20  em, 8+mxIdx );. 
c850: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
c860: 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
c870: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
c880: 20 44 6f 20 74 68 65 20 62 2d 74 72 65 65 20 69   Do the b-tree i
c890: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 73 20  ntegrity checks 
c8a0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
c8b0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
c8c0: 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 32 2c  _IntegrityCk, 2,
c8d0: 20 63 6e 74 2c 20 31 2c 20 28 63 68 61 72 2a 29   cnt, 1, (char*)
c8e0: 61 52 6f 6f 74 2c 50 34 5f 49 4e 54 41 52 52 41  aRoot,P4_INTARRA
c8f0: 59 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Y);.      sqlite
c900: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
c910: 20 28 75 38 29 69 29 3b 0a 20 20 20 20 20 20 61   (u8)i);.      a
c920: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c930: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
c940: 4e 75 6c 6c 2c 20 32 29 3b 20 56 64 62 65 43 6f  Null, 2); VdbeCo
c950: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
c960: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c970: 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
c980: 2c 20 30 2c 20 33 2c 20 30 2c 0a 20 20 20 20 20  , 0, 3, 0,.     
c990: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
c9a0: 74 66 28 64 62 2c 20 22 2a 2a 2a 20 69 6e 20 64  tf(db, "*** in d
c9b0: 61 74 61 62 61 73 65 20 25 73 20 2a 2a 2a 5c 6e  atabase %s ***\n
c9c0: 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44  ", db->aDb[i].zD
c9d0: 62 53 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  bSName),.       
c9e0: 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20    P4_DYNAMIC);. 
c9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ca00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
ca10: 63 61 74 2c 20 32 2c 20 33 2c 20 33 29 3b 0a 20  cat, 2, 3, 3);. 
ca20: 20 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68       integrityCh
ca30: 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b  eckResultRow(v);
ca40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ca50: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
ca60: 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  dr);..      /* M
ca70: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
ca80: 20 69 6e 64 69 63 65 73 20 61 72 65 20 63 6f 6e   indices are con
ca90: 73 74 72 75 63 74 65 64 20 63 6f 72 72 65 63 74  structed correct
caa0: 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
cab0: 20 20 20 66 6f 72 28 78 3d 73 71 6c 69 74 65 48     for(x=sqliteH
cac0: 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b  ashFirst(pTbls);
cad0: 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68   x; x=sqliteHash
cae0: 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20  Next(x)){.      
caf0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
cb00: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78  sqliteHashData(x
cb10: 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  );.        Index
cb20: 20 2a 70 49 64 78 2c 20 2a 70 50 6b 3b 0a 20 20   *pIdx, *pPk;.  
cb30: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 72        Index *pPr
cb40: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
cb50: 20 69 6e 74 20 6c 6f 6f 70 54 6f 70 3b 0a 20 20   int loopTop;.  
cb60: 20 20 20 20 20 20 69 6e 74 20 69 44 61 74 61 43        int iDataC
cb70: 75 72 2c 20 69 49 64 78 43 75 72 3b 0a 20 20 20  ur, iIdxCur;.   
cb80: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2d 31       int r1 = -1
cb90: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
cba0: 54 61 62 2d 3e 74 6e 75 6d 3c 31 20 29 20 63 6f  Tab->tnum<1 ) co
cbb0: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 53 6b 69 70  ntinue;  /* Skip
cbc0: 20 56 49 45 57 73 20 6f 72 20 56 49 52 54 55 41   VIEWs or VIRTUA
cbd0: 4c 20 54 41 42 4c 45 73 20 2a 2f 0a 20 20 20 20  L TABLEs */.    
cbe0: 20 20 20 20 70 50 6b 20 3d 20 48 61 73 52 6f 77      pPk = HasRow
cbf0: 69 64 28 70 54 61 62 29 20 3f 20 30 20 3a 20 73  id(pTab) ? 0 : s
cc00: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
cc10: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
cc20: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
cc30: 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28  TableAndIndices(
cc40: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4f 50  pParse, pTab, OP
cc50: 5f 4f 70 65 6e 52 65 61 64 2c 20 30 2c 0a 20 20  _OpenRead, 0,.  
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 20 31 2c 20 30 2c 20 26 69 44 61 74 61 43 75 72   1, 0, &iDataCur
cc90: 2c 20 26 69 49 64 78 43 75 72 29 3b 0a 20 20 20  , &iIdxCur);.   
cca0: 20 20 20 20 20 2f 2a 20 72 65 67 5b 37 5d 20 63       /* reg[7] c
ccb0: 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65 72  ounts the number
ccc0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
ccd0: 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  he table..      
cce0: 20 20 2a 2a 20 72 65 67 5b 38 2b 69 5d 20 63 6f    ** reg[8+i] co
ccf0: 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20  unts the number 
cd00: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
cd10: 65 20 69 2d 74 68 20 69 6e 64 65 78 20 0a 20 20  e i-th index .  
cd20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
cd30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cd40: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
cd50: 2c 20 30 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  , 0, 7);.       
cd60: 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70   for(j=0, pIdx=p
cd70: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
cd80: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
cd90: 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ext, j++){.     
cda0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cdb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
cdc0: 65 67 65 72 2c 20 30 2c 20 38 2b 6a 29 3b 20 2f  eger, 0, 8+j); /
cdd0: 2a 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  * index entries 
cde0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
cdf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
ce00: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ert( pParse->nMe
ce10: 6d 3e 3d 38 2b 6a 20 29 3b 0a 20 20 20 20 20 20  m>=8+j );.      
ce20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ce30: 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28  3NoTempsInRange(
ce40: 70 50 61 72 73 65 2c 31 2c 37 2b 6a 29 20 29 3b  pParse,1,7+j) );
ce50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ce60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ce70: 5f 52 65 77 69 6e 64 2c 20 69 44 61 74 61 43 75  _Rewind, iDataCu
ce80: 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  r, 0); VdbeCover
ce90: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
cea0: 6c 6f 6f 70 54 6f 70 20 3d 20 73 71 6c 69 74 65  loopTop = sqlite
ceb0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cec0: 50 5f 41 64 64 49 6d 6d 2c 20 37 2c 20 31 29 3b  P_AddImm, 7, 1);
ced0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
cee0: 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  Quick ){.       
cef0: 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65     /* Sanity che
cf00: 63 6b 20 6f 6e 20 72 65 63 6f 72 64 20 68 65 61  ck on record hea
cf10: 64 65 72 20 64 65 63 6f 64 69 6e 67 20 2a 2f 0a  der decoding */.
cf20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cf30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
cf40: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 44 61 74 61 43  P_Column, iDataC
cf50: 75 72 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  ur, pTab->nCol-1
cf60: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
cf70: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
cf80: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
cf90: 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
cfa0: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 56    }.        /* V
cfb0: 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 4e  erify that all N
cfc0: 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
cfd0: 72 65 61 6c 6c 79 20 61 72 65 20 4e 4f 54 20 4e  really are NOT N
cfe0: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ULL */.        f
cff0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
d000: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
d010: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
d020: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
d030: 6a 6d 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  jmp2;.          
d040: 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( j==pTab->iPK
d050: 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ey ) continue;. 
d060: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61           if( pTa
d070: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75  b->aCol[j].notNu
d080: 6c 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ll==0 ) continue
d090: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d0a0: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
d0b0: 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
d0c0: 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 6a  Tab, iDataCur, j
d0d0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
d0e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d0f0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
d100: 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
d110: 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74      jmp2 = sqlit
d120: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d130: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 33 29 3b 20  OP_NotNull, 3); 
d140: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d150: 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 20  .          zErr 
d160: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
d170: 28 64 62 2c 20 22 4e 55 4c 4c 20 76 61 6c 75 65  (db, "NULL value
d180: 20 69 6e 20 25 73 2e 25 73 22 2c 20 70 54 61 62   in %s.%s", pTab
d190: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
d1c0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
d1d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d1e0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
d1f0: 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c  tring8, 0, 3, 0,
d200: 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49   zErr, P4_DYNAMI
d210: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  C);.          in
d220: 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75  tegrityCheckResu
d230: 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20  ltRow(v);.      
d240: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
d250: 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29  umpHere(v, jmp2)
d260: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d270: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 43 48      /* Verify CH
d280: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
d290: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
d2a0: 54 61 62 2d 3e 70 43 68 65 63 6b 20 26 26 20 28  Tab->pCheck && (
d2b0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
d2c0: 54 45 5f 49 67 6e 6f 72 65 43 68 65 63 6b 73 29  TE_IgnoreChecks)
d2d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
d2e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 65 63   ExprList *pChec
d2f0: 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  k = sqlite3ExprL
d300: 69 73 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  istDup(db, pTab-
d310: 3e 70 43 68 65 63 6b 2c 20 30 29 3b 0a 20 20 20  >pCheck, 0);.   
d320: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
d330: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
d340: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
d350: 74 20 61 64 64 72 43 6b 46 61 75 6c 74 20 3d 20  t addrCkFault = 
d360: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d370: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
d380: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64            int ad
d390: 64 72 43 6b 4f 6b 20 3d 20 73 71 6c 69 74 65 33  drCkOk = sqlite3
d3a0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
d3b0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
d3c0: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20     char *zErr;. 
d3d0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
d3e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  ;.            pP
d3f0: 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
d400: 20 69 44 61 74 61 43 75 72 20 2b 20 31 3b 0a 20   iDataCur + 1;. 
d410: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
d420: 3d 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72 2d 31  =pCheck->nExpr-1
d430: 3b 20 6b 3e 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20  ; k>0; k--){.   
d440: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d450: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
d460: 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b  arse, pCheck->a[
d470: 6b 5d 2e 70 45 78 70 72 2c 20 61 64 64 72 43 6b  k].pExpr, addrCk
d480: 46 61 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20  Fault, 0);.     
d490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d4a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d4b0: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
d4c0: 43 68 65 63 6b 2d 3e 61 5b 30 5d 2e 70 45 78 70  Check->a[0].pExp
d4d0: 72 2c 20 61 64 64 72 43 6b 4f 6b 2c 20 0a 20 20  r, addrCkOk, .  
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
d4f0: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
d500: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d510: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d520: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 46  Label(v, addrCkF
d530: 61 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ault);.         
d540: 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
d550: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
d560: 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69       zErr = sqli
d570: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
d580: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
d590: 20 66 61 69 6c 65 64 20 69 6e 20 25 73 22 2c 0a   failed in %s",.
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
d5c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d5d0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
d5e0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c  P_String8, 0, 3,
d5f0: 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e   0, zErr, P4_DYN
d600: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  AMIC);.         
d610: 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63     integrityChec
d620: 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20  kResultRow(v);. 
d630: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d640: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d650: 65 6c 28 76 2c 20 61 64 64 72 43 6b 4f 6b 29 3b  el(v, addrCkOk);
d660: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d670: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d680: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
d690: 20 70 43 68 65 63 6b 29 3b 0a 20 20 20 20 20 20   pCheck);.      
d6a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
d6b0: 21 69 73 51 75 69 63 6b 20 29 7b 20 2f 2a 20 4f  !isQuick ){ /* O
d6c0: 6d 69 74 20 74 68 65 20 72 65 6d 61 69 6e 69 6e  mit the remainin
d6d0: 67 20 74 65 73 74 73 20 66 6f 72 20 71 75 69 63  g tests for quic
d6e0: 6b 5f 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20  k_check */.     
d6f0: 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65       /* Validate
d700: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 66   index entries f
d710: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
d720: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ow */.          
d730: 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54  for(j=0, pIdx=pT
d740: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
d750: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
d760: 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, j++){.      
d770: 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 2c 20        int jmp2, 
d780: 6a 6d 70 33 2c 20 6a 6d 70 34 2c 20 6a 6d 70 35  jmp3, jmp4, jmp5
d790: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
d7a0: 74 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c 69 74  t ckUniq = sqlit
d7b0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d7c0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d7d0: 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49       if( pPk==pI
d7e0: 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  dx ) continue;. 
d7f0: 20 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20             r1 = 
d800: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
d810: 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
d820: 70 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20  pIdx, iDataCur, 
d830: 30 2c 20 30 2c 20 26 6a 6d 70 33 2c 0a 20 20 20  0, 0, &jmp3,.   
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20 72 31        pPrior, r1
d870: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
d880: 50 72 69 6f 72 20 3d 20 70 49 64 78 3b 0a 20 20  Prior = pIdx;.  
d890: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d8a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d8b0: 50 5f 41 64 64 49 6d 6d 2c 20 38 2b 6a 2c 20 31  P_AddImm, 8+j, 1
d8c0: 29 3b 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20 65  );/* increment e
d8d0: 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20  ntry count */.  
d8e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72            /* Ver
d8f0: 69 66 79 20 74 68 61 74 20 61 6e 20 69 6e 64 65  ify that an inde
d900: 78 20 65 6e 74 72 79 20 65 78 69 73 74 73 20 66  x entry exists f
d910: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
d920: 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 20 20  able row */.    
d930: 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20 73          jmp2 = s
d940: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
d950: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
d960: 20 69 49 64 78 43 75 72 2b 6a 2c 20 63 6b 55 6e   iIdxCur+j, ckUn
d970: 69 71 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20  iq, r1,.        
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 20  pIdx->nColumn); 
d9b0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d9c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d9d0: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
d9e0: 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77 20 22 29  ng(v, 3, "row ")
d9f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
da00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
da10: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 37 2c  v, OP_Concat, 7,
da20: 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20   3, 3);.        
da30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
da40: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20  oadString(v, 4, 
da50: 22 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 69  " missing from i
da60: 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20  ndex ");.       
da70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
da80: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
da90: 63 61 74 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20  cat, 4, 3, 3);. 
daa0: 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 35 20             jmp5 
dab0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61  = sqlite3VdbeLoa
dac0: 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 70 49  dString(v, 4, pI
dad0: 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
dae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
daf0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
db00: 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33 29  Concat, 4, 3, 3)
db10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ;.            jm
db20: 70 34 20 3d 20 69 6e 74 65 67 72 69 74 79 43 68  p4 = integrityCh
db30: 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b  eckResultRow(v);
db40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
db50: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
db60: 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20  (v, jmp2);.     
db70: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e         /* For UN
db80: 49 51 55 45 20 69 6e 64 65 78 65 73 2c 20 76 65  IQUE indexes, ve
db90: 72 69 66 79 20 74 68 61 74 20 6f 6e 6c 79 20 6f  rify that only o
dba0: 6e 65 20 65 6e 74 72 79 20 65 78 69 73 74 73 20  ne entry exists 
dbb0: 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 20  with the.       
dbc0: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
dbd0: 6b 65 79 2e 20 20 54 68 65 20 65 6e 74 72 79 20  key.  The entry 
dbe0: 69 73 20 75 6e 69 71 75 65 20 69 66 20 28 31 29  is unique if (1)
dbf0: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 4e   any column is N
dc00: 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ULL.            
dc10: 2a 2a 20 6f 72 20 28 32 29 20 74 68 65 20 6e 65  ** or (2) the ne
dc20: 78 74 20 65 6e 74 72 79 20 68 61 73 20 61 20 64  xt entry has a d
dc30: 69 66 66 65 72 65 6e 74 20 6b 65 79 20 2a 2f 0a  ifferent key */.
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
dc50: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
dc60: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dx) ){.         
dc70: 20 20 20 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20       int uniqOk 
dc80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
dc90: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
dcb0: 74 20 6a 6d 70 36 3b 0a 20 20 20 20 20 20 20 20  t jmp6;.        
dcc0: 20 20 20 20 20 20 69 6e 74 20 6b 6b 3b 0a 20 20        int kk;.  
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
dce0: 6b 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78 2d 3e 6e  kk=0; kk<pIdx->n
dcf0: 4b 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20  KeyCol; kk++){. 
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
dd10: 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt iCol = pIdx->
dd20: 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20  aiColumn[kk];.  
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
dd40: 73 65 72 74 28 20 69 43 6f 6c 21 3d 58 4e 5f 52  sert( iCol!=XN_R
dd50: 4f 57 49 44 20 26 26 20 69 43 6f 6c 3c 70 54 61  OWID && iCol<pTa
dd60: 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
dd70: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
dd80: 43 6f 6c 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e  Col>=0 && pTab->
dd90: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
dda0: 6c 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ll ) continue;. 
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
ddc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ddd0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
dde0: 31 2b 6b 6b 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20  1+kk, uniqOk);. 
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
de00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d                jm
de30: 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p6 = sqlite3Vdbe
de40: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 65 78  AddOp1(v, OP_Nex
de50: 74 2c 20 69 49 64 78 43 75 72 2b 6a 29 3b 20 56  t, iIdxCur+j); V
de60: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
de80: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
de90: 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20   uniqOk);.      
dea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
deb0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
dec0: 6d 70 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mp6);.          
ded0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dee0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
def0: 64 78 47 54 2c 20 69 49 64 78 43 75 72 2b 6a 2c  dxGT, iIdxCur+j,
df00: 20 75 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20 20 20   uniqOk, r1,.   
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20  pIdx->nKeyCol); 
df40: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
df50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
df60: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
df70: 72 69 6e 67 28 76 2c 20 33 2c 20 22 6e 6f 6e 2d  ring(v, 3, "non-
df80: 75 6e 69 71 75 65 20 65 6e 74 72 79 20 69 6e 20  unique entry in 
df90: 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20  index ");.      
dfa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dfb0: 64 62 65 47 6f 74 6f 28 76 2c 20 6a 6d 70 35 29  dbeGoto(v, jmp5)
dfc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
dfd0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
dfe0: 76 65 4c 61 62 65 6c 28 76 2c 20 75 6e 69 71 4f  veLabel(v, uniqO
dff0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
e000: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
e010: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
e020: 65 28 76 2c 20 6a 6d 70 34 29 3b 0a 20 20 20 20  e(v, jmp4);.    
e030: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
e040: 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62  esolvePartIdxLab
e050: 65 6c 28 70 50 61 72 73 65 2c 20 6a 6d 70 33 29  el(pParse, jmp3)
e060: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
e070: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e090: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 44  2(v, OP_Next, iD
e0a0: 61 74 61 43 75 72 2c 20 6c 6f 6f 70 54 6f 70 29  ataCur, loopTop)
e0b0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
e0c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e0d0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
e0e0: 2c 20 6c 6f 6f 70 54 6f 70 2d 31 29 3b 0a 23 69  , loopTop-1);.#i
e0f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e100: 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20  T_BTREECOUNT.   
e110: 20 20 20 20 20 69 66 28 20 21 69 73 51 75 69 63       if( !isQuic
e120: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  k ){.          s
e130: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
e140: 72 69 6e 67 28 76 2c 20 32 2c 20 22 77 72 6f 6e  ring(v, 2, "wron
e150: 67 20 23 20 6f 66 20 65 6e 74 72 69 65 73 20 69  g # of entries i
e160: 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20  n index ");.    
e170: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
e180: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
e190: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
e1a0: 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a  x->pNext, j++){.
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
e1c0: 70 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74  pPk==pIdx ) cont
e1d0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
e1e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e1f0: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
e200: 20 69 49 64 78 43 75 72 2b 6a 2c 20 33 29 3b 0a   iIdxCur+j, 3);.
e210: 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
e220: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e230: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 38  dOp3(v, OP_Eq, 8
e240: 2b 6a 2c 20 30 2c 20 33 29 3b 20 56 64 62 65 43  +j, 0, 3); VdbeC
e250: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
e260: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e270: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
e280: 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  QLITE_NOTNULL);.
e290: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e2a0: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
e2b0: 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e  g(v, 4, pIdx->zN
e2c0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
e2d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e2e0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
e2f0: 2c 20 34 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20  , 4, 2, 3);.    
e300: 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74          integrit
e310: 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28  yCheckResultRow(
e320: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
e330: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e340: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
e350: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e360: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
e370: 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
e380: 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7d 20  OUNT */.      } 
e390: 0a 20 20 20 20 7d 0a 20 20 20 20 7b 0a 20 20 20  .    }.    {.   
e3a0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e3b0: 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f  int iLn = VDBE_O
e3c0: 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b  FFSET_LINENO(2);
e3d0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
e3e0: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 65  nst VdbeOpList e
e3f0: 6e 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  ndCode[] = {.   
e400: 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d       { OP_AddImm
e410: 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ,      1, 0,    
e420: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20      0},    /* 0 
e430: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
e440: 49 66 4e 6f 74 5a 65 72 6f 2c 20 20 20 31 2c 20  IfNotZero,   1, 
e450: 34 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  4,        0},   
e460: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 20   /* 1 */.       
e470: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20   { OP_String8,  
e480: 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20     0, 3,        
e490: 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20  0},    /* 2 */. 
e4a0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75         { OP_Resu
e4b0: 6c 74 52 6f 77 2c 20 20 20 33 2c 20 31 2c 20 20  ltRow,   3, 1,  
e4c0: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
e4d0: 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  3 */.        { O
e4e0: 50 5f 48 61 6c 74 2c 20 20 20 20 20 20 20 20 30  P_Halt,        0
e4f0: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
e500: 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20     /* 4 */.     
e510: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c     { OP_String8,
e520: 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20       0, 3,      
e530: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 35 20 2a 2f    0},    /* 5 */
e540: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  .        { OP_Go
e550: 74 6f 2c 20 20 20 20 20 20 20 20 30 2c 20 33 2c  to,        0, 3,
e560: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
e570: 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a  * 6 */.      };.
e580: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f        VdbeOp *aO
e590: 70 3b 0a 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  p;..      aOp = 
e5a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e5b0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
e5c0: 65 28 65 6e 64 43 6f 64 65 29 2c 20 65 6e 64 43  e(endCode), endC
e5d0: 6f 64 65 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20  ode, iLn);.     
e5e0: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20   if( aOp ){.    
e5f0: 20 20 20 20 61 4f 70 5b 30 5d 2e 70 32 20 3d 20      aOp[0].p2 = 
e600: 31 2d 6d 78 45 72 72 3b 0a 20 20 20 20 20 20 20  1-mxErr;.       
e610: 20 61 4f 70 5b 32 5d 2e 70 34 74 79 70 65 20 3d   aOp[2].p4type =
e620: 20 50 34 5f 53 54 41 54 49 43 3b 0a 20 20 20 20   P4_STATIC;.    
e630: 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 2e 7a 20      aOp[2].p4.z 
e640: 3d 20 22 6f 6b 22 3b 0a 20 20 20 20 20 20 20 20  = "ok";.        
e650: 61 4f 70 5b 35 5d 2e 70 34 74 79 70 65 20 3d 20  aOp[5].p4type = 
e660: 50 34 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 20  P4_STATIC;.     
e670: 20 20 20 61 4f 70 5b 35 5d 2e 70 34 2e 7a 20 3d     aOp[5].p4.z =
e680: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 45   (char*)sqlite3E
e690: 72 72 53 74 72 28 53 51 4c 49 54 45 5f 43 4f 52  rrStr(SQLITE_COR
e6a0: 52 55 50 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  RUPT);.      }. 
e6b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e6c0: 43 68 61 6e 67 65 50 33 28 76 2c 20 30 2c 20 73  ChangeP3(v, 0, s
e6d0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
e6e0: 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20  tAddr(v)-2);.   
e6f0: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
e700: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e710: 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
e720: 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
e730: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
e740: 46 31 36 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  F16.  /*.  **   
e750: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 0a  PRAGMA encoding.
e760: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e    **   PRAGMA en
e770: 63 6f 64 69 6e 67 20 3d 20 22 75 74 66 2d 38 22  coding = "utf-8"
e780: 7c 22 75 74 66 2d 31 36 22 7c 22 75 74 66 2d 31  |"utf-16"|"utf-1
e790: 36 6c 65 22 7c 22 75 74 66 2d 31 36 62 65 22 0a  6le"|"utf-16be".
e7a0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 69 74 73    **.  ** In its
e7b0: 20 66 69 72 73 74 20 66 6f 72 6d 2c 20 74 68 69   first form, thi
e7c0: 73 20 70 72 61 67 6d 61 20 72 65 74 75 72 6e 73  s pragma returns
e7d0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66   the encoding of
e7e0: 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 64   the main.  ** d
e7f0: 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
e800: 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
e810: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 69 74 20  initialized, it 
e820: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6e  is initialized n
e830: 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ow..  **.  ** Th
e840: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 6f 66  e second form of
e850: 20 74 68 69 73 20 70 72 61 67 6d 61 20 69 73 20   this pragma is 
e860: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6d  a no-op if the m
e870: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
e880: 65 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61  e.  ** has not a
e890: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 69 74  lready been init
e8a0: 69 61 6c 69 7a 65 64 2e 20 49 6e 20 74 68 69 73  ialized. In this
e8b0: 20 63 61 73 65 20 69 74 20 73 65 74 73 20 74 68   case it sets th
e8c0: 65 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 65  e default.  ** e
e8d0: 6e 63 6f 64 69 6e 67 20 74 68 61 74 20 77 69 6c  ncoding that wil
e8e0: 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  l be used for th
e8f0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
e900: 66 69 6c 65 20 69 66 20 61 20 6e 65 77 20 66 69  file if a new fi
e910: 6c 65 0a 20 20 2a 2a 20 69 73 20 63 72 65 61 74  le.  ** is creat
e920: 65 64 2e 20 49 66 20 61 6e 20 65 78 69 73 74 69  ed. If an existi
e930: 6e 67 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  ng main database
e940: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c   file is opened,
e950: 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 64   then the.  ** d
e960: 65 66 61 75 6c 74 20 74 65 78 74 20 65 6e 63 6f  efault text enco
e970: 64 69 6e 67 20 66 6f 72 20 74 68 65 20 65 78 69  ding for the exi
e980: 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 69  sting database i
e990: 73 20 75 73 65 64 2e 0a 20 20 2a 2a 20 0a 20 20  s used..  ** .  
e9a0: 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 20  ** In all cases 
e9b0: 6e 65 77 20 64 61 74 61 62 61 73 65 73 20 63 72  new databases cr
e9c0: 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
e9d0: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 20 61  ATTACH command a
e9e0: 72 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  re.  ** created 
e9f0: 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  to use the same 
ea00: 64 65 66 61 75 6c 74 20 74 65 78 74 20 65 6e 63  default text enc
ea10: 6f 64 69 6e 67 20 61 73 20 74 68 65 20 6d 61 69  oding as the mai
ea20: 6e 20 64 61 74 61 62 61 73 65 2e 20 49 66 0a 20  n database. If. 
ea30: 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74   ** the main dat
ea40: 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 62 65  abase has not be
ea50: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  en initialized a
ea60: 6e 64 2f 6f 72 20 63 72 65 61 74 65 64 20 77 68  nd/or created wh
ea70: 65 6e 20 41 54 54 41 43 48 0a 20 20 2a 2a 20 69  en ATTACH.  ** i
ea80: 73 20 65 78 65 63 75 74 65 64 2c 20 74 68 69 73  s executed, this
ea90: 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
eaa0: 74 68 65 20 41 54 54 41 43 48 20 6f 70 65 72 61  the ATTACH opera
eab0: 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion..  **.  ** 
eac0: 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f  In the second fo
ead0: 72 6d 20 74 68 69 73 20 70 72 61 67 6d 61 20 73  rm this pragma s
eae0: 65 74 73 20 74 68 65 20 74 65 78 74 20 65 6e 63  ets the text enc
eaf0: 6f 64 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64  oding to be used
eb00: 20 69 6e 0a 20 20 2a 2a 20 6e 65 77 20 64 61 74   in.  ** new dat
eb10: 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61  abase files crea
eb20: 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
eb30: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
eb40: 49 74 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20  It is only.  ** 
eb50: 75 73 65 66 75 6c 20 69 66 20 69 6e 76 6f 6b 65  useful if invoke
eb60: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  d immediately af
eb70: 74 65 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ter the main dat
eb80: 61 62 61 73 65 20 69 0a 20 20 2a 2f 0a 20 20 63  abase i.  */.  c
eb90: 61 73 65 20 50 72 61 67 54 79 70 5f 45 4e 43 4f  ase PragTyp_ENCO
eba0: 44 49 4e 47 3a 20 7b 0a 20 20 20 20 73 74 61 74  DING: {.    stat
ebb0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
ebc0: 45 6e 63 4e 61 6d 65 20 7b 0a 20 20 20 20 20 20  EncName {.      
ebd0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
ebe0: 20 20 20 75 38 20 65 6e 63 3b 0a 20 20 20 20 7d     u8 enc;.    }
ebf0: 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b 0a   encnames[] = {.
ec00: 20 20 20 20 20 20 7b 20 22 55 54 46 38 22 2c 20        { "UTF8", 
ec10: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
ec20: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
ec30: 7b 20 22 55 54 46 2d 38 22 2c 20 20 20 20 53 51  { "UTF-8",    SQ
ec40: 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20 20 20  LITE_UTF8       
ec50: 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20   },  /* Must be 
ec60: 65 6c 65 6d 65 6e 74 20 5b 31 5d 20 2a 2f 0a 20  element [1] */. 
ec70: 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 6c 65       { "UTF-16le
ec80: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
ec90: 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73  E     },  /* Mus
eca0: 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 32 5d  t be element [2]
ecb0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46   */.      { "UTF
ecc0: 2d 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f 55  -16be", SQLITE_U
ecd0: 54 46 31 36 42 45 20 20 20 20 20 7d 2c 20 20 2f  TF16BE     },  /
ece0: 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e  * Must be elemen
ecf0: 74 20 5b 33 5d 20 2a 2f 0a 20 20 20 20 20 20 7b  t [3] */.      {
ed00: 20 22 55 54 46 31 36 6c 65 22 2c 20 20 53 51 4c   "UTF16le",  SQL
ed10: 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20  ITE_UTF16LE     
ed20: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31  },.      { "UTF1
ed30: 36 62 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54  6be",  SQLITE_UT
ed40: 46 31 36 42 45 20 20 20 20 20 7d 2c 0a 20 20 20  F16BE     },.   
ed50: 20 20 20 7b 20 22 55 54 46 2d 31 36 22 2c 20 20     { "UTF-16",  
ed60: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
ed70: 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45      }, /* SQLITE
ed80: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a  _UTF16NATIVE */.
ed90: 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 22 2c        { "UTF16",
eda0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
edb0: 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c         }, /* SQL
edc0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
edd0: 2a 2f 0a 20 20 20 20 20 20 7b 20 30 2c 20 30 20  */.      { 0, 0 
ede0: 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 6f 6e  }.    };.    con
edf0: 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d  st struct EncNam
ee00: 65 20 2a 70 45 6e 63 3b 0a 20 20 20 20 69 66 28  e *pEnc;.    if(
ee10: 20 21 7a 52 69 67 68 74 20 29 7b 20 20 20 20 2f   !zRight ){    /
ee20: 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69  * "PRAGMA encodi
ee30: 6e 67 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ng" */.      if(
ee40: 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
ee50: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
ee60: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
ee70: 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e      assert( encn
ee80: 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 38  ames[SQLITE_UTF8
ee90: 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ].enc==SQLITE_UT
eea0: 46 38 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  F8 );.      asse
eeb0: 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c  rt( encnames[SQL
eec0: 49 54 45 5f 55 54 46 31 36 4c 45 5d 2e 65 6e 63  ITE_UTF16LE].enc
eed0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
eee0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
eef0: 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54  ( encnames[SQLIT
ef00: 45 5f 55 54 46 31 36 42 45 5d 2e 65 6e 63 3d 3d  E_UTF16BE].enc==
ef10: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
ef20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
ef30: 6e 67 6c 65 54 65 78 74 28 76 2c 20 65 6e 63 6e  ngleText(v, encn
ef40: 61 6d 65 73 5b 45 4e 43 28 70 50 61 72 73 65 2d  ames[ENC(pParse-
ef50: 3e 64 62 29 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >db)].zName);.  
ef60: 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64  /* "PRAGMA encod
ef90: 69 6e 67 20 3d 20 58 58 58 22 20 2a 2f 0a 20 20  ing = XXX" */.  
efa0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 63 68 61 6e      /* Only chan
efb0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
efc0: 73 71 6c 69 74 65 2e 65 6e 63 20 69 66 20 74 68  sqlite.enc if th
efd0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
efe0: 65 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  e is not.      *
eff0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49  * initialized. I
f000: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
f010: 61 73 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ase exists, the 
f020: 6e 65 77 20 73 71 6c 69 74 65 2e 65 6e 63 20 76  new sqlite.enc v
f030: 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 77 69  alue.      ** wi
f040: 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
f050: 6e 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  n when the schem
f060: 61 20 69 73 20 6e 65 78 74 20 6c 6f 61 64 65 64  a is next loaded
f070: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
f080: 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
f090: 79 20 65 78 69 73 74 73 2c 20 69 74 20 77 69 6c  y exists, it wil
f0a0: 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f 20  l be created to 
f0b0: 75 73 65 20 74 68 65 20 6e 65 77 20 65 6e 63 6f  use the new enco
f0c0: 64 69 6e 67 20 76 61 6c 75 65 2e 0a 20 20 20 20  ding value..    
f0d0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 0a    */.      if( .
f0e0: 20 20 20 20 20 20 20 20 21 28 44 62 48 61 73 50          !(DbHasP
f0f0: 72 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20 44  roperty(db, 0, D
f100: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 29  B_SchemaLoaded))
f110: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 44 62 48   || .        DbH
f120: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 30  asProperty(db, 0
f130: 2c 20 44 42 5f 45 6d 70 74 79 29 20 0a 20 20 20  , DB_Empty) .   
f140: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f     ){.        fo
f150: 72 28 70 45 6e 63 3d 26 65 6e 63 6e 61 6d 65 73  r(pEnc=&encnames
f160: 5b 30 5d 3b 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65  [0]; pEnc->zName
f170: 3b 20 70 45 6e 63 2b 2b 29 7b 0a 20 20 20 20 20  ; pEnc++){.     
f180: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
f190: 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68  te3StrICmp(zRigh
f1a0: 74 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 29 20  t, pEnc->zName) 
f1b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
f1c0: 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 20 3d 20  CHEMA_ENC(db) = 
f1d0: 45 4e 43 28 64 62 29 20 3d 0a 20 20 20 20 20 20  ENC(db) =.      
f1e0: 20 20 20 20 20 20 20 20 20 20 70 45 6e 63 2d 3e            pEnc->
f1f0: 65 6e 63 20 3f 20 70 45 6e 63 2d 3e 65 6e 63 20  enc ? pEnc->enc 
f200: 3a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  : SQLITE_UTF16NA
f210: 54 49 56 45 3b 0a 20 20 20 20 20 20 20 20 20 20  TIVE;.          
f220: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
f230: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
f240: 20 20 20 20 20 20 20 69 66 28 20 21 70 45 6e 63         if( !pEnc
f250: 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ->zName ){.     
f260: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f270: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
f280: 73 75 70 70 6f 72 74 65 64 20 65 6e 63 6f 64 69  supported encodi
f290: 6e 67 3a 20 25 73 22 2c 20 7a 52 69 67 68 74 29  ng: %s", zRight)
f2a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f2b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
f2c0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
f2d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
f2e0: 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  16 */..#ifndef S
f2f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
f300: 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41  A_VERSION_PRAGMA
f310: 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  S.  /*.  **   PR
f320: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63  AGMA [schema.]sc
f330: 68 65 6d 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a  hema_version.  *
f340: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
f350: 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69  ma.]schema_versi
f360: 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20  on = <integer>. 
f370: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
f380: 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f  A [schema.]user_
f390: 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50  version.  **   P
f3a0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75  RAGMA [schema.]u
f3b0: 73 65 72 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69  ser_version = <i
f3c0: 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a  nteger>.  **.  *
f3d0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
f3e0: 6d 61 2e 5d 66 72 65 65 6c 69 73 74 5f 63 6f 75  ma.]freelist_cou
f3f0: 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50  nt.  **.  **   P
f400: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64  RAGMA [schema.]d
f410: 61 74 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a  ata_version.  **
f420: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
f430: 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74  schema.]applicat
f440: 69 6f 6e 5f 69 64 0a 20 20 2a 2a 20 20 20 50 52  ion_id.  **   PR
f450: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70  AGMA [schema.]ap
f460: 70 6c 69 63 61 74 69 6f 6e 5f 69 64 20 3d 20 3c  plication_id = <
f470: 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20  integer>.  **.  
f480: 2a 2a 20 54 68 65 20 70 72 61 67 6d 61 27 73 20  ** The pragma's 
f490: 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 61  schema_version a
f4a0: 6e 64 20 75 73 65 72 5f 76 65 72 73 69 6f 6e 20  nd user_version 
f4b0: 61 72 65 20 75 73 65 64 20 74 6f 20 73 65 74 20  are used to set 
f4c0: 6f 72 20 67 65 74 0a 20 20 2a 2a 20 74 68 65 20  or get.  ** the 
f4d0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 63 68  value of the sch
f4e0: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20  ema-version and 
f4f0: 75 73 65 72 2d 76 65 72 73 69 6f 6e 2c 20 72 65  user-version, re
f500: 73 70 65 63 74 69 76 65 6c 79 2e 20 42 6f 74 68  spectively. Both
f510: 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
f520: 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20 74 68 65  -version and the
f530: 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 61 72   user-version ar
f540: 65 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20  e 32-bit signed 
f550: 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 73 74  integers.  ** st
f560: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
f570: 62 61 73 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  base header..  *
f580: 2a 0a 20 20 2a 2a 20 54 68 65 20 73 63 68 65 6d  *.  ** The schem
f590: 61 2d 63 6f 6f 6b 69 65 20 69 73 20 75 73 75 61  a-cookie is usua
f5a0: 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  lly only manipul
f5b0: 61 74 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  ated internally 
f5c0: 62 79 20 53 51 4c 69 74 65 2e 20 49 74 0a 20 20  by SQLite. It.  
f5d0: 2a 2a 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ** is incremente
f5e0: 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
f5f0: 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73  ever the databas
f600: 65 20 73 63 68 65 6d 61 20 69 73 20 6d 6f 64 69  e schema is modi
f610: 66 69 65 64 20 28 62 79 0a 20 20 2a 2a 20 63 72  fied (by.  ** cr
f620: 65 61 74 69 6e 67 20 6f 72 20 64 72 6f 70 70 69  eating or droppi
f630: 6e 67 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  ng a table or in
f640: 64 65 78 29 2e 20 54 68 65 20 73 63 68 65 6d 61  dex). The schema
f650: 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73 65 64   version is used
f660: 20 62 79 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20   by.  ** SQLite 
f670: 65 61 63 68 20 74 69 6d 65 20 61 20 71 75 65 72  each time a quer
f680: 79 20 69 73 20 65 78 65 63 75 74 65 64 20 74 6f  y is executed to
f690: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
f6a0: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 0a   internal cache.
f6b0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 68 65    ** of the sche
f6c0: 6d 61 20 75 73 65 64 20 77 68 65 6e 20 63 6f 6d  ma used when com
f6d0: 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 71  piling the SQL q
f6e0: 75 65 72 79 20 6d 61 74 63 68 65 73 20 74 68 65  uery matches the
f6f0: 20 73 63 68 65 6d 61 20 6f 66 0a 20 20 2a 2a 20   schema of.  ** 
f700: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 67 61  the database aga
f710: 69 6e 73 74 20 77 68 69 63 68 20 74 68 65 20 63  inst which the c
f720: 6f 6d 70 69 6c 65 64 20 71 75 65 72 79 20 69 73  ompiled query is
f730: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
f740: 65 64 2e 0a 20 20 2a 2a 20 53 75 62 76 65 72 74  ed..  ** Subvert
f750: 69 6e 67 20 74 68 69 73 20 6d 65 63 68 61 6e 69  ing this mechani
f760: 73 6d 20 62 79 20 75 73 69 6e 67 20 22 50 52 41  sm by using "PRA
f770: 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69  GMA schema_versi
f780: 6f 6e 22 20 74 6f 20 6d 6f 64 69 66 79 0a 20 20  on" to modify.  
f790: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65  ** the schema-ve
f7a0: 72 73 69 6f 6e 20 69 73 20 70 6f 74 65 6e 74 69  rsion is potenti
f7b0: 61 6c 6c 79 20 64 61 6e 67 65 72 6f 75 73 20 61  ally dangerous a
f7c0: 6e 64 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 70  nd may lead to p
f7d0: 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 63 72 61 73  rogram.  ** cras
f7e0: 68 65 73 20 6f 72 20 64 61 74 61 62 61 73 65 20  hes or database 
f7f0: 63 6f 72 72 75 70 74 69 6f 6e 2e 20 55 73 65 20  corruption. Use 
f800: 77 69 74 68 20 63 61 75 74 69 6f 6e 21 0a 20 20  with caution!.  
f810: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 75 73 65 72  **.  ** The user
f820: 2d 76 65 72 73 69 6f 6e 20 69 73 20 6e 6f 74 20  -version is not 
f830: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
f840: 62 79 20 53 51 4c 69 74 65 2e 20 49 74 20 6d 61  by SQLite. It ma
f850: 79 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a  y be used by.  *
f860: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 66  * applications f
f870: 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 2e 0a  or any purpose..
f880: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
f890: 54 79 70 5f 48 45 41 44 45 52 5f 56 41 4c 55 45  Typ_HEADER_VALUE
f8a0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f  : {.    int iCoo
f8b0: 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  kie;            
f8c0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
f8d0: 6f 6f 6b 69 65 20 74 6f 20 72 65 61 64 20 6f 72  ookie to read or
f8e0: 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 69 43   write */.    iC
f8f0: 6f 6f 6b 69 65 20 3d 20 70 50 72 61 67 6d 61 2d  ookie = pPragma-
f900: 3e 69 41 72 67 20 26 20 50 52 41 47 4d 41 5f 48  >iArg & PRAGMA_H
f910: 45 41 44 45 52 5f 56 41 4c 55 45 5f 4d 41 53 4b  EADER_VALUE_MASK
f920: 3b 20 20 20 20 20 0a 20 20 20 20 73 71 6c 69 74  ;     .    sqlit
f930: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
f940: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28  v, iDb);.    if(
f950: 20 7a 52 69 67 68 74 20 26 26 20 28 70 50 72 61   zRight && (pPra
f960: 67 6d 61 2d 3e 69 41 72 67 20 26 20 50 52 41 47  gma->iArg & PRAG
f970: 4d 41 5f 48 45 41 44 45 52 5f 56 41 4c 55 45 5f  MA_HEADER_VALUE_
f980: 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  READONLY)==0 ){.
f990: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
f9a0: 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f  he specified coo
f9b0: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  kie value */.   
f9c0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f9d0: 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74 43 6f  VdbeOpList setCo
f9e0: 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  okie[] = {.     
f9f0: 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74     { OP_Transact
fa00: 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31 2c 20 20  ion,    0,  1,  
fa10: 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20  0},    /* 0 */. 
fa20: 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43         { OP_SetC
fa30: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20  ookie,      0,  
fa40: 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20  0,  0},    /* 1 
fa50: 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  */.      };.    
fa60: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
fa70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fa80: 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65  VerifyNoMallocRe
fa90: 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79 53  quired(v, ArrayS
faa0: 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 29 3b  ize(setCookie));
fab0: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c  .      aOp = sql
fac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
fad0: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  t(v, ArraySize(s
fae0: 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43 6f  etCookie), setCo
faf0: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  okie, 0);.      
fb00: 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c  if( ONLY_IF_REAL
fb10: 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d  LOC_STRESS(aOp==
fb20: 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  0) ) break;.    
fb30: 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44    aOp[0].p1 = iD
fb40: 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e  b;.      aOp[1].
fb50: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
fb60: 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69 43 6f 6f  aOp[1].p2 = iCoo
fb70: 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  kie;.      aOp[1
fb80: 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65 33 41 74  ].p3 = sqlite3At
fb90: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
fba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
fbb0: 52 65 61 64 20 74 68 65 20 73 70 65 63 69 66 69  Read the specifi
fbc0: 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  ed cookie value 
fbd0: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
fbe0: 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
fbf0: 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d 20 3d 20   readCookie[] = 
fc00: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54  {.        { OP_T
fc10: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20  ransaction,     
fc20: 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f  0,  0,  0},    /
fc30: 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 0 */.        {
fc40: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
fc50: 20 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c       0,  1,  0},
fc60: 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20      /* 1 */.    
fc70: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
fc80: 6f 77 2c 20 20 20 20 20 20 20 31 2c 20 20 31 2c  ow,       1,  1,
fc90: 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b 0a 20 20    0}.      };.  
fca0: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
fcb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fcc0: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
fcd0: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
fce0: 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65  ySize(readCookie
fcf0: 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  ));.      aOp = 
fd00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fd10: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
fd20: 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 2c 72 65  e(readCookie),re
fd30: 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20 20 20  adCookie,0);.   
fd40: 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52     if( ONLY_IF_R
fd50: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f  EALLOC_STRESS(aO
fd60: 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20  p==0) ) break;. 
fd70: 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d       aOp[0].p1 =
fd80: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
fd90: 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20  1].p1 = iDb;.   
fda0: 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 69     aOp[1].p3 = i
fdb0: 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 73 71  Cookie;.      sq
fdc0: 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62 6c  lite3VdbeReusabl
fdd0: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(v);.    }.  }.
fde0: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
fdf0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
fe00: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52  CHEMA_VERSION_PR
fe10: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
fe20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
fe30: 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
fe40: 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  S.  /*.  **   PR
fe50: 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f 70 74  AGMA compile_opt
fe60: 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ions.  **.  ** R
fe70: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 73 20  eturn the names 
fe80: 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 2d 74  of all compile-t
fe90: 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75 73 65 64  ime options used
fea0: 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 0a   in this build,.
feb0: 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f 6e 20    ** one option 
fec0: 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20  per row..  */.  
fed0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4d  case PragTyp_COM
fee0: 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20 7b 0a  PILE_OPTIONS: {.
fef0: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
ff00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ff10: 4f 70 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Opt;.    pParse-
ff20: 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20 20 77  >nMem = 1;.    w
ff30: 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20 73 71  hile( (zOpt = sq
ff40: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
ff50: 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21 3d 30  ion_get(i++))!=0
ff60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ff70: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
ff80: 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20 20 20  v, 1, zOpt);.   
ff90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ffa0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
ffb0: 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20  tRow, 1, 1);.   
ffc0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
ffd0: 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20  beReusable(v);. 
ffe0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
fff0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10000 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f  T_COMPILEOPTION_
10010 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  DIAGS */..#ifnde
10020 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
10030 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  L.  /*.  **   PR
10040 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 77 61  AGMA [schema.]wa
10050 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 70  l_checkpoint = p
10060 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72 65 73 74  assive|full|rest
10070 61 72 74 7c 74 72 75 6e 63 61 74 65 0a 20 20 2a  art|truncate.  *
10080 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  *.  ** Checkpoin
10090 74 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  t the database..
100a0 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
100b0 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b 50 4f 49  Typ_WAL_CHECKPOI
100c0 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 42  NT: {.    int iB
100d0 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69 44 62  t = (pId2->z?iDb
100e0 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  :SQLITE_MAX_ATTA
100f0 43 48 45 44 29 3b 0a 20 20 20 20 69 6e 74 20 65  CHED);.    int e
10100 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48  Mode = SQLITE_CH
10110 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
10120 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
10130 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
10140 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69  lite3StrICmp(zRi
10150 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d 30 20  ght, "full")==0 
10160 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
10170 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50   = SQLITE_CHECKP
10180 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  OINT_FULL;.     
10190 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
101a0 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74  e3StrICmp(zRight
101b0 2c 20 22 72 65 73 74 61 72 74 22 29 3d 3d 30 20  , "restart")==0 
101c0 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
101d0 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50   = SQLITE_CHECKP
101e0 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a 20 20  OINT_RESTART;.  
101f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
10200 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69  lite3StrICmp(zRi
10210 67 68 74 2c 20 22 74 72 75 6e 63 61 74 65 22 29  ght, "truncate")
10220 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
10230 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48  Mode = SQLITE_CH
10240 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
10250 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
10260 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
10270 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71 6c 69 74  m = 3;.    sqlit
10280 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10290 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69  OP_Checkpoint, i
102a0 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a 20  Bt, eMode, 1);. 
102b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
102c0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
102d0 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 7d  tRow, 1, 3);.  }
102e0 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a 0a  .  break;..  /*.
102f0 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61    **   PRAGMA wa
10300 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
10310 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77  .  **   PRAGMA w
10320 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
10330 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t = N.  **.  ** 
10340 43 6f 6e 66 69 67 75 72 65 20 61 20 64 61 74 61  Configure a data
10350 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
10360 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
10370 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 20 64 61   checkpoint a da
10380 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 66 74 65  tabase.  ** afte
10390 72 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 4e  r accumulating N
103a0 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
103b0 6f 67 2e 20 4f 72 20 71 75 65 72 79 20 66 6f 72  og. Or query for
103c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
103d0 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20 20  ue.  ** of N..  
103e0 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
103f0 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50  p_WAL_AUTOCHECKP
10400 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 66 28 20  OINT: {.    if( 
10410 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
10420 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
10430 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 73  checkpoint(db, s
10440 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
10450 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  t));.    }.    r
10460 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
10470 2c 20 0a 20 20 20 20 20 20 20 64 62 2d 3e 78 57  , .       db->xW
10480 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73 71 6c 69  alCallback==sqli
10490 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
104a0 6b 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20  k ? .           
104b0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
104c0 54 28 64 62 2d 3e 70 57 61 6c 41 72 67 29 20 3a  T(db->pWalArg) :
104d0 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b   0);.  }.  break
104e0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  ;.#endif..  /*. 
104f0 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 68 72 69   **  PRAGMA shri
10500 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a 0a 20  nk_memory.  **. 
10510 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
10520 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34 35 2d 34  ON-OF: R-23445-4
10530 36 31 30 39 20 54 68 69 73 20 70 72 61 67 6d 61  6109 This pragma
10540 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
10550 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63  base.  ** connec
10560 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68 20 69 74  tion on which it
10570 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 66   is invoked to f
10580 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
10590 65 6d 6f 72 79 20 61 73 20 69 74 0a 20 20 2a 2a  emory as it.  **
105a0 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c 69 6e 67   can, by calling
105b0 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65   sqlite3_db_rele
105c0 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 20 20  ase_memory()..  
105d0 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
105e0 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52 59 3a  p_SHRINK_MEMORY:
105f0 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64   {.    sqlite3_d
10600 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
10610 28 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  (db);.    break;
10620 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
10630 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a 65   PRAGMA optimize
10640 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70  .  **  PRAGMA op
10650 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20 2a  timize(MASK).  *
10660 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61  *  PRAGMA schema
10670 2e 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20 20  .optimize.  **  
10680 50 52 41 47 4d 41 20 73 63 68 65 6d 61 2e 6f 70  PRAGMA schema.op
10690 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20 2a  timize(MASK).  *
106a0 2a 0a 20 20 2a 2a 20 41 74 74 65 6d 70 74 20 74  *.  ** Attempt t
106b0 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 64  o optimize the d
106c0 61 74 61 62 61 73 65 2e 20 20 41 6c 6c 20 73 63  atabase.  All sc
106d0 68 65 6d 61 73 20 61 72 65 20 6f 70 74 69 6d 69  hemas are optimi
106e0 7a 65 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  zed in the first
106f0 0a 20 20 2a 2a 20 74 77 6f 20 66 6f 72 6d 73 2c  .  ** two forms,
10700 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 20 73 70   and only the sp
10710 65 63 69 66 69 65 64 20 73 63 68 65 6d 61 20 69  ecified schema i
10720 73 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e 20 74  s optimized in t
10730 68 65 20 6c 61 74 74 65 72 20 74 77 6f 2e 0a 20  he latter two.. 
10740 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 74   **.  ** The det
10750 61 69 6c 73 20 6f 66 20 6f 70 74 69 6d 69 7a 61  ails of optimiza
10760 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
10770 62 79 20 74 68 69 73 20 70 72 61 67 6d 61 20 61  by this pragma a
10780 72 65 20 65 78 70 65 63 74 65 64 0a 20 20 2a 2a  re expected.  **
10790 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 64 20 69   to change and i
107a0 6d 70 72 6f 76 65 20 6f 76 65 72 20 74 69 6d 65  mprove over time
107b0 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20  .  Applications 
107c0 73 68 6f 75 6c 64 20 61 6e 74 69 63 69 70 61 74  should anticipat
107d0 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 69 73  e that.  ** this
107e0 20 70 72 61 67 6d 61 20 77 69 6c 6c 20 70 65 72   pragma will per
107f0 66 6f 72 6d 20 6e 65 77 20 6f 70 74 69 6d 69 7a  form new optimiz
10800 61 74 69 6f 6e 73 20 69 6e 20 66 75 74 75 72 65  ations in future
10810 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a 2a 0a   releases..  **.
10820 20 20 2a 2a 20 54 68 65 20 6f 70 74 69 6f 6e 61    ** The optiona
10830 6c 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  l argument is a 
10840 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
10850 69 7a 61 74 69 6f 6e 73 20 74 6f 20 70 65 72 66  izations to perf
10860 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
10870 20 20 30 78 30 30 30 31 20 20 20 20 44 65 62 75    0x0001    Debu
10880 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 44 6f 20  gging mode.  Do 
10890 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 70 65 72  not actually per
108a0 66 6f 72 6d 20 61 6e 79 20 6f 70 74 69 6d 69 7a  form any optimiz
108b0 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 20 20 20 20  ations.  **     
108c0 20 20 20 20 20 20 20 20 20 62 75 74 20 69 6e 73           but ins
108d0 74 65 61 64 20 72 65 74 75 72 6e 20 6f 6e 65 20  tead return one 
108e0 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 6f 72  line of text for
108f0 20 65 61 63 68 20 6f 70 74 69 6d 69 7a 61 74 69   each optimizati
10900 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  on.  **         
10910 20 20 20 20 20 74 68 61 74 20 77 6f 75 6c 64 20       that would 
10920 68 61 76 65 20 62 65 65 6e 20 64 6f 6e 65 2e 20  have been done. 
10930 20 4f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   Off by default.
10940 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78  .  **.  **    0x
10950 30 30 30 32 20 20 20 20 52 75 6e 20 41 4e 41 4c  0002    Run ANAL
10960 59 5a 45 20 6f 6e 20 74 61 62 6c 65 73 20 74 68  YZE on tables th
10970 61 74 20 6d 69 67 68 74 20 62 65 6e 65 66 69 74  at might benefit
10980 2e 20 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74  .  On by default
10990 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  ..  **          
109a0 20 20 20 20 53 65 65 20 62 65 6c 6f 77 20 66 6f      See below fo
109b0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
109c0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20  ormation..  **. 
109d0 20 2a 2a 20 20 20 20 30 78 30 30 30 34 20 20 20   **    0x0004   
109e0 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d   (Not yet implem
109f0 65 6e 74 65 64 29 20 52 65 63 6f 72 64 20 75 73  ented) Record us
10a00 61 67 65 20 61 6e 64 20 70 65 72 66 6f 72 6d 61  age and performa
10a10 6e 63 65 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  nce .  **       
10a20 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69         informati
10a30 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  on from the curr
10a40 65 6e 74 20 73 65 73 73 69 6f 6e 20 69 6e 20 74  ent session in t
10a50 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  he.  **         
10a60 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
10a70 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  le so that it wi
10a80 6c 6c 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20  ll be available 
10a90 74 6f 20 22 6f 70 74 69 6d 69 7a 65 22 0a 20 20  to "optimize".  
10aa0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10ab0 70 72 61 67 6d 61 73 20 72 75 6e 20 62 79 20 66  pragmas run by f
10ac0 75 74 75 72 65 20 64 61 74 61 62 61 73 65 20 63  uture database c
10ad0 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  onnections..  **
10ae0 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 38 20  .  **    0x0008 
10af0 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c     (Not yet impl
10b00 65 6d 65 6e 74 65 64 29 20 43 72 65 61 74 65 20  emented) Create 
10b10 69 6e 64 65 78 65 73 20 74 68 61 74 20 6d 69 67  indexes that mig
10b20 68 74 20 68 61 76 65 0a 20 20 2a 2a 20 20 20 20  ht have.  **    
10b30 20 20 20 20 20 20 20 20 20 20 62 65 65 6e 20 68            been h
10b40 65 6c 70 66 75 6c 20 74 6f 20 72 65 63 65 6e 74  elpful to recent
10b50 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 0a 20 20   queries.  **.  
10b60 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 4d  ** The default M
10b70 41 53 4b 20 69 73 20 61 6e 64 20 61 6c 77 61 79  ASK is and alway
10b80 73 20 73 68 61 6c 6c 20 62 65 20 30 78 66 66 66  s shall be 0xfff
10b90 65 2e 20 20 30 78 66 66 66 65 20 6d 65 61 6e 73  e.  0xfffe means
10ba0 20 70 65 72 66 6f 72 6d 20 61 6c 6c 0a 20 20 2a   perform all.  *
10bb0 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * of the optimiz
10bc0 61 74 69 6f 6e 73 20 6c 69 73 74 65 64 20 61 62  ations listed ab
10bd0 6f 76 65 20 65 78 63 65 70 74 20 44 65 62 75 67  ove except Debug
10be0 20 4d 6f 64 65 2c 20 69 6e 63 6c 75 64 69 6e 67   Mode, including
10bf0 20 6e 65 77 0a 20 20 2a 2a 20 6f 70 74 69 6d 69   new.  ** optimi
10c00 7a 61 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76  zations that hav
10c10 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69  e not yet been i
10c20 6e 76 65 6e 74 65 64 2e 20 20 49 66 20 6e 65 77  nvented.  If new
10c30 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61   optimizations a
10c40 72 65 0a 20 20 2a 2a 20 65 76 65 72 20 61 64 64  re.  ** ever add
10c50 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ed that should b
10c60 65 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  e off by default
10c70 2c 20 74 68 6f 73 65 20 6f 66 66 2d 62 79 2d 64  , those off-by-d
10c80 65 66 61 75 6c 74 20 0a 20 20 2a 2a 20 6f 70 74  efault .  ** opt
10c90 69 6d 69 7a 61 74 69 6f 6e 73 20 77 69 6c 6c 20  imizations will 
10ca0 68 61 76 65 20 62 69 74 6d 61 73 6b 73 20 6f 66  have bitmasks of
10cb0 20 30 78 31 30 30 30 30 20 6f 72 20 6c 61 72 67   0x10000 or larg
10cc0 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 45  er..  **.  ** DE
10cd0 54 45 52 4d 49 4e 41 54 49 4f 4e 20 4f 46 20 57  TERMINATION OF W
10ce0 48 45 4e 20 54 4f 20 52 55 4e 20 41 4e 41 4c 59  HEN TO RUN ANALY
10cf0 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  ZE.  **.  ** In 
10d00 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
10d10 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20 74 61  ementation, a ta
10d20 62 6c 65 20 69 73 20 61 6e 61 6c 79 7a 65 64 20  ble is analyzed 
10d30 69 66 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 6f  if only if all o
10d40 66 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  f.  ** the follo
10d50 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
10d60 20 2a 2a 0a 20 20 2a 2a 20 28 31 29 20 4d 41 53   **.  ** (1) MAS
10d70 4b 20 62 69 74 20 30 78 30 32 20 69 73 20 73 65  K bit 0x02 is se
10d80 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 32 29  t..  **.  ** (2)
10d90 20 54 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   The query plann
10da0 65 72 20 75 73 65 64 20 73 71 6c 69 74 65 5f 73  er used sqlite_s
10db0 74 61 74 31 2d 73 74 79 6c 65 20 73 74 61 74 69  tat1-style stati
10dc0 73 74 69 63 73 20 66 6f 72 20 6f 6e 65 20 6f 72  stics for one or
10dd0 0a 20 20 2a 2a 20 20 20 20 20 6d 6f 72 65 20 69  .  **     more i
10de0 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20 74 61  ndexes of the ta
10df0 62 6c 65 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ble at some poin
10e00 74 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66  t during the lif
10e10 65 74 69 6d 65 20 6f 66 0a 20 20 2a 2a 20 20 20  etime of.  **   
10e20 20 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f    the current co
10e30 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20  nnection..  **. 
10e40 20 2a 2a 20 28 33 29 20 4f 6e 65 20 6f 72 20 6d   ** (3) One or m
10e50 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74  ore indexes of t
10e60 68 65 20 74 61 62 6c 65 20 61 72 65 20 63 75 72  he table are cur
10e70 72 65 6e 74 6c 79 20 75 6e 61 6e 61 6c 79 7a 65  rently unanalyze
10e80 64 20 4f 52 0a 20 20 2a 2a 20 20 20 20 20 74 68  d OR.  **     th
10e90 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
10ea0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 68 61   in the table ha
10eb0 73 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 32  s increased by 2
10ec0 35 20 74 69 6d 65 73 20 6f 72 20 6d 6f 72 65 0a  5 times or more.
10ed0 20 20 2a 2a 20 20 20 20 20 73 69 6e 63 65 20 74    **     since t
10ee0 68 65 20 6c 61 73 74 20 74 69 6d 65 20 41 4e 41  he last time ANA
10ef0 4c 59 5a 45 20 77 61 73 20 72 75 6e 2e 0a 20 20  LYZE was run..  
10f00 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c 65  **.  ** The rule
10f10 73 20 66 6f 72 20 77 68 65 6e 20 74 61 62 6c 65  s for when table
10f20 73 20 61 72 65 20 61 6e 61 6c 79 7a 65 64 20 61  s are analyzed a
10f30 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 68 61  re likely to cha
10f40 6e 67 65 20 69 6e 0a 20 20 2a 2a 20 66 75 74 75  nge in.  ** futu
10f50 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a  re releases..  *
10f60 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
10f70 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b 0a 20 20 20  _OPTIMIZE: {.   
10f80 20 69 6e 74 20 69 44 62 4c 61 73 74 3b 20 20 20   int iDbLast;   
10f90 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10fa0 74 65 72 6d 69 6e 61 74 69 6f 6e 20 70 6f 69 6e  termination poin
10fb0 74 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  t for the schema
10fc0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74   loop */.    int
10fd0 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20   iTabCur;       
10fe0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f      /* Cursor fo
10ff0 72 20 61 20 74 61 62 6c 65 20 77 68 6f 73 65 20  r a table whose 
11000 73 69 7a 65 20 6e 65 65 64 73 20 63 68 65 63 6b  size needs check
11010 69 6e 67 20 2a 2f 0a 20 20 20 20 48 61 73 68 45  ing */.    HashE
11020 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
11030 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74    /* Loop over t
11040 61 62 6c 65 73 20 6f 66 20 61 20 73 63 68 65 6d  ables of a schem
11050 61 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  a */.    Schema 
11060 2a 70 53 63 68 65 6d 61 3b 20 20 20 20 20 20 20  *pSchema;       
11070 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 73  /* The current s
11080 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 54 61 62  chema */.    Tab
11090 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
110a0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
110b0 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  n the schema */.
110c0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
110d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
110e0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   index of the ta
110f0 62 6c 65 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73  ble */.    LogEs
11100 74 20 73 7a 54 68 72 65 73 68 6f 6c 64 3b 20 20  t szThreshold;  
11110 20 20 2f 2a 20 53 69 7a 65 20 74 68 72 65 73 68    /* Size thresh
11120 6f 6c 64 20 61 62 6f 76 65 20 77 68 69 63 68 20  old above which 
11130 72 65 61 6e 61 6c 79 73 69 73 20 69 73 20 6e 65  reanalysis is ne
11140 65 64 64 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  edd */.    char 
11150 2a 7a 53 75 62 53 71 6c 3b 20 20 20 20 20 20 20  *zSubSql;       
11160 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    /* SQL stateme
11170 6e 74 20 66 6f 72 20 74 68 65 20 4f 50 5f 53 71  nt for the OP_Sq
11180 6c 45 78 65 63 20 6f 70 63 6f 64 65 20 2a 2f 0a  lExec opcode */.
11190 20 20 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20      u32 opMask; 
111a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
111b0 73 6b 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  sk of operations
111c0 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 0a   to perform */..
111d0 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
111e0 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d  {.      opMask =
111f0 20 28 75 33 32 29 73 71 6c 69 74 65 33 41 74 6f   (u32)sqlite3Ato
11200 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
11210 20 69 66 28 20 28 6f 70 4d 61 73 6b 20 26 20 30   if( (opMask & 0
11220 78 30 32 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  x02)==0 ) break;
11230 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11240 20 20 6f 70 4d 61 73 6b 20 3d 20 30 78 66 66 66    opMask = 0xfff
11250 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61  e;.    }.    iTa
11260 62 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  bCur = pParse->n
11270 54 61 62 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 69  Tab++;.    for(i
11280 44 62 4c 61 73 74 20 3d 20 7a 44 62 3f 69 44 62  DbLast = zDb?iDb
11290 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3c  :db->nDb-1; iDb<
112a0 3d 69 44 62 4c 61 73 74 3b 20 69 44 62 2b 2b 29  =iDbLast; iDb++)
112b0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d  {.      if( iDb=
112c0 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =1 ) continue;. 
112d0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
112e0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
112f0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
11300 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61   pSchema = db->a
11310 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
11320 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  .      for(k=sql
11330 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
11340 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
11350 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
11360 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
11370 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
11380 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
11390 6b 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  k);..        /* 
113a0 49 66 20 74 61 62 6c 65 20 70 54 61 62 20 68 61  If table pTab ha
113b0 73 20 6e 6f 74 20 62 65 65 6e 20 75 73 65 64 20  s not been used 
113c0 69 6e 20 61 20 77 61 79 20 74 68 61 74 20 77 6f  in a way that wo
113d0 75 6c 64 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  uld benefit from
113e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 69  .        ** havi
113f0 6e 67 20 61 6e 61 6c 79 73 69 73 20 73 74 61 74  ng analysis stat
11400 69 73 74 69 63 73 20 64 75 72 69 6e 67 20 74 68  istics during th
11410 65 20 63 75 72 72 65 6e 74 20 73 65 73 73 69 6f  e current sessio
11420 6e 2c 20 74 68 65 6e 20 73 6b 69 70 20 69 74 2e  n, then skip it.
11430 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
11440 20 61 6c 73 6f 20 68 61 73 20 74 68 65 20 65 66   also has the ef
11450 66 65 63 74 20 6f 66 20 73 6b 69 70 70 69 6e 67  fect of skipping
11460 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
11470 61 6e 64 20 76 69 65 77 73 20 2a 2f 0a 20 20 20  and views */.   
11480 20 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e       if( (pTab->
11490 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 53 74  tabFlags & TF_St
114a0 61 74 73 55 73 65 64 29 3d 3d 30 20 29 20 63 6f  atsUsed)==0 ) co
114b0 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20  ntinue;..       
114c0 20 2f 2a 20 52 65 61 6e 61 6c 79 7a 65 20 69 66   /* Reanalyze if
114d0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 32 35   the table is 25
114e0 20 74 69 6d 65 73 20 6c 61 72 67 65 72 20 74 68   times larger th
114f0 61 6e 20 74 68 65 20 6c 61 73 74 20 61 6e 61 6c  an the last anal
11500 79 73 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ysis */.        
11510 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 70 54  szThreshold = pT
11520 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 2b  ab->nRowLogEst +
11530 20 34 36 3b 20 61 73 73 65 72 74 28 20 73 71 6c   46; assert( sql
11540 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 3d 3d  ite3LogEst(25)==
11550 34 36 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  46 );.        fo
11560 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
11570 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
11580 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
11590 20 20 20 20 20 20 20 20 69 66 28 20 21 70 49 64          if( !pId
115a0 78 2d 3e 68 61 73 53 74 61 74 31 20 29 7b 0a 20  x->hasStat1 ){. 
115b0 20 20 20 20 20 20 20 20 20 20 20 73 7a 54 68 72             szThr
115c0 65 73 68 6f 6c 64 20 3d 20 30 3b 20 2f 2a 20 41  eshold = 0; /* A
115d0 6c 77 61 79 73 20 61 6e 61 6c 79 7a 65 20 69 66  lways analyze if
115e0 20 61 6e 79 20 69 6e 64 65 78 20 6c 61 63 6b 73   any index lacks
115f0 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   statistics */. 
11600 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
11610 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11630 69 66 28 20 73 7a 54 68 72 65 73 68 6f 6c 64 20  if( szThreshold 
11640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
11650 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
11660 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c 20 69  arse, iTabCur, i
11670 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
11680 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20  nRead);.        
11690 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
116a0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 53 6d 61 6c  Op3(v, OP_IfSmal
116b0 6c 65 72 2c 20 69 54 61 62 43 75 72 2c 20 0a 20  ler, iTabCur, . 
116c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
116e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
116f0 29 2b 32 2b 28 6f 70 4d 61 73 6b 26 31 29 2c 20  )+2+(opMask&1), 
11700 73 7a 54 68 72 65 73 68 6f 6c 64 29 3b 0a 20 20  szThreshold);.  
11710 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
11720 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
11730 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 75 62 53   }.        zSubS
11740 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ql = sqlite3MPri
11750 6e 74 66 28 64 62 2c 20 22 41 4e 41 4c 59 5a 45  ntf(db, "ANALYZE
11760 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22 22 2c   \"%w\".\"%w\"",
11770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
117a0 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  DbSName, pTab->z
117b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
117c0 66 28 20 6f 70 4d 61 73 6b 20 26 20 30 78 30 31  f( opMask & 0x01
117d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
117e0 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
117f0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11800 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11810 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11820 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
11830 72 31 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20  r1, 0, zSubSql, 
11840 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
11850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11860 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
11870 65 73 75 6c 74 52 6f 77 2c 20 72 31 2c 20 31 29  esultRow, r1, 1)
11880 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11890 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
118a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
118b0 4f 50 5f 53 71 6c 45 78 65 63 2c 20 30 2c 20 30  OP_SqlExec, 0, 0
118c0 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20 50 34  , 0, zSubSql, P4
118d0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
118e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
118f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
11900 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45  beAddOp0(v, OP_E
11910 78 70 69 72 65 29 3b 0a 20 20 20 20 62 72 65 61  xpire);.    brea
11920 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
11930 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f  *   PRAGMA busy_
11940 74 69 6d 65 6f 75 74 0a 20 20 2a 2a 20 20 20 50  timeout.  **   P
11950 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f  RAGMA busy_timeo
11960 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  ut = N.  **.  **
11970 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 62 75   Call sqlite3_bu
11980 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 4e  sy_timeout(db, N
11990 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 63  ).  Return the c
119a0 75 72 72 65 6e 74 20 74 69 6d 65 6f 75 74 20 76  urrent timeout v
119b0 61 6c 75 65 0a 20 20 2a 2a 20 69 66 20 6f 6e 65  alue.  ** if one
119c0 20 69 73 20 73 65 74 2e 20 20 49 66 20 6e 6f 20   is set.  If no 
119d0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 6f 72 20  busy handler or 
119e0 61 20 64 69 66 66 65 72 65 6e 74 20 62 75 73 79  a different busy
119f0 20 68 61 6e 64 6c 65 72 20 69 73 20 73 65 74 0a   handler is set.
11a00 20 20 2a 2a 20 74 68 65 6e 20 30 20 69 73 20 72    ** then 0 is r
11a10 65 74 75 72 6e 65 64 2e 20 20 53 65 74 74 69 6e  eturned.  Settin
11a20 67 20 74 68 65 20 62 75 73 79 5f 74 69 6d 65 6f  g the busy_timeo
11a30 75 74 20 74 6f 20 30 20 6f 72 20 6e 65 67 61 74  ut to 0 or negat
11a40 69 76 65 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65  ive.  ** disable
11a50 73 20 74 68 65 20 74 69 6d 65 6f 75 74 2e 0a 20  s the timeout.. 
11a60 20 2a 2f 0a 20 20 2f 2a 63 61 73 65 20 50 72 61   */.  /*case Pra
11a70 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55  gTyp_BUSY_TIMEOU
11a80 54 2a 2f 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20  T*/ default: {. 
11a90 20 20 20 61 73 73 65 72 74 28 20 70 50 72 61 67     assert( pPrag
11aa0 6d 61 2d 3e 65 50 72 61 67 54 79 70 3d 3d 50 72  ma->ePragTyp==Pr
11ab0 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f  agTyp_BUSY_TIMEO
11ac0 55 54 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  UT );.    if( zR
11ad0 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
11ae0 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
11af0 75 74 28 64 62 2c 20 73 71 6c 69 74 65 33 41 74  ut(db, sqlite3At
11b00 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20  oi(zRight));.   
11b10 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
11b20 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 62 75  gleInt(v, db->bu
11b30 73 79 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20  syTimeout);.    
11b40 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
11b50 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73  .  **   PRAGMA s
11b60 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 0a 20  oft_heap_limit. 
11b70 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f 66   **   PRAGMA sof
11b80 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3d 20 4e  t_heap_limit = N
11b90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45  .  **.  ** IMPLE
11ba0 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
11bb0 32 36 33 34 33 2d 34 35 39 33 30 20 54 68 69 73  26343-45930 This
11bc0 20 70 72 61 67 6d 61 20 69 6e 76 6f 6b 65 73 20   pragma invokes 
11bd0 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
11be0 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
11bf0 36 34 28 29 20 69 6e 74 65 72 66 61 63 65 20 77  64() interface w
11c00 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ith the argument
11c10 20 4e 2c 20 69 66 20 4e 20 69 73 0a 20 20 2a 2a   N, if N is.  **
11c20 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 20 69   specified and i
11c30 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  s a non-negative
11c40 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 20 49   integer..  ** I
11c50 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
11c60 3a 20 52 2d 36 34 34 35 31 2d 30 37 31 36 33 20  : R-64451-07163 
11c70 54 68 65 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69  The soft_heap_li
11c80 6d 69 74 20 70 72 61 67 6d 61 20 61 6c 77 61 79  mit pragma alway
11c90 73 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74  s.  ** returns t
11ca0 68 65 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20  he same integer 
11cb0 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 72 65  that would be re
11cc0 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20  turned by the.  
11cd0 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  ** sqlite3_soft_
11ce0 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29  heap_limit64(-1)
11cf0 20 43 2d 6c 61 6e 67 75 61 67 65 20 66 75 6e 63   C-language func
11d00 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
11d10 65 20 50 72 61 67 54 79 70 5f 53 4f 46 54 5f 48  e PragTyp_SOFT_H
11d20 45 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20  EAP_LIMIT: {.   
11d30 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e   sqlite3_int64 N
11d40 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
11d50 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72   && sqlite3DecOr
11d60 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c  HexToI64(zRight,
11d70 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   &N)==SQLITE_OK 
11d80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11d90 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
11da0 36 34 28 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  64(N);.    }.   
11db0 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
11dc0 28 76 2c 20 73 71 6c 69 74 65 33 5f 73 6f 66 74  (v, sqlite3_soft
11dd0 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31  _heap_limit64(-1
11de0 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
11df0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
11e00 50 52 41 47 4d 41 20 74 68 72 65 61 64 73 0a 20  PRAGMA threads. 
11e10 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72   **   PRAGMA thr
11e20 65 61 64 73 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20  eads = N.  **.  
11e30 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65  ** Configure the
11e40 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
11e50 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64  of worker thread
11e60 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  s.  Return the n
11e70 65 77 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 2c  ew.  ** maximum,
11e80 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
11e90 6c 65 73 73 20 74 68 61 6e 20 72 65 71 75 65 73  less than reques
11ea0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
11eb0 20 50 72 61 67 54 79 70 5f 54 48 52 45 41 44 53   PragTyp_THREADS
11ec0 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
11ed0 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28  int64 N;.    if(
11ee0 20 7a 52 69 67 68 74 0a 20 20 20 20 20 26 26 20   zRight.     && 
11ef0 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
11f00 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 4e 29  oI64(zRight, &N)
11f10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
11f20 20 26 26 20 4e 3e 3d 30 0a 20 20 20 20 29 7b 0a   && N>=0.    ){.
11f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69        sqlite3_li
11f40 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c  mit(db, SQLITE_L
11f50 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
11f60 41 44 53 2c 20 28 69 6e 74 29 28 4e 26 30 78 37  ADS, (int)(N&0x7
11f70 66 66 66 66 66 66 66 29 29 3b 0a 20 20 20 20 7d  fffffff));.    }
11f80 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
11f90 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 5f  eInt(v, sqlite3_
11fa0 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45  limit(db, SQLITE
11fb0 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
11fc0 52 45 41 44 53 2c 20 2d 31 29 29 3b 0a 20 20 20  READS, -1));.   
11fd0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66   break;.  }..#if
11fe0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
11ff0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
12000 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
12010 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f 72 74 20   /*.  ** Report 
12020 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
12030 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67 73 20 66  e of file logs f
12040 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  or all databases
12050 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
12060 67 54 79 70 5f 4c 4f 43 4b 5f 53 54 41 54 55 53  gTyp_LOCK_STATUS
12070 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  : {.    static c
12080 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
12090 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20 3d 20   azLockName[] = 
120a0 7b 0a 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 65  {.      "unlocke
120b0 64 22 2c 20 22 73 68 61 72 65 64 22 2c 20 22 72  d", "shared", "r
120c0 65 73 65 72 76 65 64 22 2c 20 22 70 65 6e 64 69  eserved", "pendi
120d0 6e 67 22 2c 20 22 65 78 63 6c 75 73 69 76 65 22  ng", "exclusive"
120e0 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
120f0 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  i;.    pParse->n
12100 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72  Mem = 2;.    for
12110 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
12120 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
12130 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 20 20 63  ee *pBt;.      c
12140 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74  onst char *zStat
12150 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  e = "unknown";. 
12160 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
12170 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
12180 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30 20 29 20 63  .zDbSName==0 ) c
12190 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
121a0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
121b0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
121c0 42 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  Bt==0 || sqlite3
121d0 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3d  BtreePager(pBt)=
121e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  =0 ){.        zS
121f0 74 61 74 65 20 3d 20 22 63 6c 6f 73 65 64 22 3b  tate = "closed";
12200 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
12210 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
12220 6e 74 72 6f 6c 28 64 62 2c 20 69 20 3f 20 64 62  ntrol(db, i ? db
12230 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
12240 65 20 3a 20 30 2c 20 0a 20 20 20 20 20 20 20 20  e : 0, .        
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
12270 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
12280 41 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49 54 45  ATE, &j)==SQLITE
12290 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
122a0 7a 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63 6b 4e  zState = azLockN
122b0 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a  ame[j];.      }.
122c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
122d0 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
122e0 20 22 73 73 22 2c 20 64 62 2d 3e 61 44 62 5b 69   "ss", db->aDb[i
122f0 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 53 74 61  ].zDbSName, zSta
12300 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  te);.    }.    b
12310 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
12320 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
12330 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a 20 50  HAS_CODEC.  /* P
12340 72 61 67 6d 61 20 20 20 20 20 20 20 20 69 41 72  ragma        iAr
12350 67 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  g.  ** ---------
12360 2d 20 20 20 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  -   ------.  ** 
12370 20 6b 65 79 20 20 20 20 20 20 20 20 20 20 20 30   key           0
12380 0a 20 20 2a 2a 20 20 72 65 6b 65 79 20 20 20 20  .  **  rekey    
12390 20 20 20 20 20 31 0a 20 20 2a 2a 20 20 68 65 78       1.  **  hex
123a0 6b 65 79 20 20 20 20 20 20 20 20 32 0a 20 20 2a  key        2.  *
123b0 2a 20 20 68 65 78 72 65 6b 65 79 20 20 20 20 20  *  hexrekey     
123c0 20 33 0a 20 20 2a 2a 20 20 74 65 78 74 6b 65 79   3.  **  textkey
123d0 20 20 20 20 20 20 20 34 0a 20 20 2a 2a 20 20 74         4.  **  t
123e0 65 78 74 72 65 6b 65 79 20 20 20 20 20 35 0a 20  extrekey     5. 
123f0 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
12400 79 70 5f 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66  yp_KEY: {.    if
12410 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
12420 20 20 63 68 61 72 20 7a 42 75 66 5b 34 30 5d 3b    char zBuf[40];
12430 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
12440 72 20 2a 7a 4b 65 79 20 3d 20 7a 52 69 67 68 74  r *zKey = zRight
12450 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
12460 20 20 20 20 20 69 66 28 20 70 50 72 61 67 6d 61       if( pPragma
12470 2d 3e 69 41 72 67 3d 3d 32 20 7c 7c 20 70 50 72  ->iArg==2 || pPr
12480 61 67 6d 61 2d 3e 69 41 72 67 3d 3d 33 20 29 7b  agma->iArg==3 ){
12490 0a 20 20 20 20 20 20 20 20 75 38 20 69 42 79 74  .        u8 iByt
124a0 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e;.        int i
124b0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
124c0 30 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69  0, iByte=0; i<si
124d0 7a 65 6f 66 28 7a 42 75 66 29 2a 32 20 26 26 20  zeof(zBuf)*2 && 
124e0 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
124f0 7a 52 69 67 68 74 5b 69 5d 29 3b 20 69 2b 2b 29  zRight[i]); i++)
12500 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42 79 74  {.          iByt
12510 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b  e = (iByte<<4) +
12520 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
12530 28 7a 52 69 67 68 74 5b 69 5d 29 3b 0a 20 20 20  (zRight[i]);.   
12540 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29         if( (i&1)
12550 21 3d 30 20 29 20 7a 42 75 66 5b 69 2f 32 5d 20  !=0 ) zBuf[i/2] 
12560 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 20  = iByte;.       
12570 20 7d 0a 20 20 20 20 20 20 20 20 7a 4b 65 79 20   }.        zKey 
12580 3d 20 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20  = zBuf;.        
12590 6e 20 3d 20 69 2f 32 3b 0a 20 20 20 20 20 20 7d  n = i/2;.      }
125a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 20  else{.        n 
125b0 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3c  = pPragma->iArg<
125c0 34 20 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65  4 ? sqlite3Strle
125d0 6e 33 30 28 7a 52 69 67 68 74 29 20 3a 20 2d 31  n30(zRight) : -1
125e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
125f0 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 69 41  if( (pPragma->iA
12600 72 67 20 26 20 31 29 3d 3d 30 20 29 7b 0a 20 20  rg & 1)==0 ){.  
12610 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12620 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  e3_key_v2(db, zD
12630 62 2c 20 7a 4b 65 79 2c 20 6e 29 3b 0a 20 20 20  b, zKey, n);.   
12640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
12660 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  ekey_v2(db, zDb,
12670 20 7a 4b 65 79 2c 20 6e 29 3b 0a 20 20 20 20 20   zKey, n);.     
12680 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
12690 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 21  =SQLITE_OK && n!
126a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
126b0 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
126c0 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  ols(v, 1);.     
126d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
126e0 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43  tColName(v, 0, C
126f0 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 6f 6b  OLNAME_NAME, "ok
12700 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ", SQLITE_STATIC
12710 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
12720 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 22  nSingleText(v, "
12730 6f 6b 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ok");.      }.  
12740 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
12750 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
12760 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
12770 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e  _CODEC) || defin
12780 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
12790 5f 43 45 52 4f 44 29 0a 20 20 63 61 73 65 20 50  _CEROD).  case P
127a0 72 61 67 54 79 70 5f 41 43 54 49 56 41 54 45 5f  ragTyp_ACTIVATE_
127b0 45 58 54 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20  EXTENSIONS: if( 
127c0 7a 52 69 67 68 74 20 29 7b 0a 23 69 66 64 65 66  zRight ){.#ifdef
127d0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
127e0 43 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  C.    if( sqlite
127f0 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74  3StrNICmp(zRight
12800 2c 20 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20  , "see-", 4)==0 
12810 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12820 5f 61 63 74 69 76 61 74 65 5f 73 65 65 28 26 7a  _activate_see(&z
12830 52 69 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d  Right[4]);.    }
12840 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
12850 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52  QLITE_ENABLE_CER
12860 4f 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  OD.    if( sqlit
12870 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68  e3StrNICmp(zRigh
12880 74 2c 20 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d  t, "cerod-", 6)=
12890 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
128a0 74 65 33 5f 61 63 74 69 76 61 74 65 5f 63 65 72  te3_activate_cer
128b0 6f 64 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a  od(&zRight[6]);.
128c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
128d0 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
128e0 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20  ..  } /* End of 
128f0 74 68 65 20 50 52 41 47 4d 41 20 73 77 69 74 63  the PRAGMA switc
12900 68 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66  h */..  /* The f
12910 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 69  ollowing block i
12920 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
12930 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
12940 20 64 65 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e   defined. Its on
12950 6c 79 0a 20 20 2a 2a 20 70 75 72 70 6f 73 65 20  ly.  ** purpose 
12960 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 61 73  is to execute as
12970 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
12980 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
12990 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 50 72 61   if the.  ** Pra
129a0 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 20  gFlg_NoColumns1 
129b0 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
129c0 74 68 65 20 63 61 6c 6c 65 72 20 73 70 65 63 69  the caller speci
129d0 66 69 65 64 20 61 6e 20 61 72 67 75 6d 65 6e 74  fied an argument
129e0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 50 52 41  .  ** to the PRA
129f0 47 4d 41 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65  GMA, the impleme
12a00 6e 74 61 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20  ntation has not 
12a10 61 64 64 65 64 20 61 6e 79 20 4f 50 5f 52 65 73  added any OP_Res
12a20 75 6c 74 52 6f 77 20 0a 20 20 2a 2a 20 69 6e 73  ultRow .  ** ins
12a30 74 72 75 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  tructions to the
12a40 20 56 4d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28   VM.  */.  if( (
12a50 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
12a60 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f  g & PragFlg_NoCo
12a70 6c 75 6d 6e 73 31 29 20 26 26 20 7a 52 69 67 68  lumns1) && zRigh
12a80 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
12a90 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75  VdbeVerifyNoResu
12aa0 6c 74 52 6f 77 28 76 29 3b 0a 20 20 7d 0a 0a 70  ltRow(v);.  }..p
12ab0 72 61 67 6d 61 5f 6f 75 74 3a 0a 20 20 73 71 6c  ragma_out:.  sql
12ac0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
12ad0 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Left);.  sqlite3
12ae0 44 62 46 72 65 65 28 64 62 2c 20 7a 52 69 67 68  DbFree(db, zRigh
12af0 74 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51  t);.}.#ifndef SQ
12b00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12b10 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  LTABLE./********
12b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b60 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  *****.** Impleme
12b70 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 70  ntation of an ep
12b80 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20  onymous virtual 
12b90 74 61 62 6c 65 20 74 68 61 74 20 72 75 6e 73 20  table that runs 
12ba0 61 20 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f 0a  a pragma..**.*/.
12bb0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
12bc0 72 61 67 6d 61 56 74 61 62 20 50 72 61 67 6d 61  ragmaVtab Pragma
12bd0 56 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74  Vtab;.typedef st
12be0 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 43  ruct PragmaVtabC
12bf0 75 72 73 6f 72 20 50 72 61 67 6d 61 56 74 61 62  ursor PragmaVtab
12c00 43 75 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 50  Cursor;.struct P
12c10 72 61 67 6d 61 56 74 61 62 20 7b 0a 20 20 73 71  ragmaVtab {.  sq
12c20 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b  lite3_vtab base;
12c30 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
12c40 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20  class.  Must be 
12c50 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74  first */.  sqlit
12c60 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
12c70 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
12c80 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12c90 74 6f 20 77 68 69 63 68 20 69 74 20 62 65 6c 6f  to which it belo
12ca0 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 50  ngs */.  const P
12cb0 72 61 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65  ragmaName *pName
12cc0 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
12cd0 65 20 70 72 61 67 6d 61 20 2a 2f 0a 20 20 75 38  e pragma */.  u8
12ce0 20 6e 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20   nHidden;       
12cf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12d00 72 20 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c 75  r of hidden colu
12d10 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 48 69 64  mns */.  u8 iHid
12d20 64 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  den;            
12d30 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
12d40 68 65 20 66 69 72 73 74 20 68 69 64 64 65 6e 20  he first hidden 
12d50 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74 72  column */.};.str
12d60 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 43 75  uct PragmaVtabCu
12d70 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  rsor {.  sqlite3
12d80 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73  _vtab_cursor bas
12d90 65 3b 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73  e; /* Base class
12da0 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  .  Must be first
12db0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
12dc0 6d 74 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 20  mt *pPragma;    
12dd0 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 73 74  /* The pragma st
12de0 61 74 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a  atement to run *
12df0 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
12e00 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a   iRowid;      /*
12e10 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a   Current rowid *
12e20 2f 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b  /.  char *azArg[
12e30 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2];           /*
12e40 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 61 72   Value of the ar
12e50 67 75 6d 65 6e 74 20 61 6e 64 20 73 63 68 65 6d  gument and schem
12e60 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  a */.};../* .** 
12e70 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  Pragma virtual t
12e80 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e  able module xCon
12e90 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  nect method..*/.
12ea0 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
12eb0 61 56 74 61 62 43 6f 6e 6e 65 63 74 28 0a 20 20  aVtabConnect(.  
12ec0 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
12ed0 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
12ee0 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
12ef0 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
12f00 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
12f10 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVtab,.  char *
12f20 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 63 6f 6e 73  *pzErr.){.  cons
12f30 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50  t PragmaName *pP
12f40 72 61 67 6d 61 20 3d 20 28 63 6f 6e 73 74 20 50  ragma = (const P
12f50 72 61 67 6d 61 4e 61 6d 65 2a 29 70 41 75 78 3b  ragmaName*)pAux;
12f60 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70  .  PragmaVtab *p
12f70 54 61 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Tab = 0;.  int r
12f80 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  c;.  int i, j;. 
12f90 20 63 68 61 72 20 63 53 65 70 20 3d 20 27 28 27   char cSep = '('
12fa0 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63  ;.  StrAccum acc
12fb0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30  ;.  char zBuf[20
12fc0 30 5d 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  0];..  UNUSED_PA
12fd0 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
12fe0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12ff0 52 28 61 72 67 76 29 3b 0a 20 20 73 71 6c 69 74  R(argv);.  sqlit
13000 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
13010 61 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69  acc, 0, zBuf, si
13020 7a 65 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a  zeof(zBuf), 0);.
13030 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
13040 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 22 43  pendall(&acc, "C
13050 52 45 41 54 45 20 54 41 42 4c 45 20 78 22 29 3b  REATE TABLE x");
13060 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 50  .  for(i=0, j=pP
13070 72 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e 61 6d  ragma->iPragCNam
13080 65 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e 6e 50  e; i<pPragma->nP
13090 72 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20 6a  ragCName; i++, j
130a0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
130b0 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63  _str_appendf(&ac
130c0 63 2c 20 22 25 63 5c 22 25 73 5c 22 22 2c 20 63  c, "%c\"%s\"", c
130d0 53 65 70 2c 20 70 72 61 67 43 4e 61 6d 65 5b 6a  Sep, pragCName[j
130e0 5d 29 3b 0a 20 20 20 20 63 53 65 70 20 3d 20 27  ]);.    cSep = '
130f0 2c 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d  ,';.  }.  if( i=
13100 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13110 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61  3_str_appendf(&a
13120 63 63 2c 20 22 28 5c 22 25 73 5c 22 22 2c 20 70  cc, "(\"%s\"", p
13130 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b 0a  Pragma->zName);.
13140 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6a      i++;.  }.  j
13150 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 72 61   = 0;.  if( pPra
13160 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
13170 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 20  PragFlg_Result1 
13180 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
13190 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63  tr_appendall(&ac
131a0 63 2c 20 22 2c 61 72 67 20 48 49 44 44 45 4e 22  c, ",arg HIDDEN"
131b0 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  );.    j++;.  }.
131c0 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d    if( pPragma->m
131d0 50 72 61 67 46 6c 67 20 26 20 28 50 72 61 67 46  PragFlg & (PragF
131e0 6c 67 5f 53 63 68 65 6d 61 4f 70 74 7c 50 72 61  lg_SchemaOpt|Pra
131f0 67 46 6c 67 5f 53 63 68 65 6d 61 52 65 71 29 20  gFlg_SchemaReq) 
13200 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
13210 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63  tr_appendall(&ac
13220 63 2c 20 22 2c 73 63 68 65 6d 61 20 48 49 44 44  c, ",schema HIDD
13230 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20  EN");.    j++;. 
13240 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72   }.  sqlite3_str
13250 5f 61 70 70 65 6e 64 28 26 61 63 63 2c 20 22 29  _append(&acc, ")
13260 22 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 1);.  sqlite3
13270 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
13280 61 63 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20  acc);.  assert( 
13290 73 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20 73  strlen(zBuf) < s
132a0 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b  izeof(zBuf)-1 );
132b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
132c0 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c  declare_vtab(db,
132d0 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63   zBuf);.  if( rc
132e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
132f0 20 20 20 70 54 61 62 20 3d 20 28 50 72 61 67 6d     pTab = (Pragm
13300 61 56 74 61 62 2a 29 73 71 6c 69 74 65 33 5f 6d  aVtab*)sqlite3_m
13310 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72 61  alloc(sizeof(Pra
13320 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20 69  gmaVtab));.    i
13330 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
13340 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13350 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
13360 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
13370 54 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  Tab, 0, sizeof(P
13380 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20  ragmaVtab));.   
13390 20 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20 3d     pTab->pName =
133a0 20 70 50 72 61 67 6d 61 3b 0a 20 20 20 20 20 20   pPragma;.      
133b0 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  pTab->db = db;. 
133c0 20 20 20 20 20 70 54 61 62 2d 3e 69 48 69 64 64       pTab->iHidd
133d0 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 54  en = i;.      pT
133e0 61 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a 3b  ab->nHidden = j;
133f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
13400 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
13410 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
13420 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
13430 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2a  g(db));.  }..  *
13440 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65  ppVtab = (sqlite
13450 33 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20  3_vtab*)pTab;.  
13460 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13470 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74   .** Pragma virt
13480 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
13490 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74   xDisconnect met
134a0 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
134b0 6e 74 20 70 72 61 67 6d 61 56 74 61 62 44 69 73  nt pragmaVtabDis
134c0 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f  connect(sqlite3_
134d0 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
134e0 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62  PragmaVtab *pTab
134f0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29   = (PragmaVtab*)
13500 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  pVtab;.  sqlite3
13510 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20 72  _free(pTab);.  r
13520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13530 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f 75  .}../* Figure ou
13540 74 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  t the best index
13550 20 74 6f 20 75 73 65 20 74 6f 20 73 65 61 72 63   to use to searc
13560 68 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75  h a pragma virtu
13570 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
13580 54 68 65 72 65 20 61 72 65 20 6e 6f 74 20 72 65  There are not re
13590 61 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78 20 63  ally any index c
135a0 68 6f 69 63 65 73 2e 20 20 42 75 74 20 77 65 20  hoices.  But we 
135b0 77 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61 67  want to encourag
135c0 65 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70  e the.** query p
135d0 6c 61 6e 6e 65 72 20 74 6f 20 67 69 76 65 20 3d  lanner to give =
135e0 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  = constraints on
135f0 20 61 73 20 6d 61 6e 79 20 68 69 64 64 65 6e 20   as many hidden 
13600 70 61 72 61 6d 65 74 65 72 73 20 61 73 0a 2a 2a  parameters as.**
13610 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 65   possible, and e
13620 73 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68 65  specially on the
13630 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 70 61   first hidden pa
13640 72 61 6d 65 74 65 72 2e 20 20 53 6f 20 72 65 74  rameter.  So ret
13650 75 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63 6f  urn a.** high co
13660 73 74 20 69 66 20 68 69 64 64 65 6e 20 70 61 72  st if hidden par
13670 61 6d 65 74 65 72 73 20 61 72 65 20 75 6e 63 6f  ameters are unco
13680 6e 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73 74  nstrained..*/.st
13690 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
136a0 74 61 62 42 65 73 74 49 6e 64 65 78 28 73 71 6c  tabBestIndex(sql
136b0 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20  ite3_vtab *tab, 
136c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
136d0 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20  fo *pIdxInfo){. 
136e0 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61   PragmaVtab *pTa
136f0 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a  b = (PragmaVtab*
13700 29 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 74  )tab;.  const st
13710 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
13720 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
13730 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e  Constraint;.  in
13740 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73 65  t i, j;.  int se
13750 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49 6e  en[2];..  pIdxIn
13760 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
13770 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  t = (double)1;. 
13780 20 69 66 28 20 70 54 61 62 2d 3e 6e 48 69 64 64   if( pTab->nHidd
13790 65 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20  en==0 ){ return 
137a0 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 70  SQLITE_OK; }.  p
137b0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
137c0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
137d0 6e 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d 20  nt;.  seen[0] = 
137e0 30 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20 30  0;.  seen[1] = 0
137f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
13800 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
13810 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73  aint; i++, pCons
13820 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69  traint++){.    i
13830 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  f( pConstraint->
13840 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74  usable==0 ) cont
13850 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
13860 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53  onstraint->op!=S
13870 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
13880 54 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74  TRAINT_EQ ) cont
13890 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
138a0 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
138b0 6d 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69 64 64  mn < pTab->iHidd
138c0 65 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  en ) continue;. 
138d0 20 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61 69     j = pConstrai
138e0 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 54  nt->iColumn - pT
138f0 61 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20 20  ab->iHidden;.   
13900 20 61 73 73 65 72 74 28 20 6a 20 3c 20 32 20 29   assert( j < 2 )
13910 3b 0a 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d 20  ;.    seen[j] = 
13920 69 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  i+1;.  }.  if( s
13930 65 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  een[0]==0 ){.   
13940 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
13950 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62  atedCost = (doub
13960 6c 65 29 32 31 34 37 34 38 33 36 34 37 3b 0a 20  le)2147483647;. 
13970 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
13980 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 31 34  imatedRows = 214
13990 37 34 38 33 36 34 37 3b 0a 20 20 20 20 72 65 74  7483647;.    ret
139a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
139b0 20 7d 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30 5d   }.  j = seen[0]
139c0 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  -1;.  pIdxInfo->
139d0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
139e0 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  [j].argvIndex = 
139f0 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  1;.  pIdxInfo->a
13a00 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
13a10 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 69  j].omit = 1;.  i
13a20 66 28 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29 20  f( seen[1]==0 ) 
13a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13a40 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
13a50 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64  timatedCost = (d
13a60 6f 75 62 6c 65 29 32 30 3b 0a 20 20 70 49 64 78  ouble)20;.  pIdx
13a70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
13a80 6f 77 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d 20  ows = 20;.  j = 
13a90 73 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49 64  seen[1]-1;.  pId
13aa0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
13ab0 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49  ntUsage[j].argvI
13ac0 6e 64 65 78 20 3d 20 32 3b 0a 20 20 70 49 64 78  ndex = 2;.  pIdx
13ad0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
13ae0 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d  tUsage[j].omit =
13af0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
13b00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72  ITE_OK;.}../* Cr
13b10 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
13b20 72 20 66 6f 72 20 74 68 65 20 70 72 61 67 6d 61  r for the pragma
13b30 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
13b40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
13b50 67 6d 61 56 74 61 62 4f 70 65 6e 28 73 71 6c 69  gmaVtabOpen(sqli
13b60 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
13b70 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
13b80 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29  rsor **ppCursor)
13b90 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
13ba0 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70 43  rsor *pCsr;.  pC
13bb0 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
13bc0 43 75 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f  Cursor*)sqlite3_
13bd0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
13be0 43 73 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73  Csr));.  if( pCs
13bf0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
13c00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
13c10 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69  mset(pCsr, 0, si
13c20 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 43  zeof(PragmaVtabC
13c30 75 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d  ursor));.  pCsr-
13c40 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20 70 56  >base.pVtab = pV
13c50 74 61 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72  tab;.  *ppCursor
13c60 20 3d 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a   = &pCsr->base;.
13c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13c80 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20  OK;.}../* Clear 
13c90 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  all content from
13ca0 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   pragma virtual 
13cb0 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a 2f  table cursor. */
13cc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 61  .static void pra
13cd0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65  gmaVtabCursorCle
13ce0 61 72 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  ar(PragmaVtabCur
13cf0 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e  sor *pCsr){.  in
13d00 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  t i;.  sqlite3_f
13d10 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50  inalize(pCsr->pP
13d20 72 61 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d 3e  ragma);.  pCsr->
13d30 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 66  pPragma = 0;.  f
13d40 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
13d50 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29  ize(pCsr->azArg)
13d60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
13d70 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61  te3_free(pCsr->a
13d80 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70 43  zArg[i]);.    pC
13d90 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20 30  sr->azArg[i] = 0
13da0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73  ;.  }.}../* Clos
13db0 65 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75  e a pragma virtu
13dc0 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  al table cursor 
13dd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
13de0 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 28 73 71  agmaVtabClose(sq
13df0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
13e00 72 20 2a 63 75 72 29 7b 0a 20 20 50 72 61 67 6d  r *cur){.  Pragm
13e10 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13e20 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
13e30 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 72  ursor*)cur;.  pr
13e40 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c  agmaVtabCursorCl
13e50 65 61 72 28 70 43 73 72 29 3b 0a 20 20 73 71 6c  ear(pCsr);.  sql
13e60 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b  ite3_free(pCsr);
13e70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13e80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e  _OK;.}../* Advan
13e90 63 65 20 74 68 65 20 70 72 61 67 6d 61 20 76 69  ce the pragma vi
13ea0 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
13eb0 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  or to the next r
13ec0 6f 77 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ow */.static int
13ed0 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74 28   pragmaVtabNext(
13ee0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
13ef0 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
13f00 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
13f10 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
13f20 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
13f30 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
13f40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13f50 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  OK;..  /* Increm
13f60 65 6e 74 20 74 68 65 20 78 52 6f 77 69 64 20 76  ent the xRowid v
13f70 61 6c 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d 3e  alue */.  pCsr->
13f80 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73 65  iRowid++;.  asse
13f90 72 74 28 20 70 43 73 72 2d 3e 70 50 72 61 67 6d  rt( pCsr->pPragm
13fa0 61 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  a );.  if( SQLIT
13fb0 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73  E_ROW!=sqlite3_s
13fc0 74 65 70 28 70 43 73 72 2d 3e 70 50 72 61 67 6d  tep(pCsr->pPragm
13fd0 61 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  a) ){.    rc = s
13fe0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
13ff0 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a  pCsr->pPragma);.
14000 20 20 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d      pCsr->pPragm
14010 61 20 3d 20 30 3b 0a 20 20 20 20 70 72 61 67 6d  a = 0;.    pragm
14020 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72  aVtabCursorClear
14030 28 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72 65  (pCsr);.  }.  re
14040 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
14050 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61  ** Pragma virtua
14060 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
14070 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a  Filter method..*
14080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
14090 67 6d 61 56 74 61 62 46 69 6c 74 65 72 28 0a 20  gmaVtabFilter(. 
140a0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
140b0 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
140c0 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d  r, .  int idxNum
140d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64  , const char *id
140e0 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63  xStr,.  int argc
140f0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
14100 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72 61 67  **argv.){.  Prag
14110 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
14120 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
14130 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
14140 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  sor;.  PragmaVta
14150 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
14160 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72  aVtab*)(pVtabCur
14170 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69  sor->pVtab);.  i
14180 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
14190 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63  j;.  StrAccum ac
141a0 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  c;.  char *zSql;
141b0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
141c0 45 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20 20  ETER(idxNum);.  
141d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
141e0 28 69 64 78 53 74 72 29 3b 0a 20 20 70 72 61 67  (idxStr);.  prag
141f0 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
14200 72 28 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20 28  r(pCsr);.  j = (
14210 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50 72  pTab->pName->mPr
14220 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
14230 52 65 73 75 6c 74 31 29 21 3d 30 20 3f 20 30 20  Result1)!=0 ? 0 
14240 3a 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  : 1;.  for(i=0; 
14250 69 3c 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b 2b  i<argc; i++, j++
14260 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
14270 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73  r *zText = (cons
14280 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
14290 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
142a0 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  i]);.    assert(
142b0 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73   j<ArraySize(pCs
142c0 72 2d 3e 61 7a 41 72 67 29 20 29 3b 0a 20 20 20  r->azArg) );.   
142d0 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61   assert( pCsr->a
142e0 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 3b 0a 20 20  zArg[j]==0 );.  
142f0 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20    if( zText ){. 
14300 20 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67       pCsr->azArg
14310 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  [j] = sqlite3_mp
14320 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 54 65 78  rintf("%s", zTex
14330 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  t);.      if( pC
14340 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20  sr->azArg[j]==0 
14350 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
14360 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
14370 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14380 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
14390 63 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c  cumInit(&acc, 0,
143a0 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 64 62 2d   0, 0, pTab->db-
143b0 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
143c0 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
143d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72  );.  sqlite3_str
143e0 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c  _appendall(&acc,
143f0 20 22 50 52 41 47 4d 41 20 22 29 3b 0a 20 20 69   "PRAGMA ");.  i
14400 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31  f( pCsr->azArg[1
14410 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
14420 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63  _str_appendf(&ac
14430 63 2c 20 22 25 51 2e 22 2c 20 70 43 73 72 2d 3e  c, "%Q.", pCsr->
14440 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a 20  azArg[1]);.  }. 
14450 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
14460 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 70 54 61  endall(&acc, pTa
14470 62 2d 3e 70 4e 61 6d 65 2d 3e 7a 4e 61 6d 65 29  b->pName->zName)
14480 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a  ;.  if( pCsr->az
14490 41 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 73 71  Arg[0] ){.    sq
144a0 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
144b0 66 28 26 61 63 63 2c 20 22 3d 25 51 22 2c 20 70  f(&acc, "=%Q", p
144c0 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b 0a  Csr->azArg[0]);.
144d0 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c    }.  zSql = sql
144e0 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
144f0 73 68 28 26 61 63 63 29 3b 0a 20 20 69 66 28 20  sh(&acc);.  if( 
14500 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
14510 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
14530 65 70 61 72 65 5f 76 32 28 70 54 61 62 2d 3e 64  epare_v2(pTab->d
14540 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43  b, zSql, -1, &pC
14550 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29 3b  sr->pPragma, 0);
14560 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
14570 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  zSql);.  if( rc!
14580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14590 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72    pTab->base.zEr
145a0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
145b0 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
145c0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 54 61 62  ite3_errmsg(pTab
145d0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 72 65 74 75  ->db));.    retu
145e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74  rn rc;.  }.  ret
145f0 75 72 6e 20 70 72 61 67 6d 61 56 74 61 62 4e 65  urn pragmaVtabNe
14600 78 74 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  xt(pVtabCursor);
14610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d 61  .}../*.** Pragma
14620 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
14630 6f 64 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f  odule xEof metho
14640 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14650 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 28 73   pragmaVtabEof(s
14660 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
14670 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29  or *pVtabCursor)
14680 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
14690 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
146a0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
146b0 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72  pVtabCursor;.  r
146c0 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 70 50 72  eturn (pCsr->pPr
146d0 61 67 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20  agma==0);.}../* 
146e0 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68  The xColumn meth
146f0 6f 64 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  od simply return
14700 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
14710 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  ing column from.
14720 2a 2a 20 74 68 65 20 50 52 41 47 4d 41 2e 20 20  ** the PRAGMA.  
14730 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14740 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 28  ragmaVtabColumn(
14750 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
14760 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
14770 73 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  sor, .  sqlite3_
14780 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20  context *ctx, . 
14790 20 69 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61 67   int i.){.  Prag
147a0 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
147b0 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
147c0 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
147d0 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  sor;.  PragmaVta
147e0 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
147f0 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72  aVtab*)(pVtabCur
14800 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69  sor->pVtab);.  i
14810 66 28 20 69 3c 70 54 61 62 2d 3e 69 48 69 64 64  f( i<pTab->iHidd
14820 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
14830 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
14840 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  tx, sqlite3_colu
14850 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70  mn_value(pCsr->p
14860 50 72 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20 7d  Pragma, i));.  }
14870 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
14880 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
14890 78 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69  x, pCsr->azArg[i
148a0 2d 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d 2c  -pTab->iHidden],
148b0 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  -1,SQLITE_TRANSI
148c0 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ENT);.  }.  retu
148d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
148e0 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ./* .** Pragma v
148f0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
14900 75 6c 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f  ule xRowid metho
14910 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14920 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77 69 64   pragmaVtabRowid
14930 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
14940 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
14950 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  r, sqlite_int64 
14960 2a 70 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  *p){.  PragmaVta
14970 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  bCursor *pCsr = 
14980 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
14990 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r*)pVtabCursor;.
149a0 20 20 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52 6f    *p = pCsr->iRo
149b0 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  wid;.  return SQ
149c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54  LITE_OK;.}../* T
149d0 68 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61  he pragma virtua
149e0 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a  l table object *
149f0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
14a00 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70 72  qlite3_module pr
14a10 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20 3d  agmaVtabModule =
14a20 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20   {.  0,         
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
14a50 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 63 72 65  /* xCreate - cre
14a80 61 74 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20  ate a table */. 
14a90 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65   pragmaVtabConne
14aa0 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
14ab0 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e   xConnect - conn
14ac0 65 63 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69  ect to an existi
14ad0 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72  ng table */.  pr
14ae0 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65  agmaVtabBestInde
14af0 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42  x,         /* xB
14b00 65 73 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72  estIndex - Deter
14b10 6d 69 6e 65 20 73 65 61 72 63 68 20 73 74 72 61  mine search stra
14b20 74 65 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d 61  tegy */.  pragma
14b30 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c 20  VtabDisconnect, 
14b40 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f         /* xDisco
14b50 6e 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65  nnect - Disconne
14b60 63 74 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  ct from a table 
14b70 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b90 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20    /* xDestroy - 
14ba0 44 72 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a  Drop a table */.
14bb0 20 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e    pragmaVtabOpen
14bc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
14bd0 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61  * xOpen - open a
14be0 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61   cursor */.  pra
14bf0 67 6d 61 56 74 61 62 43 6c 6f 73 65 2c 20 20 20  gmaVtabClose,   
14c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
14c10 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75  ose - close a cu
14c20 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61  rsor */.  pragma
14c30 56 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20  VtabFilter,     
14c40 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
14c50 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63  r - configure sc
14c60 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  an constraints *
14c70 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4e 65  /.  pragmaVtabNe
14c80 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
14c90 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61   /* xNext - adva
14ca0 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  nce a cursor */.
14cb0 20 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 2c    pragmaVtabEof,
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14cd0 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61 67  * xEof */.  prag
14ce0 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20  maVtabColumn,   
14cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
14d00 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
14d10 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 52  */.  pragmaVtabR
14d20 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
14d30 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65    /* xRowid - re
14d40 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20  ad data */.  0, 
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70            /* xUp
14d70 64 61 74 65 20 2d 20 77 72 69 74 65 20 64 61 74  date - write dat
14d80 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  a */.  0,       
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14da0 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20      /* xBegin - 
14db0 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
14dc0 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73      /* xSync - s
14df0 79 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ync transaction 
14e00 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63    /* xCommit - c
14e30 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f  ommit transactio
14e40 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
14e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e60 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
14e70 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e   - rollback tran
14e80 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
14eb0 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e  ndFunction - fun
14ec0 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
14ed0 67 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  g */.  0,       
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ef0 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d      /* xRename -
14f00 20 72 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c   rename the tabl
14f10 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e      /* xSavepoin
14f40 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f60 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20      /* xRelease 
14f70 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f    /* xRollbackTo
14fa0 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fc0 20 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e 61 6d     /* xShadowNam
14fd0 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  e */.};../*.** C
14fe0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 7a  heck to see if z
14ff0 54 61 62 4e 61 6d 65 20 69 73 20 72 65 61 6c 6c  TabName is reall
15000 79 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  y the name of a 
15010 70 72 61 67 6d 61 2e 20 20 49 66 20 69 74 20 69  pragma.  If it i
15020 73 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 67 69 73  s,.** then regis
15030 74 65 72 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73  ter an eponymous
15040 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66   virtual table f
15050 6f 72 20 74 68 61 74 20 70 72 61 67 6d 61 20 61  or that pragma a
15060 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70  nd return.** a p
15070 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 6f  ointer to the Mo
15080 64 75 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  dule object for 
15090 74 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20  the new virtual 
150a0 74 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65  table..*/.Module
150b0 20 2a 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56   *sqlite3PragmaV
150c0 74 61 62 52 65 67 69 73 74 65 72 28 73 71 6c 69  tabRegister(sqli
150d0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
150e0 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63  har *zName){.  c
150f0 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
15100 2a 70 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  *pName;.  assert
15110 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
15120 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d  mp(zName, "pragm
15130 61 5f 22 2c 20 37 29 3d 3d 30 20 29 3b 0a 20 20  a_", 7)==0 );.  
15140 70 4e 61 6d 65 20 3d 20 70 72 61 67 6d 61 4c 6f  pName = pragmaLo
15150 63 61 74 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a 20  cate(zName+7);. 
15160 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 20   if( pName==0 ) 
15170 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
15180 28 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67  (pName->mPragFlg
15190 20 26 20 28 50 72 61 67 46 6c 67 5f 52 65 73 75   & (PragFlg_Resu
151a0 6c 74 30 7c 50 72 61 67 46 6c 67 5f 52 65 73 75  lt0|PragFlg_Resu
151b0 6c 74 31 29 29 3d 3d 30 20 29 20 72 65 74 75 72  lt1))==0 ) retur
151c0 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  n 0;.  assert( s
151d0 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
151e0 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61  db->aModule, zNa
151f0 6d 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  me)==0 );.  retu
15200 72 6e 20 73 71 6c 69 74 65 33 56 74 61 62 43 72  rn sqlite3VtabCr
15210 65 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a  eateModule(db, z
15220 4e 61 6d 65 2c 20 26 70 72 61 67 6d 61 56 74 61  Name, &pragmaVta
15230 62 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64 2a 29  bModule, (void*)
15240 70 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65  pName, 0);.}..#e
15250 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
15260 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
15270 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
15280 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d  QLITE_OMIT_PRAGM
15290 41 20 2a 2f 0a                                   A */.