/ Hex Artifact Content
Login

Artifact a4e5028dfc8af4c5c347cd0e91bd2f0c0f81fcd9b2c6e0acf8da7da51df7f1fe:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 74  esult row with t
2400: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 68 65 6c  he result.** hel
2410: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 65  d in register re
2420: 67 52 65 73 75 6c 74 2e 20 20 44 65 63 72 65 6d  gResult.  Decrem
2430: 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74 20 63  ent the result c
2440: 6f 75 6e 74 20 61 6e 64 20 68 61 6c 74 20 69 66  ount and halt if
2450: 0a 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  .** the maximum 
2460: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
2470: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
2480: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
2490: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
24a0: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24b0: 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 52 65  be *v, int regRe
24c0: 73 75 6c 74 29 7b 0a 20 20 69 6e 74 20 61 64 64  sult){.  int add
24d0: 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  r;.  sqlite3Vdbe
24e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
24f0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
2500: 74 2c 20 31 29 3b 0a 20 20 61 64 64 72 20 3d 20  t, 1);.  addr = 
2510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2520: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  3(v, OP_IfPos, 1
2530: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
2540: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 31  rentAddr(v)+2, 1
2550: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
2560: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
2570: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2580: 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 72  Halt, 0, 0);.  r
2590: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
25a0: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70  *.** Process a p
25b0: 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  ragma statement.
25c0: 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73    .**.** Pragmas
25d0: 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72   are of this for
25e0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52  m:.**.**      PR
25f0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 64  AGMA [schema.]id
2600: 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a   [= value].**.**
2610: 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   The identifier 
2620: 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
2630: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c  string.  The val
2640: 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  ue is a string, 
2650: 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  and.** identifie
2660: 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20  r, or a number. 
2670: 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73   If minusFlag is
2680: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
2690: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75  value is.** a nu
26a0: 6d 62 65 72 20 74 68 61 74 20 77 61 73 20 70 72  mber that was pr
26b0: 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75  eceded by a minu
26c0: 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  s sign..**.** If
26d0: 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 20 69   the left side i
26e0: 73 20 22 64 61 74 61 62 61 73 65 2e 69 64 22 20  s "database.id" 
26f0: 74 68 65 6e 20 70 49 64 31 20 69 73 20 74 68 65  then pId1 is the
2700: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
2710: 2a 20 61 6e 64 20 70 49 64 32 20 69 73 20 74 68  * and pId2 is th
2720: 65 20 69 64 2e 20 20 49 66 20 74 68 65 20 6c 65  e id.  If the le
2730: 66 74 20 73 69 64 65 20 69 73 20 6a 75 73 74 20  ft side is just 
2740: 22 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69  "id" then pId1 i
2750: 73 20 74 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20  s the.** id and 
2760: 70 49 64 32 20 69 73 20 61 6e 79 20 65 6d 70 74  pId2 is any empt
2770: 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  y string..*/.voi
2780: 64 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28  d sqlite3Pragma(
2790: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27a0: 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31  , .  Token *pId1
27b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ,        /* Firs
27c0: 74 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  t part of [schem
27d0: 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20  a.]id field */. 
27e0: 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c 20 20 20   Token *pId2,   
27f0: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
2800: 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d  art of [schema.]
2810: 69 64 20 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c  id field, or NUL
2820: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56  L */.  Token *pV
2830: 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f  alue,      /* To
2840: 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c  ken for <value>,
2850: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
2860: 74 20 6d 69 6e 75 73 46 6c 61 67 20 20 20 20 20  t minusFlag     
2870: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 27    /* True if a '
2880: 2d 27 20 73 69 67 6e 20 70 72 65 63 65 64 65 64  -' sign preceded
2890: 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20   <value> */.){. 
28a0: 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30   char *zLeft = 0
28b0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  ;       /* Nul-t
28c0: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
28d0: 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20  string <id> */. 
28e0: 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20   char *zRight = 
28f0: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  0;      /* Nul-t
2900: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
2910: 73 74 72 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20  string <value>, 
2920: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
2930: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
2940: 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
2950: 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f  ase name */.  To
2960: 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20 20 20 20  ken *pId;       
2970: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2980: 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f  to <id> token */
2990: 0a 20 20 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b  .  char *aFcntl[
29a0: 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 67  4];       /* Arg
29b0: 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f  ument to SQLITE_
29c0: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a  FCNTL_PRAGMA */.
29d0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
29e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
29f0: 62 61 73 65 20 69 6e 64 65 78 20 66 6f 72 20 3c  base index for <
2a00: 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a 20 20 69  database> */.  i
2a10: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
2a30: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 6d  eturn value form
2a40: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
2a50: 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c 69 74 65  AGMA */.  sqlite
2a60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2a70: 64 62 3b 20 20 20 20 2f 2a 20 54 68 65 20 64 61  db;    /* The da
2a80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a90: 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20  n */.  Db *pDb; 
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
2ac0: 66 69 63 20 64 61 74 61 62 61 73 65 20 62 65 69  fic database bei
2ad0: 6e 67 20 70 72 61 67 6d 61 65 64 20 2a 2f 0a 20  ng pragmaed */. 
2ae0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
2af0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2b00: 29 3b 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20  );  /* Prepared 
2b10: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
2b20: 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
2b30: 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f 2a 20 54  *pPragma;   /* T
2b40: 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 0a 20 20  he pragma */..  
2b50: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
2b60: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
2b70: 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76 29 3b 0a  RunOnlyOnce(v);.
2b80: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
2b90: 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 70   2;..  /* Interp
2ba0: 72 65 74 20 74 68 65 20 5b 73 63 68 65 6d 61 2e  ret the [schema.
2bb0: 5d 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72  ] part of the pr
2bc0: 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20  agma statement. 
2bd0: 69 44 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20  iDb is the.  ** 
2be0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
2bf0: 61 62 61 73 65 20 74 68 69 73 20 70 72 61 67 6d  abase this pragm
2c00: 61 20 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69  a is being appli
2c10: 65 64 20 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b  ed to in db.aDb[
2c20: 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  ]. */.  iDb = sq
2c30: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
2c40: 28 70 50 61 72 73 65 2c 20 70 49 64 31 2c 20 70  (pParse, pId1, p
2c50: 49 64 32 2c 20 26 70 49 64 29 3b 0a 20 20 69 66  Id2, &pId);.  if
2c60: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
2c70: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
2c80: 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 49  Db[iDb];..  /* I
2c90: 66 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  f the temp datab
2ca0: 61 73 65 20 68 61 73 20 62 65 65 6e 20 65 78 70  ase has been exp
2cb0: 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64 20 61 73  licitly named as
2cc0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 0a 20 20   part of the .  
2cd0: 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61 6b 65 20  ** pragma, make 
2ce0: 73 75 72 65 20 69 74 20 69 73 20 6f 70 65 6e 2e  sure it is open.
2cf0: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62   .  */.  if( iDb
2d00: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 4f 70  ==1 && sqlite3Op
2d10: 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
2d20: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
2d30: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 4c 65  turn;.  }..  zLe
2d40: 66 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ft = sqlite3Name
2d50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 49  FromToken(db, pI
2d60: 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c 65 66 74  d);.  if( !zLeft
2d70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2d80: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
2d90: 20 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74    zRight = sqlit
2da0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d  e3MPrintf(db, "-
2db0: 25 54 22 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  %T", pValue);.  
2dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68  }else{.    zRigh
2dd0: 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  t = sqlite3NameF
2de0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 56 61  romToken(db, pVa
2df0: 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  lue);.  }..  ass
2e00: 65 72 74 28 20 70 49 64 32 20 29 3b 0a 20 20 7a  ert( pId2 );.  z
2e10: 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e 30 20 3f  Db = pId2->n>0 ?
2e20: 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a   pDb->zDbSName :
2e30: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
2e40: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
2e50: 65 2c 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e, SQLITE_PRAGMA
2e60: 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 2c  , zLeft, zRight,
2e70: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 67 6f 74   zDb) ){.    got
2e80: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
2e90: 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20 61 6e 20  }..  /* Send an 
2ea0: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
2eb0: 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GMA file-control
2ec0: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
2ed0: 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e  ng VFS.  ** conn
2ee0: 65 63 74 69 6f 6e 2e 20 20 49 66 20 69 74 20 72  ection.  If it r
2ef0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2f00: 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68  , then assume th
2f10: 61 74 20 74 68 65 20 56 46 53 0a 20 20 2a 2a 20  at the VFS.  ** 
2f20: 68 61 6e 64 6c 65 64 20 74 68 65 20 70 72 61 67  handled the prag
2f30: 6d 61 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ma and generate 
2f40: 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61 72 65 64  a no-op prepared
2f50: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a   statement..  **
2f60: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
2f70: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32 32 33 38  TION-OF: R-12238
2f80: 2d 35 35 31 32 30 20 57 68 65 6e 65 76 65 72 20  -55120 Whenever 
2f90: 61 20 50 52 41 47 4d 41 20 73 74 61 74 65 6d 65  a PRAGMA stateme
2fa0: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 0a 20 20  nt is parsed,.  
2fb0: 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e  ** an SQLITE_FCN
2fc0: 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c 65 20 63  TL_PRAGMA file c
2fd0: 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e 74 20 74  ontrol is sent t
2fe0: 6f 20 74 68 65 20 6f 70 65 6e 20 73 71 6c 69 74  o the open sqlit
2ff0: 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a  e3_file.  ** obj
3000: 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
3010: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
3020: 65 20 66 69 6c 65 20 74 6f 20 77 68 69 63 68 20  e file to which 
3030: 74 68 65 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20  the pragma.  ** 
3040: 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 73  statement refers
3050: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
3060: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
3070: 2d 32 39 38 37 35 2d 33 31 36 37 38 20 54 68 65  -29875-31678 The
3080: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3090: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
30a0: 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c 65 20 63  AGMA.  ** file c
30b0: 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20 61 72 72  ontrol is an arr
30c0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
30d0: 6f 20 73 74 72 69 6e 67 73 20 28 63 68 61 72 2a  o strings (char*
30e0: 2a 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a  *) in which the.
30f0: 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d    ** second elem
3100: 65 6e 74 20 6f 66 20 74 68 65 20 61 72 72 61 79  ent of the array
3110: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
3120: 74 68 65 20 70 72 61 67 6d 61 20 61 6e 64 20 74  the pragma and t
3130: 68 65 20 74 68 69 72 64 0a 20 20 2a 2a 20 65 6c  he third.  ** el
3140: 65 6d 65 6e 74 20 69 73 20 74 68 65 20 61 72 67  ement is the arg
3150: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 61  ument to the pra
3160: 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  gma or NULL if t
3170: 68 65 20 70 72 61 67 6d 61 20 68 61 73 20 6e 6f  he pragma has no
3180: 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  .  ** argument..
3190: 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d    */.  aFcntl[0]
31a0: 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31   = 0;.  aFcntl[1
31b0: 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63  ] = zLeft;.  aFc
31c0: 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b  ntl[2] = zRight;
31d0: 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30  .  aFcntl[3] = 0
31e0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
31f0: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
3200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
3210: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
3220: 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
3230: 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29  _PRAGMA, (void*)
3240: 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72  aFcntl);.  if( r
3250: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3270: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b  etNumCols(v, 1);
3280: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3290: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c  SetColName(v, 0,
32a0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61   COLNAME_NAME, a
32b0: 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c 49 54 45  Fcntl[0], SQLITE
32c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
32d0: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
32e0: 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b  t(v, aFcntl[0]);
32f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
3300: 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20  e(aFcntl[0]);.  
3310: 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75    goto pragma_ou
3320: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  t;.  }.  if( rc!
3330: 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
3340: 20 29 7b 0a 20 20 20 20 69 66 28 20 61 46 63 6e   ){.    if( aFcn
3350: 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  tl[0] ){.      s
3360: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3370: 50 61 72 73 65 2c 20 22 25 73 22 2c 20 61 46 63  Parse, "%s", aFc
3380: 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73  ntl[0]);.      s
3390: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e  qlite3_free(aFcn
33a0: 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  tl[0]);.    }.  
33b0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
33c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
33d0: 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20   = rc;.    goto 
33e0: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a  pragma_out;.  }.
33f0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
3400: 20 70 72 61 67 6d 61 20 69 6e 20 74 68 65 20 6c   pragma in the l
3410: 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a 2f 0a 20  ookup table */. 
3420: 20 70 50 72 61 67 6d 61 20 3d 20 70 72 61 67 6d   pPragma = pragm
3430: 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74 29 3b 0a  aLocate(zLeft);.
3440: 20 20 69 66 28 20 70 50 72 61 67 6d 61 3d 3d 30    if( pPragma==0
3450: 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f   ) goto pragma_o
3460: 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ut;..  /* Make s
3470: 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
3480: 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65   schema is loade
3490: 64 20 69 66 20 74 68 65 20 70 72 61 67 6d 61 20  d if the pragma 
34a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 2a 2f  requires that */
34b0: 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d  .  if( (pPragma-
34c0: 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
34d0: 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d 61 29 21  Flg_NeedSchema)!
34e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
34f0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
3500: 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70  pParse) ) goto p
3510: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  ragma_out;.  }..
3520: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
3530: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
3540: 6e 61 6d 65 73 20 66 6f 72 20 70 72 61 67 6d 61  names for pragma
3550: 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 72 65  s that return re
3560: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66 28 20 28  sults */.  if( (
3570: 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
3580: 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f  g & PragFlg_NoCo
3590: 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20 20 26 26  lumns)==0 .   &&
35a0: 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61   ((pPragma->mPra
35b0: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
35c0: 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c  oColumns1)==0 ||
35d0: 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20 20 29 7b   zRight==0).  ){
35e0: 0a 20 20 20 20 73 65 74 50 72 61 67 6d 61 52 65  .    setPragmaRe
35f0: 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  sultColumnNames(
3600: 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d  v, pPragma);.  }
3610: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
3620: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
3630: 72 61 67 6d 61 20 68 61 6e 64 6c 65 72 20 2a 2f  ragma handler */
3640: 0a 20 20 73 77 69 74 63 68 28 20 70 50 72 61 67  .  switch( pPrag
3650: 6d 61 2d 3e 65 50 72 61 67 54 79 70 20 29 7b 0a  ma->ePragTyp ){.
3660: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
3670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
3680: 52 5f 50 52 41 47 4d 41 53 29 20 26 26 20 21 64  R_PRAGMAS) && !d
3690: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
36a0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20  IT_DEPRECATED). 
36b0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
36c0: 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c   [schema.]defaul
36d0: 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a  t_cache_size.  *
36e0: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
36f0: 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65  a.]default_cache
3700: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
3710: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
3720: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
3730: 72 65 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20  rent persistent 
3740: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
3750: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
3760: 73 69 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65  size.  The value
3770: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
3780: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
3790: 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e  of.  ** pages in
37a0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
37b0: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
37c0: 6d 20 73 65 74 73 20 62 6f 74 68 20 74 68 65 20  m sets both the 
37d0: 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67  current.  ** pag
37e0: 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
37f0: 75 65 20 61 6e 64 20 74 68 65 20 70 65 72 73 69  ue and the persi
3800: 73 74 65 6e 74 20 70 61 67 65 20 63 61 63 68 65  stent page cache
3810: 20 73 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a   size value.  **
3820: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
3830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
3840: 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65  **.  ** Older ve
3850: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
3860: 20 77 6f 75 6c 64 20 73 65 74 20 74 68 65 20 64   would set the d
3870: 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a  efault cache siz
3880: 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61  e to a.  ** nega
3890: 74 69 76 65 20 6e 75 6d 62 65 72 20 74 6f 20 69  tive number to i
38a0: 6e 64 69 63 61 74 65 20 73 79 6e 63 68 72 6f 6e  ndicate synchron
38b0: 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65 73 65 20  ous=OFF.  These 
38c0: 64 61 79 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75  days, synchronou
38d0: 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  s.  ** is always
38e0: 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 72   on by default r
38f0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
3900: 20 73 69 67 6e 20 6f 66 20 74 68 65 20 64 65 66   sign of the def
3910: 61 75 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20  ault cache.  ** 
3920: 73 69 7a 65 2e 20 20 42 75 74 20 63 6f 6e 74 69  size.  But conti
3930: 6e 75 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  nue to take the 
3940: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
3950: 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61  f the default ca
3960: 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  che.  ** size of
3970: 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
3980: 61 74 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a  atibility..  */.
3990: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44    case PragTyp_D
39a0: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
39b0: 45 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  E: {.    static 
39c0: 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20  const int iLn = 
39d0: 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45  VDBE_OFFSET_LINE
39e0: 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69  NO(2);.    stati
39f0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
3a00: 73 74 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  st getCacheSize[
3a10: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
3a20: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c  _Transaction, 0,
3a30: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20         /* 0 */. 
3a60: 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f       { OP_ReadCo
3a70: 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20 20 20 20  okie,  0, 1,    
3a80: 20 20 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c      BTREE_DEFAUL
3a90: 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20  T_CACHE_SIZE},  
3aa0: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
3ab0: 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20  OP_IfPos,       
3ac0: 31 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 8,        0},
3ad0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
3ae0: 67 65 72 2c 20 20 20 20 20 30 2c 20 32 2c 20 20  ger,     0, 2,  
3af0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3b00: 7b 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 20  { OP_Subtract,  
3b10: 20 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20 31    1, 2,        1
3b20: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66  },.      { OP_If
3b30: 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c  Pos,       1, 8,
3b40: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
3b50: 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
3b60: 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20      0, 1,       
3b70: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20   0},            
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b90: 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  6 */.      { OP_
3ba0: 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 30 2c 20  Noop,        0, 
3bb0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
3bc0: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
3bd0: 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  ow,   1, 1,     
3be0: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
3bf0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
3c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
3c10: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
3c20: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
3c30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
3c40: 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20  ->nMem += 2;.   
3c50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
3c60: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
3c70: 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a  ired(v, ArraySiz
3c80: 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 29  e(getCacheSize))
3c90: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
3ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
3cb0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
3cc0: 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67  getCacheSize), g
3cd0: 65 74 43 61 63 68 65 53 69 7a 65 2c 20 69 4c 6e  etCacheSize, iLn
3ce0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c  );.      if( ONL
3cf0: 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  Y_IF_REALLOC_STR
3d00: 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72  ESS(aOp==0) ) br
3d10: 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30  eak;.      aOp[0
3d20: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
3d30: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
3d40: 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 36 5d 2e  b;.      aOp[6].
3d50: 70 31 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  p1 = SQLITE_DEFA
3d60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a  ULT_CACHE_SIZE;.
3d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3d80: 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69   int size = sqli
3d90: 74 65 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69  te3AbsInt32(sqli
3da0: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29  te3Atoi(zRight))
3db0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3dc0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
3dd0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
3de0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
3df0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3e00: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
3e10: 2c 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f  , BTREE_DEFAULT_
3e20: 43 41 43 48 45 5f 53 49 5a 45 2c 20 73 69 7a 65  CACHE_SIZE, size
3e30: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3e40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3e50: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3e60: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 44 62   0) );.      pDb
3e70: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
3e80: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
3e90: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
3ea0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62  SetCacheSize(pDb
3eb0: 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68  ->pBt, pDb->pSch
3ec0: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29  ema->cache_size)
3ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
3ee0: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
3ef0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41   !SQLITE_OMIT_PA
3f00: 47 45 52 5f 50 52 41 47 4d 41 53 20 26 26 20 21  GER_PRAGMAS && !
3f10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
3f20: 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69 66 20 21  ECATED */..#if !
3f30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3f40: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
3f50: 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  S).  /*.  **  PR
3f60: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f70: 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  ge_size.  **  PR
3f80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f90: 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  ge_size=N.  **. 
3fa0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
3fb0: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
3fc0: 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66  urrent setting f
3fd0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  or the.  ** data
3fe0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 69  base page size i
3ff0: 6e 20 62 79 74 65 73 2e 20 20 54 68 65 20 73 65  n bytes.  The se
4000: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
4010: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
4020: 20 70 61 67 65 20 73 69 7a 65 20 76 61 6c 75 65   page size value
4030: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 63 61 6e  .  The value can
4040: 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 0a   only be set if.
4050: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
4060: 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
4070: 65 6e 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  en created..  */
4080: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4090: 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  PAGE_SIZE: {.   
40a0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
40b0: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  b->pBt;.    asse
40c0: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
40d0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
40e0: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
40f0: 3d 20 41 4c 57 41 59 53 28 70 42 74 29 20 3f 20  = ALWAYS(pBt) ? 
4100: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
4110: 61 67 65 53 69 7a 65 28 70 42 74 29 20 3a 20 30  ageSize(pBt) : 0
4120: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
4130: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69 7a 65 29  ngleInt(v, size)
4140: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4150: 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79     /* Malloc may
4160: 20 66 61 69 6c 20 77 68 65 6e 20 73 65 74 74 69   fail when setti
4170: 6e 67 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  ng the page-size
4180: 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 61 6e  , as there is an
4190: 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20   internal.      
41a0: 2a 2a 20 62 75 66 66 65 72 20 74 68 61 74 20 74  ** buffer that t
41b0: 68 65 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20  he pager module 
41c0: 72 65 73 69 7a 65 73 20 75 73 69 6e 67 20 73 71  resizes using sq
41d0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e  lite3_realloc().
41e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
41f0: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4200: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
4210: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66  Right);.      if
4220: 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
4230: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
4240: 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
4250: 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 2d 31  >nextPagesize,-1
4260: 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ,0) ){.        s
4270: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
4280: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
4290: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
42a0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
42b0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63  GMA [schema.]sec
42c0: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
42d0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
42e0: 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f  ]secure_delete=O
42f0: 4e 2f 4f 46 46 2f 46 41 53 54 0a 20 20 2a 2a 0a  N/OFF/FAST.  **.
4300: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
4310: 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20  orm reports the 
4320: 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
4330: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 65 63  for the.  ** sec
4340: 75 72 65 5f 64 65 6c 65 74 65 20 66 6c 61 67 2e  ure_delete flag.
4350: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
4360: 6d 20 63 68 61 6e 67 65 73 20 74 68 65 20 73 65  m changes the se
4370: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a  cure_delete.  **
4380: 20 66 6c 61 67 20 73 65 74 74 69 6e 67 20 61 6e   flag setting an
4390: 64 20 72 65 70 6f 72 74 73 20 74 68 65 20 6e 65  d reports the ne
43a0: 77 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  w value..  */.  
43b0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 45 43  case PragTyp_SEC
43c0: 55 52 45 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20  URE_DELETE: {.  
43d0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
43e0: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 69 6e 74  Db->pBt;.    int
43f0: 20 62 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73   b = -1;.    ass
4400: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
4410: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
4420: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
4430: 65 33 5f 73 74 72 69 63 6d 70 28 7a 52 69 67 68  e3_stricmp(zRigh
4440: 74 2c 20 22 66 61 73 74 22 29 3d 3d 30 20 29 7b  t, "fast")==0 ){
4450: 0a 20 20 20 20 20 20 20 20 62 20 3d 20 32 3b 0a  .        b = 2;.
4460: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4470: 20 20 20 20 20 62 20 3d 20 73 71 6c 69 74 65 33       b = sqlite3
4480: 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  GetBoolean(zRigh
4490: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
44a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
44b0: 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e 3d 30 20  2->n==0 && b>=0 
44c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
44d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
44e0: 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b   ii<db->nDb; ii+
44f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
4500: 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
4510: 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b 69 69 5d  lete(db->aDb[ii]
4520: 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20 20 20 20  .pBt, b);.      
4530: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 20 3d 20  }.    }.    b = 
4540: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
4550: 72 65 44 65 6c 65 74 65 28 70 42 74 2c 20 62 29  reDelete(pBt, b)
4560: 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  ;.    returnSing
4570: 6c 65 49 6e 74 28 76 2c 20 62 29 3b 0a 20 20 20  leInt(v, b);.   
4580: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
4590: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
45a0: 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61 67 65  schema.]max_page
45b0: 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 50 52 41  _count.  **  PRA
45c0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78  GMA [schema.]max
45d0: 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e 0a 20 20  _page_count=N.  
45e0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
45f0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
4600: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
4610: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
4620: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
4630: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
4640: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
4650: 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20  he .  ** second 
4660: 66 6f 72 6d 20 61 74 74 65 6d 70 74 73 20 74 6f  form attempts to
4670: 20 63 68 61 6e 67 65 20 74 68 69 73 20 73 65 74   change this set
4680: 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20 20 2a 2a  ting.  Both.  **
4690: 20 66 6f 72 6d 73 20 72 65 74 75 72 6e 20 74 68   forms return th
46a0: 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
46b0: 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  g..  **.  ** The
46c0: 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20   absolute value 
46d0: 6f 66 20 4e 20 69 73 20 75 73 65 64 2e 20 20 54  of N is used.  T
46e0: 68 69 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e  his is undocumen
46f0: 74 65 64 20 61 6e 64 20 6d 69 67 68 74 0a 20 20  ted and might.  
4700: 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20  ** change.  The 
4710: 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73 20  only purpose is 
4720: 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 61  to provide an ea
4730: 73 79 20 77 61 79 20 74 6f 20 74 65 73 74 0a 20  sy way to test. 
4740: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 41   ** the sqlite3A
4750: 62 73 49 6e 74 33 32 28 29 20 66 75 6e 63 74 69  bsInt32() functi
4760: 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 50  on..  **.  **  P
4770: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70  RAGMA [schema.]p
4780: 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20  age_count.  **. 
4790: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
47a0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
47b0: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
47c0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
47d0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 41   case PragTyp_PA
47e0: 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20 20 20  GE_COUNT: {.    
47f0: 69 6e 74 20 69 52 65 67 3b 0a 20 20 20 20 73 71  int iReg;.    sq
4800: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
4810: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
4820: 62 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 2b  b);.    iReg = +
4830: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
4840: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 6f     if( sqlite3To
4850: 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d  lower(zLeft[0])=
4860: 3d 27 70 27 20 29 7b 0a 20 20 20 20 20 20 73 71  ='p' ){.      sq
4870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4880: 76 2c 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74 2c  v, OP_Pagecount,
4890: 20 69 44 62 2c 20 69 52 65 67 29 3b 0a 20 20 20   iDb, iReg);.   
48a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
48b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
48c0: 76 2c 20 4f 50 5f 4d 61 78 50 67 63 6e 74 2c 20  v, OP_MaxPgcnt, 
48d0: 69 44 62 2c 20 69 52 65 67 2c 20 0a 20 20 20 20  iDb, iReg, .    
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48f0: 20 20 20 20 73 71 6c 69 74 65 33 41 62 73 49 6e      sqlite3AbsIn
4900: 74 33 32 28 73 71 6c 69 74 65 33 41 74 6f 69 28  t32(sqlite3Atoi(
4910: 7a 52 69 67 68 74 29 29 29 3b 0a 20 20 20 20 7d  zRight)));.    }
4920: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4930: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
4940: 75 6c 74 52 6f 77 2c 20 69 52 65 67 2c 20 31 29  ultRow, iReg, 1)
4950: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
4960: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
4970: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63  GMA [schema.]loc
4980: 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20  king_mode.  **  
4990: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
49a0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 28  locking_mode = (
49b0: 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73 69 76 65  normal|exclusive
49c0: 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ).  */.  case Pr
49d0: 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  agTyp_LOCKING_MO
49e0: 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  DE: {.    const 
49f0: 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 22 6e 6f  char *zRet = "no
4a00: 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e 74 20 65  rmal";.    int e
4a10: 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63 6b 69 6e  Mode = getLockin
4a20: 67 4d 6f 64 65 28 7a 52 69 67 68 74 29 3b 0a 0a  gMode(zRight);..
4a30: 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d      if( pId2->n=
4a40: 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d 50 41 47  =0 && eMode==PAG
4a50: 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
4a60: 55 45 52 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a  UERY ){.      /*
4a70: 20 53 69 6d 70 6c 65 20 22 50 52 41 47 4d 41 20   Simple "PRAGMA 
4a80: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b 22 20 73  locking_mode;" s
4a90: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
4aa0: 73 20 61 20 71 75 65 72 79 20 66 6f 72 0a 20 20  s a query for.  
4ab0: 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
4ac0: 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  nt default locki
4ad0: 6e 67 20 6d 6f 64 65 20 28 77 68 69 63 68 20 6d  ng mode (which m
4ae0: 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
4af0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
4b00: 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6f 66 20  locking-mode of 
4b10: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
4b20: 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e)..      */.   
4b30: 20 20 20 65 4d 6f 64 65 20 3d 20 64 62 2d 3e 64     eMode = db->d
4b40: 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a 20 20 20  fltLockMode;.   
4b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 61   }else{.      Pa
4b60: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
4b70: 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d     if( pId2->n==
4b80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
4b90: 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 74  This indicates t
4ba0: 68 61 74 20 6e 6f 20 64 61 74 61 62 61 73 65 20  hat no database 
4bb0: 6e 61 6d 65 20 77 61 73 20 73 70 65 63 69 66 69  name was specifi
4bc0: 65 64 20 61 73 20 70 61 72 74 0a 20 20 20 20 20  ed as part.     
4bd0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 52 41     ** of the PRA
4be0: 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20  GMA command. In 
4bf0: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6c 6f  this case the lo
4c00: 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75 73 74 20  cking-mode must 
4c10: 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  be.        ** se
4c20: 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  t on all attache
4c30: 64 20 64 61 74 61 62 61 73 65 73 2c 20 61 73 20  d databases, as 
4c40: 77 65 6c 6c 20 61 73 20 74 68 65 20 6d 61 69 6e  well as the main
4c50: 20 64 62 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   db file..      
4c60: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
4c70: 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c 69 74 65  Also, the sqlite
4c80: 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 76  3.dfltLockMode v
4c90: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 73  ariable is set s
4ca0: 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  o that.        *
4cb0: 2a 20 61 6e 79 20 73 75 62 73 65 71 75 65 6e 74  * any subsequent
4cc0: 6c 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ly attached data
4cd0: 62 61 73 65 73 20 61 6c 73 6f 20 75 73 65 20 74  bases also use t
4ce0: 68 65 20 73 70 65 63 69 66 69 65 64 0a 20 20 20  he specified.   
4cf0: 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20       ** locking 
4d00: 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  mode..        */
4d10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
4d20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
4d30: 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62 5b 30 5d  pDb==&db->aDb[0]
4d40: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
4d50: 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=2; ii<db->nDb;
4d60: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
4d70: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
4d80: 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d  e3BtreePager(db-
4d90: 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29 3b 0a 20  >aDb[ii].pBt);. 
4da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4db0: 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
4dc0: 28 70 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b  (pPager, eMode);
4dd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4de0: 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d     db->dfltLockM
4df0: 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b  ode = (u8)eMode;
4e00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
4e10: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
4e20: 74 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70  treePager(pDb->p
4e30: 42 74 29 3b 0a 20 20 20 20 20 20 65 4d 6f 64 65  Bt);.      eMode
4e40: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
4e50: 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61 67 65  ockingMode(pPage
4e60: 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  r, eMode);.    }
4e70: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4d  ..    assert( eM
4e80: 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
4e90: 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20  NGMODE_NORMAL.  
4ea0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
4eb0: 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
4ec0: 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
4ed0: 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  );.    if( eMode
4ee0: 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
4ef0: 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  ODE_EXCLUSIVE ){
4f00: 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20 22 65  .      zRet = "e
4f10: 78 63 6c 75 73 69 76 65 22 3b 0a 20 20 20 20 7d  xclusive";.    }
4f20: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
4f30: 65 54 65 78 74 28 76 2c 20 7a 52 65 74 29 3b 0a  eText(v, zRet);.
4f40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4f50: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
4f60: 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e  A [schema.]journ
4f70: 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20 50 52  al_mode.  **  PR
4f80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f  AGMA [schema.]jo
4f90: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a 20 20 2a  urnal_mode =.  *
4fa0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
4fb0: 20 20 20 20 20 20 20 28 64 65 6c 65 74 65 7c 70         (delete|p
4fc0: 65 72 73 69 73 74 7c 6f 66 66 7c 74 72 75 6e 63  ersist|off|trunc
4fd0: 61 74 65 7c 6d 65 6d 6f 72 79 7c 77 61 6c 7c 6f  ate|memory|wal|o
4fe0: 66 66 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ff).  */.  case 
4ff0: 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f  PragTyp_JOURNAL_
5000: 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20  MODE: {.    int 
5010: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a  eMode;        /*
5020: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
5030: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58  R_JOURNALMODE_XX
5040: 58 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 20  X symbols */.   
5050: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
5060: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
5070: 65 72 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a  er */..    if( z
5080: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
5090: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
50a0: 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70 61 72 74   no "=MODE" part
50b0: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 2c 20   of the pragma, 
50c0: 64 6f 20 61 20 71 75 65 72 79 20 66 6f 72 20 74  do a query for t
50d0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  he.      ** curr
50e0: 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ent mode */.    
50f0: 20 20 65 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f    eMode = PAGER_
5100: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
5110: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
5120: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5130: 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20 69 6e 74  zMode;.      int
5140: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
5150: 65 6e 33 30 28 7a 52 69 67 68 74 29 3b 0a 20 20  en30(zRight);.  
5160: 20 20 20 20 66 6f 72 28 65 4d 6f 64 65 3d 30 3b      for(eMode=0;
5170: 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65   (zMode = sqlite
5180: 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65  3JournalModename
5190: 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20 65 4d 6f  (eMode))!=0; eMo
51a0: 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  de++){.        i
51b0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
51c0: 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d 6f 64 65  mp(zRight, zMode
51d0: 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  , n)==0 ) break;
51e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
51f0: 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a 20 20 20  f( !zMode ){.   
5200: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 22       /* If the "
5210: 3d 4d 4f 44 45 22 20 70 61 72 74 20 64 6f 65 73  =MODE" part does
5220: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 6b   not match any k
5230: 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  nown journal mod
5240: 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  e,.        ** th
5250: 65 6e 20 64 6f 20 61 20 71 75 65 72 79 20 2a 2f  en do a query */
5260: 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
5270: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
5280: 44 45 5f 51 55 45 52 59 3b 0a 20 20 20 20 20 20  DE_QUERY;.      
5290: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
52a0: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
52b0: 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 26  RNALMODE_QUERY &
52c0: 26 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a  & pId2->n==0 ){.
52d0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
52e0: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
52f0: 5f 6d 6f 64 65 22 20 69 6e 74 6f 20 22 50 52 41  _mode" into "PRA
5300: 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c  GMA main.journal
5310: 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20 20 20 20 20  _mode" */.      
5320: 69 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  iDb = 0;.      p
5330: 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20 20 20 20  Id2->n = 1;.    
5340: 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d  }.    for(ii=db-
5350: 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69  >nDb-1; ii>=0; i
5360: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i--){.      if( 
5370: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20  db->aDb[ii].pBt 
5380: 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70  && (ii==iDb || p
5390: 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20  Id2->n==0) ){.  
53a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
53b0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 69  eUsesBtree(v, ii
53c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
53d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
53e0: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 2c 20  OP_JournalMode, 
53f0: 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29 3b 0a 20  ii, 1, eMode);. 
5400: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5410: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5420: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
5430: 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 62  ow, 1, 1);.    b
5440: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
5450: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
5460: 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69  hema.]journal_si
5470: 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 50  ze_limit.  **  P
5480: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
5490: 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69  ournal_size_limi
54a0: 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47 65  t=N.  **.  ** Ge
54b0: 74 20 6f 72 20 73 65 74 20 74 68 65 20 73 69 7a  t or set the siz
54c0: 65 20 6c 69 6d 69 74 20 6f 6e 20 72 6f 6c 6c 62  e limit on rollb
54d0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
54e0: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  s..  */.  case P
54f0: 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f 53  ragTyp_JOURNAL_S
5500: 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20  IZE_LIMIT: {.   
5510: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
5520: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
5530: 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  er(pDb->pBt);.  
5540: 20 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 2d    i64 iLimit = -
5550: 32 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  2;.    if( zRigh
5560: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
5570: 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
5580: 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29  zRight, &iLimit)
5590: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d  ;.      if( iLim
55a0: 69 74 3c 2d 31 20 29 20 69 4c 69 6d 69 74 20 3d  it<-1 ) iLimit =
55b0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   -1;.    }.    i
55c0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
55d0: 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c  agerJournalSizeL
55e0: 69 6d 69 74 28 70 50 61 67 65 72 2c 20 69 4c 69  imit(pPager, iLi
55f0: 6d 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  mit);.    return
5600: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 69 4c 69  SingleInt(v, iLi
5610: 6d 69 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  mit);.    break;
5620: 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  .  }..#endif /* 
5630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
5640: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 20 20  R_PRAGMAS */..  
5650: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
5660: 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61  [schema.]auto_va
5670: 63 75 75 6d 0a 20 20 2a 2a 20 20 50 52 41 47 4d  cuum.  **  PRAGM
5680: 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f 5f  A [schema.]auto_
5690: 76 61 63 75 75 6d 3d 4e 0a 20 20 2a 2a 0a 20 20  vacuum=N.  **.  
56a0: 2a 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68  ** Get or set th
56b0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
56c0: 61 74 61 62 61 73 65 20 27 61 75 74 6f 2d 76 61  atabase 'auto-va
56d0: 63 75 75 6d 27 20 70 61 72 61 6d 65 74 65 72 2e  cuum' parameter.
56e0: 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
56f0: 69 73 20 6f 6e 65 20 6f 66 3a 20 20 30 20 4e 4f  is one of:  0 NO
5700: 4e 45 20 31 20 46 55 4c 4c 20 32 20 49 4e 43 52  NE 1 FULL 2 INCR
5710: 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f 0a 23 69 66  EMENTAL.  */.#if
5720: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5730: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 63 61  _AUTOVACUUM.  ca
5740: 73 65 20 50 72 61 67 54 79 70 5f 41 55 54 4f 5f  se PragTyp_AUTO_
5750: 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 42 74  VACUUM: {.    Bt
5760: 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e  ree *pBt = pDb->
5770: 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
5780: 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69   pBt!=0 );.    i
5790: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
57a0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
57b0: 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 42 74  Int(v, sqlite3Bt
57c0: 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
57d0: 28 70 42 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  (pBt));.    }els
57e0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 41 75  e{.      int eAu
57f0: 74 6f 20 3d 20 67 65 74 41 75 74 6f 56 61 63 75  to = getAutoVacu
5800: 75 6d 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  um(zRight);.    
5810: 20 20 61 73 73 65 72 74 28 20 65 41 75 74 6f 3e    assert( eAuto>
5820: 3d 30 20 26 26 20 65 41 75 74 6f 3c 3d 32 20 29  =0 && eAuto<=2 )
5830: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74  ;.      db->next
5840: 41 75 74 6f 76 61 63 20 3d 20 28 75 38 29 65 41  Autovac = (u8)eA
5850: 75 74 6f 3b 0a 20 20 20 20 20 20 2f 2a 20 43 61  uto;.      /* Ca
5860: 6c 6c 20 53 65 74 41 75 74 6f 56 61 63 75 75 6d  ll SetAutoVacuum
5870: 28 29 20 74 6f 20 73 65 74 20 69 6e 69 74 69 61  () to set initia
5880: 6c 69 7a 65 20 74 68 65 20 69 6e 74 65 72 6e 61  lize the interna
5890: 6c 20 61 75 74 6f 20 61 6e 64 0a 20 20 20 20 20  l auto and.     
58a0: 20 2a 2a 20 69 6e 63 72 2d 76 61 63 75 75 6d 20   ** incr-vacuum 
58b0: 66 6c 61 67 73 2e 20 54 68 69 73 20 69 73 20 72  flags. This is r
58c0: 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20  equired in case 
58d0: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  this connection.
58e0: 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 73        ** creates
58f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5900: 6c 65 2e 20 49 74 20 69 73 20 69 6d 70 6f 72 74  le. It is import
5910: 61 6e 74 20 74 68 61 74 20 69 74 20 69 73 20 63  ant that it is c
5920: 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  reated.      ** 
5930: 61 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  as an auto-vacuu
5940: 6d 20 63 61 70 61 62 6c 65 20 64 62 2e 0a 20 20  m capable db..  
5950: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
5960: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  = sqlite3BtreeSe
5970: 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74 2c  tAutoVacuum(pBt,
5980: 20 65 41 75 74 6f 29 3b 0a 20 20 20 20 20 20 69   eAuto);.      i
5990: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
59a0: 20 26 26 20 28 65 41 75 74 6f 3d 3d 31 20 7c 7c   && (eAuto==1 ||
59b0: 20 65 41 75 74 6f 3d 3d 32 29 20 29 7b 0a 20 20   eAuto==2) ){.  
59c0: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 73 65        /* When se
59d0: 74 74 69 6e 67 20 74 68 65 20 61 75 74 6f 5f 76  tting the auto_v
59e0: 61 63 75 75 6d 20 6d 6f 64 65 20 74 6f 20 65 69  acuum mode to ei
59f0: 74 68 65 72 20 22 66 75 6c 6c 22 20 6f 72 20 0a  ther "full" or .
5a00: 20 20 20 20 20 20 20 20 2a 2a 20 22 69 6e 63 72          ** "incr
5a10: 65 6d 65 6e 74 61 6c 22 2c 20 77 72 69 74 65 20  emental", write 
5a20: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74  the value of met
5a30: 61 5b 36 5d 20 69 6e 20 74 68 65 20 64 61 74 61  a[6] in the data
5a40: 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  base.        ** 
5a50: 66 69 6c 65 2e 20 42 65 66 6f 72 65 20 77 72 69  file. Before wri
5a60: 74 69 6e 67 20 74 6f 20 6d 65 74 61 5b 36 5d 2c  ting to meta[6],
5a70: 20 63 68 65 63 6b 20 74 68 61 74 20 6d 65 74 61   check that meta
5a80: 5b 33 5d 20 69 6e 64 69 63 61 74 65 73 0a 20 20  [3] indicates.  
5a90: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
5aa0: 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  is really is an 
5ab0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
5ac0: 62 6c 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ble database..  
5ad0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
5ae0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
5af0: 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46  t iLn = VDBE_OFF
5b00: 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20  SET_LINENO(2);. 
5b10: 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
5b20: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73  nst VdbeOpList s
5b30: 65 74 4d 65 74 61 36 5b 5d 20 3d 20 7b 0a 20 20  etMeta6[] = {.  
5b40: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61          { OP_Tra
5b50: 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20  nsaction,    0, 
5b60: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5b70: 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20             0},  
5b80: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
5b90: 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f      { OP_ReadCoo
5ba0: 6b 69 65 2c 20 20 20 20 20 30 2c 20 20 20 20 20  kie,     0,     
5bb0: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 42      1,         B
5bc0: 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f  TREE_LARGEST_ROO
5bd0: 54 5f 50 41 47 45 7d 2c 0a 20 20 20 20 20 20 20  T_PAGE},.       
5be0: 20 20 20 7b 20 4f 50 5f 49 66 2c 20 20 20 20 20     { OP_If,     
5bf0: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5c00: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
5c10: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c20: 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  2 */.          {
5c30: 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20 20 20 20   OP_Halt,       
5c40: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f      SQLITE_OK, O
5c50: 45 5f 41 62 6f 72 74 2c 20 20 20 20 20 20 20 20  E_Abort,        
5c60: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f    0},    /* 3 */
5c70: 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  .          { OP_
5c80: 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20  SetCookie,      
5c90: 30 2c 20 20 20 20 20 20 20 20 20 42 54 52 45 45  0,         BTREE
5ca0: 5f 49 4e 43 52 5f 56 41 43 55 55 4d 2c 20 30 7d  _INCR_VACUUM, 0}
5cb0: 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20  ,    /* 4 */.   
5cc0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20       };.        
5cd0: 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20  VdbeOp *aOp;.   
5ce0: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
5cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
5d00: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
5d10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56      sqlite3VdbeV
5d20: 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71  erifyNoMallocReq
5d30: 75 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69  uired(v, ArraySi
5d40: 7a 65 28 73 65 74 4d 65 74 61 36 29 29 3b 0a 20  ze(setMeta6));. 
5d50: 20 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c         aOp = sql
5d60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
5d70: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  t(v, ArraySize(s
5d80: 65 74 4d 65 74 61 36 29 2c 20 73 65 74 4d 65 74  etMeta6), setMet
5d90: 61 36 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20  a6, iLn);.      
5da0: 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45    if( ONLY_IF_RE
5db0: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70  ALLOC_STRESS(aOp
5dc0: 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ==0) ) break;.  
5dd0: 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20        aOp[0].p1 
5de0: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 61  = iDb;.        a
5df0: 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[1].p1 = iDb;.
5e00: 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70          aOp[2].p
5e10: 32 20 3d 20 69 41 64 64 72 2b 34 3b 0a 20 20 20  2 = iAddr+4;.   
5e20: 20 20 20 20 20 61 4f 70 5b 34 5d 2e 70 31 20 3d       aOp[4].p1 =
5e30: 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f   iDb;.        aO
5e40: 70 5b 34 5d 2e 70 33 20 3d 20 65 41 75 74 6f 20  p[4].p3 = eAuto 
5e50: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  - 1;.        sql
5e60: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
5e70: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  e(v, iDb);.     
5e80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
5e90: 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ak;.  }.#endif..
5ea0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
5eb0: 41 20 5b 73 63 68 65 6d 61 2e 5d 69 6e 63 72 65  A [schema.]incre
5ec0: 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28 4e 29  mental_vacuum(N)
5ed0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 4e 20  .  **.  ** Do N 
5ee0: 73 74 65 70 73 20 6f 66 20 69 6e 63 72 65 6d 65  steps of increme
5ef0: 6e 74 61 6c 20 76 61 63 75 75 6d 69 6e 67 20 6f  ntal vacuuming o
5f00: 6e 20 61 20 64 61 74 61 62 61 73 65 2e 0a 20 20  n a database..  
5f10: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
5f20: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
5f30: 4d 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  M.  case PragTyp
5f40: 5f 49 4e 43 52 45 4d 45 4e 54 41 4c 5f 56 41 43  _INCREMENTAL_VAC
5f50: 55 55 4d 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  UUM: {.    int i
5f60: 4c 69 6d 69 74 2c 20 61 64 64 72 3b 0a 20 20 20  Limit, addr;.   
5f70: 20 69 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 7c   if( zRight==0 |
5f80: 7c 20 21 73 71 6c 69 74 65 33 47 65 74 49 6e 74  | !sqlite3GetInt
5f90: 33 32 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d  32(zRight, &iLim
5fa0: 69 74 29 20 7c 7c 20 69 4c 69 6d 69 74 3c 3d 30  it) || iLimit<=0
5fb0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
5fc0: 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   = 0x7fffffff;. 
5fd0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5fe0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
5ff0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
6000: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
6010: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6020: 5f 49 6e 74 65 67 65 72 2c 20 69 4c 69 6d 69 74  _Integer, iLimit
6030: 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  , 1);.    addr =
6040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6050: 70 31 28 76 2c 20 4f 50 5f 49 6e 63 72 56 61 63  p1(v, OP_IncrVac
6060: 75 75 6d 2c 20 69 44 62 29 3b 20 56 64 62 65 43  uum, iDb); VdbeC
6070: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6090: 31 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  1(v, OP_ResultRo
60a0: 77 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  w, 1);.    sqlit
60b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
60c0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31  OP_AddImm, 1, -1
60d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
60e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
60f0: 66 50 6f 73 2c 20 31 2c 20 61 64 64 72 29 3b 20  fPos, 1, addr); 
6100: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6110: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6120: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6130: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
6140: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
6150: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
6160: 47 45 52 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a  GER_PRAGMAS.  /*
6170: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
6180: 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a  chema.]cache_siz
6190: 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  e.  **  PRAGMA [
61a0: 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 69  schema.]cache_si
61b0: 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ze=N.  **.  ** T
61c0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
61d0: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
61e0: 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20  t local setting 
61f0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
6200: 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20 54 68  e cache size. Th
6210: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
6220: 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a 20 20 2a  ts the local.  *
6230: 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  * page cache siz
6240: 65 20 76 61 6c 75 65 2e 20 20 49 66 20 4e 20 69  e value.  If N i
6250: 73 20 70 6f 73 69 74 69 76 65 20 74 68 65 6e 20  s positive then 
6260: 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 2a 2a  that is the.  **
6270: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
6280: 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 20 20   in the cache.  
6290: 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65  If N is negative
62a0: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
62b0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
62c0: 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f 20 74  is adjusted so t
62d0: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 75 73  hat the cache us
62e0: 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65 73 0a  es -N kibibytes.
62f0: 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a    ** of memory..
6300: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
6310: 54 79 70 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20  Typ_CACHE_SIZE: 
6320: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
6330: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
6340: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
6350: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69   );.    if( !zRi
6360: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ght ){.      ret
6370: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
6380: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
6390: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
63a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
63b0: 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74  size = sqlite3At
63c0: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
63d0: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e    pDb->pSchema->
63e0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a  cache_size = siz
63f0: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
6400: 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
6410: 65 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d  e(pDb->pBt, pDb-
6420: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
6430: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  size);.    }.   
6440: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
6450: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
6460: 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70  schema.]cache_sp
6470: 69 6c 6c 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ill.  **  PRAGMA
6480: 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d 42 4f 4f   cache_spill=BOO
6490: 4c 45 41 4e 0a 20 20 2a 2a 20 20 50 52 41 47 4d  LEAN.  **  PRAGM
64a0: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
64b0: 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a 2a 0a 20 20  _spill=N.  **.  
64c0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
64d0: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
64e0: 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74  rrent local sett
64f0: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
6500: 20 70 61 67 65 20 63 61 63 68 65 20 73 70 69 6c   page cache spil
6510: 6c 20 73 69 7a 65 2e 20 54 68 65 20 73 65 63 6f  l size. The seco
6520: 6e 64 20 66 6f 72 6d 20 74 75 72 6e 73 20 63 61  nd form turns ca
6530: 63 68 65 20 73 70 69 6c 6c 20 6f 6e 0a 20 20 2a  che spill on.  *
6540: 2a 20 6f 72 20 6f 66 66 2e 20 20 57 68 65 6e 20  * or off.  When 
6550: 74 75 72 6e 6e 69 6e 67 20 63 61 63 68 65 20 73  turnning cache s
6560: 70 69 6c 6c 20 6f 6e 2c 20 74 68 65 20 73 69 7a  pill on, the siz
6570: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  e is set to the.
6580: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 63 61 63    ** current cac
6590: 68 65 5f 73 69 7a 65 2e 20 20 54 68 65 20 74 68  he_size.  The th
65a0: 69 72 64 20 66 6f 72 6d 20 73 65 74 73 20 61 20  ird form sets a 
65b0: 73 70 69 6c 6c 20 73 69 7a 65 20 74 68 61 74 0a  spill size that.
65c0: 20 20 2a 2a 20 6d 61 79 20 62 65 20 64 69 66 66    ** may be diff
65d0: 65 72 65 6e 74 20 66 6f 72 6d 20 74 68 65 20 63  erent form the c
65e0: 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 2a 2a 20  ache size..  ** 
65f0: 49 66 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65  If N is positive
6600: 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 74 68   then that is th
6610: 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  e.  ** number of
6620: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
6630: 63 68 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65  che.  If N is ne
6640: 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65  gative, then the
6650: 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
6660: 70 61 67 65 73 20 69 73 20 61 64 6a 75 73 74 65  pages is adjuste
6670: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  d so that the ca
6680: 63 68 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69  che uses -N kibi
6690: 62 79 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65  bytes.  ** of me
66a0: 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mory..  **.  ** 
66b0: 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
66c0: 20 63 61 63 68 65 5f 73 70 69 6c 6c 20 70 61 67   cache_spill pag
66d0: 65 73 20 69 73 20 6c 65 73 73 20 74 68 65 6e 20  es is less then 
66e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
66f0: 2a 2a 20 63 61 63 68 65 5f 73 69 7a 65 20 70 61  ** cache_size pa
6700: 67 65 73 2c 20 6e 6f 20 73 70 69 6c 6c 69 6e 67  ges, no spilling
6710: 20 6f 63 63 75 72 73 20 75 6e 74 69 6c 20 74 68   occurs until th
6720: 65 20 70 61 67 65 20 63 6f 75 6e 74 20 65 78 63  e page count exc
6730: 65 65 64 73 0a 20 20 2a 2a 20 74 68 65 20 6e 75  eeds.  ** the nu
6740: 6d 62 65 72 20 6f 66 20 63 61 63 68 65 5f 73 69  mber of cache_si
6750: 7a 65 20 70 61 67 65 73 2e 0a 20 20 2a 2a 0a 20  ze pages..  **. 
6760: 20 2a 2a 20 54 68 65 20 63 61 63 68 65 5f 73 70   ** The cache_sp
6770: 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20 73 65 74 74  ill=BOOLEAN sett
6780: 69 6e 67 20 61 70 70 6c 69 65 73 20 74 6f 20 61  ing applies to a
6790: 6c 6c 20 61 74 74 61 63 68 65 64 20 73 63 68 65  ll attached sche
67a0: 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 6a 75  mas,.  ** not ju
67b0: 73 74 20 74 68 65 20 73 63 68 65 6d 61 20 73 70  st the schema sp
67c0: 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20  ecified..  */.  
67d0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 43  case PragTyp_CAC
67e0: 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20  HE_SPILL: {.    
67f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
6800: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
6810: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
6820: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
6830: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
6840: 67 6c 65 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  gleInt(v,.      
6850: 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20     (db->flags & 
6860: 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c  SQLITE_CacheSpil
6870: 6c 29 3d 3d 30 20 3f 20 30 20 3a 20 0a 20 20 20  l)==0 ? 0 : .   
6880: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6890: 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a  BtreeSetSpillSiz
68a0: 65 28 70 44 62 2d 3e 70 42 74 2c 30 29 29 3b 0a  e(pDb->pBt,0));.
68b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
68c0: 20 69 6e 74 20 73 69 7a 65 20 3d 20 31 3b 0a 20   int size = 1;. 
68d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
68e0: 47 65 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c  GetInt32(zRight,
68f0: 20 26 73 69 7a 65 29 20 29 7b 0a 20 20 20 20 20   &size) ){.     
6900: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
6910: 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44 62 2d  etSpillSize(pDb-
6920: 3e 70 42 74 2c 20 73 69 7a 65 29 3b 0a 20 20 20  >pBt, size);.   
6930: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
6940: 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e  qlite3GetBoolean
6950: 28 7a 52 69 67 68 74 2c 20 73 69 7a 65 21 3d 30  (zRight, size!=0
6960: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  ) ){.        db-
6970: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
6980: 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20  _CacheSpill;.   
6990: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
69a0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
69b0: 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c  SQLITE_CacheSpil
69c0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
69d0: 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67   setAllPagerFlag
69e0: 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  s(db);.    }.   
69f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
6a00: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
6a10: 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73 69 7a  schema.]mmap_siz
6a20: 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55  e(N).  **.  ** U
6a30: 73 65 64 20 74 6f 20 73 65 74 20 6d 61 70 70 69  sed to set mappi
6a40: 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20 54  ng size limit. T
6a50: 68 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  he mapping size 
6a60: 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a 20 75 73  limit is.  ** us
6a70: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6a80: 61 67 67 72 65 67 61 74 65 20 73 69 7a 65 20 6f  aggregate size o
6a90: 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d 61 70  f all memory map
6aa0: 70 65 64 20 72 65 67 69 6f 6e 73 20 6f 66 20 74  ped regions of t
6ab0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
6ac0: 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20 70   file. If this p
6ad0: 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20  arameter is set 
6ae0: 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6d 65  to zero, then me
6af0: 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a 20 20 2a  mory mapping.  *
6b00: 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 20 61 74  * is not used at
6b10: 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69 73 20 6e   all.  If N is n
6b20: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68  egative, then th
6b30: 65 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79  e default memory
6b40: 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d 69 74 20   map.  ** limit 
6b50: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 73 71  determined by sq
6b60: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
6b70: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f  ITE_CONFIG_MMAP_
6b80: 53 49 5a 45 29 20 69 73 20 73 65 74 2e 0a 20 20  SIZE) is set..  
6b90: 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ** The parameter
6ba0: 20 4e 20 69 73 20 6d 65 61 73 75 72 65 64 20 69   N is measured i
6bb0: 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a 0a 20 20  n bytes..  **.  
6bc0: 2a 2a 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  ** This value is
6bd0: 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68 65 20   advisory.  The 
6be0: 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20 69  underlying VFS i
6bf0: 73 20 66 72 65 65 20 74 6f 20 6d 65 6d 6f 72 79  s free to memory
6c00: 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20 6c 69 74   map.  ** as lit
6c10: 74 6c 65 20 6f 72 20 61 73 20 6d 75 63 68 20 61  tle or as much a
6c20: 73 20 69 74 20 77 61 6e 74 73 2e 20 20 45 78 63  s it wants.  Exc
6c30: 65 70 74 2c 20 69 66 20 4e 20 69 73 20 73 65 74  ept, if N is set
6c40: 20 74 6f 20 30 20 74 68 65 6e 20 74 68 65 0a 20   to 0 then the. 
6c50: 20 2a 2a 20 75 70 70 65 72 20 6c 61 79 65 72 73   ** upper layers
6c60: 20 77 69 6c 6c 20 6e 65 76 65 72 20 69 6e 76 6f   will never invo
6c70: 6b 65 20 74 68 65 20 78 46 65 74 63 68 20 69 6e  ke the xFetch in
6c80: 74 65 72 66 61 63 65 73 20 74 6f 20 74 68 65 20  terfaces to the 
6c90: 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  VFS..  */.  case
6ca0: 20 50 72 61 67 54 79 70 5f 4d 4d 41 50 5f 53 49   PragTyp_MMAP_SI
6cb0: 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  ZE: {.    sqlite
6cc0: 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23 69 66 20  3_int64 sz;.#if 
6cd0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
6ce0: 53 49 5a 45 3e 30 0a 20 20 20 20 61 73 73 65 72  SIZE>0.    asser
6cf0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
6d00: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
6d10: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28  b, 0) );.    if(
6d20: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
6d30: 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 73   int ii;.      s
6d40: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
6d50: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 73 7a 29  I64(zRight, &sz)
6d60: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c 30  ;.      if( sz<0
6d70: 20 29 20 73 7a 20 3d 20 73 71 6c 69 74 65 33 47   ) sz = sqlite3G
6d80: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
6d90: 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ap;.      if( pI
6da0: 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e 73  d2->n==0 ) db->s
6db0: 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20 20 20 20  zMmap = sz;.    
6dc0: 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62    for(ii=db->nDb
6dd0: 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29  -1; ii>=0; ii--)
6de0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
6df0: 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26  ->aDb[ii].pBt &&
6e00: 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64   (ii==iDb || pId
6e10: 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20  2->n==0) ){.    
6e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
6e30: 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 64  eeSetMmapLimit(d
6e40: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20  b->aDb[ii].pBt, 
6e50: 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  sz);.        }. 
6e60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6e70: 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 72 63   sz = -1;.    rc
6e80: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
6e90: 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c  control(db, zDb,
6ea0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
6eb0: 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 23  AP_SIZE, &sz);.#
6ec0: 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d 20 30 3b  else.    sz = 0;
6ed0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
6ee0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  _OK;.#endif.    
6ef0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6f00: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
6f10: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 7a  nSingleInt(v, sz
6f20: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6f30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
6f40: 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 70 50  OUND ){.      pP
6f50: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
6f60: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
6f70: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62   rc;.    }.    b
6f80: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
6f90: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65    **   PRAGMA te
6fa0: 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a 20 20 20  mp_store.  **   
6fb0: 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
6fc0: 65 20 3d 20 22 64 65 66 61 75 6c 74 22 7c 22 6d  e = "default"|"m
6fd0: 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22 0a 20 20  emory"|"file".  
6fe0: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
6ff0: 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  r set the local 
7000: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65 6d  value of the tem
7010: 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e 20 20 43  p_store flag.  C
7020: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
7030: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65   local value doe
7040: 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67  s not make chang
7050: 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66  es to the disk f
7060: 69 6c 65 20 61 6e 64 20 74 68 65 20 64 65 66 61  ile and the defa
7070: 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20 77  ult.  ** value w
7080: 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20  ill be restored 
7090: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  the next time th
70a0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  e database is op
70b0: 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ened..  **.  ** 
70c0: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
70d0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
70e0: 20 6c 69 62 72 61 72 79 20 63 6f 6d 70 69 6c 65   library compile
70f0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 6f  -time options to
7100: 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64 65 20 74  .  ** override t
7110: 68 69 73 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  his setting.  */
7120: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
7130: 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a 20 20  TEMP_STORE: {.  
7140: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
7150: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
7160: 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 74 65  gleInt(v, db->te
7170: 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20 20 20 7d  mp_store);.    }
7180: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 6e  else{.      chan
7190: 67 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50  geTempStorage(pP
71a0: 61 72 73 65 2c 20 7a 52 69 67 68 74 29 3b 0a 20  arse, zRight);. 
71b0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
71c0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
71d0: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
71e0: 72 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a  re_directory.  *
71f0: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
7200: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
7210: 3d 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f  = ""|"directory_
7220: 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  name".  **.  ** 
7230: 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68  Return or set th
7240: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66  e local value of
7250: 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65 5f   the temp_store_
7260: 64 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20  directory flag. 
7270: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
7280: 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20  he value sets a 
7290: 73 70 65 63 69 66 69 63 20 64 69 72 65 63 74 6f  specific directo
72a0: 72 79 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ry to be used fo
72b0: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
72c0: 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69 6e 67 20  s..  ** Setting 
72d0: 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67  to a null string
72e0: 20 72 65 76 65 72 74 73 20 74 6f 20 74 68 65 20   reverts to the 
72f0: 64 65 66 61 75 6c 74 20 74 65 6d 70 6f 72 61 72  default temporar
7300: 79 20 64 69 72 65 63 74 6f 72 79 20 73 65 61 72  y directory sear
7310: 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74 65 6d 70  ch..  ** If temp
7320: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
7330: 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
7340: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
7350: 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a  torage..  **.  *
7360: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
7370: 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44 49 52 45  _TEMP_STORE_DIRE
7380: 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66 28  CTORY: {.    if(
7390: 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20   !zRight ){.    
73a0: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65    returnSingleTe
73b0: 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 74 65  xt(v, sqlite3_te
73c0: 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
73d0: 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65     }else{.#ifnde
73e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53  f SQLITE_OMIT_WS
73f0: 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  D.      if( zRig
7400: 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ht[0] ){.       
7410: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
7420: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7430: 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73 2c  Access(db->pVfs,
7440: 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45 5f   zRight, SQLITE_
7450: 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
7460: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  , &res);.       
7470: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7480: 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a  OK || res==0 ){.
7490: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
74a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
74b0: 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62 6c  , "not a writabl
74c0: 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a 20  e directory");. 
74d0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72           goto pr
74e0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
74f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7500: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 45 4d    if( SQLITE_TEM
7510: 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20 20  P_STORE==0.     
7520: 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d    || (SQLITE_TEM
7530: 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20 64 62  P_STORE==1 && db
7540: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31 29  ->temp_store<=1)
7550: 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49  .       || (SQLI
7560: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32  TE_TEMP_STORE==2
7570: 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f   && db->temp_sto
7580: 72 65 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b 0a  re==1).      ){.
7590: 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
75a0: 74 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50  teTempStorage(pP
75b0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
75c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
75d0: 65 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  e(sqlite3_temp_d
75e0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20  irectory);.     
75f0: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
7600: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7610: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
7620: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7630: 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29  tf("%s", zRight)
7640: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
7660: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
7670: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  0;.      }.#endi
7680: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7690: 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  _WSD */.    }.  
76a0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69    break;.  }..#i
76b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
76c0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
76d0: 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  MA data_store_di
76e0: 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50  rectory.  **   P
76f0: 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65  RAGMA data_store
7700: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c  _directory = ""|
7710: 22 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22  "directory_name"
7720: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
7730: 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63  n or set the loc
7740: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
7750: 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
7760: 74 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e  tory flag.  Chan
7770: 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61  ging.  ** the va
7780: 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63 69  lue sets a speci
7790: 66 69 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f  fic directory to
77a0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61 74   be used for dat
77b0: 61 62 61 73 65 20 66 69 6c 65 73 20 74 68 61 74  abase files that
77c0: 0a 20 20 2a 2a 20 77 65 72 65 20 73 70 65 63 69  .  ** were speci
77d0: 66 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61  fied with a rela
77e0: 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 20  tive pathname.  
77f0: 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75 6c  Setting to a nul
7800: 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74 73  l string reverts
7810: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 65 66  .  ** to the def
7820: 61 75 6c 74 20 64 61 74 61 62 61 73 65 20 64 69  ault database di
7830: 72 65 63 74 6f 72 79 2c 20 77 68 69 63 68 20 66  rectory, which f
7840: 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  or database file
7850: 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74 68  s specified with
7860: 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74 69 76 65  .  ** a relative
7870: 20 70 61 74 68 20 77 69 6c 6c 20 70 72 6f 62 61   path will proba
7880: 62 6c 79 20 62 65 20 62 61 73 65 64 20 6f 6e 20  bly be based on 
7890: 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72 65  the current dire
78a0: 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a 20 20  ctory for the.  
78b0: 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20 44 61 74  ** process.  Dat
78c0: 61 62 61 73 65 20 66 69 6c 65 20 73 70 65 63 69  abase file speci
78d0: 66 69 65 64 20 77 69 74 68 20 61 6e 20 61 62 73  fied with an abs
78e0: 6f 6c 75 74 65 20 70 61 74 68 20 61 72 65 20 6e  olute path are n
78f0: 6f 74 20 69 6d 70 61 63 74 65 64 0a 20 20 2a 2a  ot impacted.  **
7900: 20 62 79 20 74 68 69 73 20 73 65 74 74 69 6e 67   by this setting
7910: 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
7920: 69 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a 0a  its value..  **.
7930: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7940: 54 79 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f 44  Typ_DATA_STORE_D
7950: 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20  IRECTORY: {.    
7960: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
7970: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
7980: 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33  eText(v, sqlite3
7990: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 29  _data_directory)
79a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
79b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
79c0: 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a  _WSD.      if( z
79d0: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
79e0: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
79f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7a00: 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56  3OsAccess(db->pV
7a10: 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49  fs, zRight, SQLI
7a20: 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
7a30: 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  ITE, &res);.    
7a40: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7a50: 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20  TE_OK || res==0 
7a60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7a70: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7a80: 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74  rse, "not a writ
7a90: 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29  able directory")
7aa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
7ab0: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20   pragma_out;.   
7ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7ae0: 65 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  e(sqlite3_data_d
7af0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20  irectory);.     
7b00: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
7b10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7b20: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7b30: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7b40: 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29  tf("%s", zRight)
7b50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
7b70: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
7b80: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  0;.      }.#endi
7b90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7ba0: 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  _WSD */.    }.  
7bb0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
7bc0: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
7bd0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
7be0: 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  TYLE.  /*.  **  
7bf0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
7c00: 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
7c10: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
7c20: 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f  schema.]lock_pro
7c30: 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61 75 74 6f  xy_file = ":auto
7c40: 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f 70 61  :"|"lock_file_pa
7c50: 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  th".  **.  ** Re
7c60: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
7c70: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 63  value of the loc
7c80: 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20 66 6c 61  k_proxy_file fla
7c90: 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
7ca0: 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73  * the value sets
7cb0: 20 61 20 73 70 65 63 69 66 69 63 20 66 69 6c 65   a specific file
7cc0: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
7cd0: 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
7ce0: 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  locks..  **.  */
7cf0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
7d00: 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49 4c 45 3a  LOCK_PROXY_FILE:
7d10: 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67   {.    if( !zRig
7d20: 68 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  ht ){.      Page
7d30: 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69  r *pPager = sqli
7d40: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
7d50: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 63  b->pBt);.      c
7d60: 68 61 72 20 2a 70 72 6f 78 79 5f 66 69 6c 65 5f  har *proxy_file_
7d70: 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  path = NULL;.   
7d80: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
7d90: 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *pFile = sqlite3
7da0: 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
7db0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7dc0: 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
7dd0: 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  t(pFile, SQLITE_
7de0: 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
7df0: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
7e10: 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29  proxy_file_path)
7e20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
7e30: 6e 67 6c 65 54 65 78 74 28 76 2c 20 70 72 6f 78  ngleText(v, prox
7e40: 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20  y_file_path);.  
7e50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
7e60: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
7e70: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
7e80: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
7e90: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ea0: 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
7eb0: 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29  agerFile(pPager)
7ec0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b  ;.      int res;
7ed0: 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68  .      if( zRigh
7ee0: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  t[0] ){.        
7ef0: 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c  res=sqlite3OsFil
7f00: 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20  eControl(pFile, 
7f10: 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
7f20: 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20  ROXYFILE, .     
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d  zRight);.      }
7f60: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
7f70: 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c  res=sqlite3OsFil
7f80: 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20  eControl(pFile, 
7f90: 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
7fa0: 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20  ROXYFILE, .     
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fd0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
7fe0: 20 20 20 20 20 69 66 28 20 72 65 73 21 3d 53 51       if( res!=SQ
7ff0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8000: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8010: 73 67 28 70 50 61 72 73 65 2c 20 22 66 61 69 6c  sg(pParse, "fail
8020: 65 64 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20 70  ed to set lock p
8030: 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a 20 20 20  roxy file");.   
8040: 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61       goto pragma
8050: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
8060: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8070: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8080: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
8090: 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20 20  NG_STYLE */     
80a0: 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a   .    .  /*.  **
80b0: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
80c0: 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  a.]synchronous. 
80d0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
80e0: 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75  hema.]synchronou
80f0: 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c 7c  s=OFF|ON|NORMAL|
8100: 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20 2a 2a 0a  FULL|EXTRA.  **.
8110: 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73    ** Return or s
8120: 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c  et the local val
8130: 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68 72  ue of the synchr
8140: 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68 61  onous flag.  Cha
8150: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c  nging.  ** the l
8160: 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20  ocal value does 
8170: 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73  not make changes
8180: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c   to the disk fil
8190: 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 64  e and the.  ** d
81a0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c  efault value wil
81b0: 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 68  l be restored th
81c0: 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
81d0: 64 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a 2a  database is.  **
81e0: 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
81f0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 59 4e  case PragTyp_SYN
8200: 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20 20 20  CHRONOUS: {.    
8210: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
8220: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
8230: 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e 73 61 66  eInt(v, pDb->saf
8240: 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a 20 20  ety_level-1);.  
8250: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
8260: 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  f( !db->autoComm
8270: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  it ){.        sq
8280: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8290: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
82a0: 20 20 20 22 53 61 66 65 74 79 20 6c 65 76 65 6c     "Safety level
82b0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e   may not be chan
82c0: 67 65 64 20 69 6e 73 69 64 65 20 61 20 74 72 61  ged inside a tra
82d0: 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20  nsaction");.    
82e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 44 62 21    }else if( iDb!
82f0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =1 ){.        in
8300: 74 20 69 4c 65 76 65 6c 20 3d 20 28 67 65 74 53  t iLevel = (getS
8310: 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67 68  afetyLevel(zRigh
8320: 74 2c 30 2c 31 29 2b 31 29 20 26 20 50 41 47 45  t,0,1)+1) & PAGE
8330: 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
8340: 53 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  SK;.        if( 
8350: 69 4c 65 76 65 6c 3d 3d 30 20 29 20 69 4c 65 76  iLevel==0 ) iLev
8360: 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  el = 1;.        
8370: 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
8380: 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20 20  l = iLevel;.    
8390: 20 20 20 20 70 44 62 2d 3e 62 53 79 6e 63 53 65      pDb->bSyncSe
83a0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  t = 1;.        s
83b0: 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28  etAllPagerFlags(
83c0: 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
83d0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
83e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
83f0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
8400: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
8410: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
8420: 41 47 5f 50 52 41 47 4d 41 53 0a 20 20 63 61 73  AG_PRAGMAS.  cas
8430: 65 20 50 72 61 67 54 79 70 5f 46 4c 41 47 3a 20  e PragTyp_FLAG: 
8440: 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
8450: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74  ==0 ){.      set
8460: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
8470: 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50 72 61 67  mnNames(v, pPrag
8480: 6d 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ma);.      retur
8490: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 28 64  nSingleInt(v, (d
84a0: 62 2d 3e 66 6c 61 67 73 20 26 20 70 50 72 61 67  b->flags & pPrag
84b0: 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20 29 3b 0a  ma->iArg)!=0 );.
84c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
84d0: 20 69 6e 74 20 6d 61 73 6b 20 3d 20 70 50 72 61   int mask = pPra
84e0: 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20 20 2f 2a  gma->iArg;    /*
84f0: 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74 6f   Mask of bits to
8500: 20 73 65 74 20 6f 72 20 63 6c 65 61 72 2e 20 2a   set or clear. *
8510: 2f 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  /.      if( db->
8520: 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  autoCommit==0 ){
8530: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 65  .        /* Fore
8540: 69 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74 20  ign key support 
8550: 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e 61 62 6c  may not be enabl
8560: 65 64 20 6f 72 20 64 69 73 61 62 6c 65 64 20 77  ed or disabled w
8570: 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20 20  hile not.       
8580: 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d   ** in auto-comm
8590: 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 20  it mode.  */.   
85a0: 20 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53       mask &= ~(S
85b0: 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
85c0: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  s);.      }.#if 
85d0: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
85e0: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20  ENTICATION.     
85f0: 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75   if( db->auth.au
8600: 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f 55  thLevel==UAUTH_U
8610: 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ser ){.        /
8620: 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6e  * Do not allow n
8630: 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72 73 20 74  on-admin users t
8640: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63 68  o modify the sch
8650: 65 6d 61 20 61 72 62 69 74 72 61 72 69 6c 79 20  ema arbitrarily 
8660: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  */.        mask 
8670: 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57 72 69 74  &= ~(SQLITE_Writ
8680: 65 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  eSchema);.      
8690: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
86a0: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f  if( sqlite3GetBo
86b0: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29  olean(zRight, 0)
86c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   ){.        db->
86d0: 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20  flags |= mask;. 
86e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
86f0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
8700: 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20   ~mask;.        
8710: 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c 49 54 45  if( mask==SQLITE
8720: 5f 44 65 66 65 72 46 4b 73 20 29 20 64 62 2d 3e  _DeferFKs ) db->
8730: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
8740: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
8750: 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20 6f 66 20       /* Many of 
8760: 74 68 65 20 66 6c 61 67 2d 70 72 61 67 6d 61 73  the flag-pragmas
8770: 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 64 65   modify the code
8780: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
8790: 65 20 53 51 4c 20 0a 20 20 20 20 20 20 2a 2a 20  e SQL .      ** 
87a0: 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e 20 63 6f  compiler (eg. co
87b0: 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e 20 53 6f  unt_changes). So
87c0: 20 61 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   add an opcode t
87d0: 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a 20 20 20  o expire all.   
87e0: 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 53     ** compiled S
87f0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61 66  QL statements af
8800: 74 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20  ter modifying a 
8810: 70 72 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20 20  pragma value..  
8820: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
8830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
8840: 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20  , OP_Expire);.  
8850: 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46      setAllPagerF
8860: 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  lags(db);.    }.
8870: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
8880: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8890: 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41  OMIT_FLAG_PRAGMA
88a0: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
88b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41  LITE_OMIT_SCHEMA
88c0: 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20  _PRAGMAS.  /*.  
88d0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 61 62 6c  **   PRAGMA tabl
88e0: 65 5f 69 6e 66 6f 28 3c 74 61 62 6c 65 3e 29 0a  e_info(<table>).
88f0: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
8900: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 6f   a single row fo
8910: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
8920: 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
8930: 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  . The columns of
8940: 0a 20 20 2a 2a 20 74 68 65 20 72 65 74 75 72 6e  .  ** the return
8950: 65 64 20 64 61 74 61 20 73 65 74 20 61 72 65 3a  ed data set are:
8960: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a 20  .  **.  ** cid: 
8970: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 69 64         Column id
8980: 20 28 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20   (numbered from 
8990: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 73  left to right, s
89a0: 74 61 72 74 69 6e 67 20 61 74 20 30 29 0a 20 20  tarting at 0).  
89b0: 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20 20 20 43  ** name:       C
89c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a 20  olumn name.  ** 
89d0: 74 79 70 65 3a 20 20 20 20 20 20 20 43 6f 6c 75  type:       Colu
89e0: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  mn declaration t
89f0: 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75 6c  ype..  ** notnul
8a00: 6c 3a 20 20 20 20 54 72 75 65 20 69 66 20 27 4e  l:    True if 'N
8a10: 4f 54 20 4e 55 4c 4c 27 20 69 73 20 70 61 72 74  OT NULL' is part
8a20: 20 6f 66 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61   of column decla
8a30: 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c 74  ration.  ** dflt
8a40: 5f 76 61 6c 75 65 3a 20 54 68 65 20 64 65 66 61  _value: The defa
8a50: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
8a60: 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e 79  e column, if any
8a70: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
8a80: 61 67 54 79 70 5f 54 41 42 4c 45 5f 49 4e 46 4f  agTyp_TABLE_INFO
8a90: 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a  : if( zRight ){.
8aa0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8ab0: 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
8ac0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
8ad0: 50 61 72 73 65 2c 20 4c 4f 43 41 54 45 5f 4e 4f  Parse, LOCATE_NO
8ae0: 45 52 52 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  ERR, zRight, zDb
8af0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
8b00: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  ){.      int i, 
8b10: 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69  k;.      int nHi
8b20: 64 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  dden = 0;.      
8b30: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
8b40: 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
8b50: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
8b60: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
8b70: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
8b80: 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 73 71 6c  m = 6;.      sql
8b90: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
8ba0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
8bb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8bc0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
8bd0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
8be0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
8bf0: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
8c00: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
8c10: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
8c20: 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
8c30: 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f 6c 29 20 29  enColumn(pCol) )
8c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69 64  {.          nHid
8c50: 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  den++;.         
8c60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8c70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8c80: 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73   (pCol->colFlags
8c90: 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b   & COLFLAG_PRIMK
8ca0: 45 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  EY)==0 ){.      
8cb0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20      k = 0;.     
8cc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b     }else if( pPk
8cd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8ce0: 20 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20   k = 1;.        
8cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8d00: 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61   for(k=1; k<=pTa
8d10: 62 2d 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e  b->nCol && pPk->
8d20: 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69  aiColumn[k-1]!=i
8d30: 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  ; k++){}.       
8d40: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
8d50: 74 28 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d  t( pCol->pDflt==
8d60: 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  0 || pCol->pDflt
8d70: 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b  ->op==TK_SPAN );
8d80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8d90: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
8da0: 20 31 2c 20 22 69 73 73 69 73 69 22 2c 0a 20 20   1, "issisi",.  
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2d 6e               i-n
8dc0: 48 69 64 64 65 6e 2c 0a 20 20 20 20 20 20 20 20  Hidden,.        
8dd0: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61         pCol->zNa
8de0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
8df0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
8e00: 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 0a 20  Type(pCol,""),. 
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
8e20: 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20  ol->notNull ? 1 
8e30: 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : 0,.           
8e40: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
8e50: 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75  ? pCol->pDflt->u
8e60: 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c 0a 20 20 20  .zToken : 0,.   
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 6b 29 3b 0a              k);.
8e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8e90: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64  }.  break;..#ifd
8ea0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8eb0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53    case PragTyp_S
8ec0: 54 41 54 53 3a 20 7b 0a 20 20 20 20 49 6e 64 65  TATS: {.    Inde
8ed0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 48 61 73  x *pIdx;.    Has
8ee0: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 20 20 70 50  hElem *i;.    pP
8ef0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a  arse->nMem = 5;.
8f00: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
8f10: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
8f20: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 66 6f  se, iDb);.    fo
8f30: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
8f40: 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
8f50: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20  a->tblHash); i; 
8f60: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
8f70: 28 69 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  (i)){.      Tabl
8f80: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
8f90: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
8fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
8fb0: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
8fc0: 73 69 69 69 22 2c 0a 20 20 20 20 20 20 20 20 20  siii",.         
8fd0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
8fe0: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
8ff0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 73 7a          pTab->sz
9000: 54 61 62 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  TabRow,.        
9010: 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
9020: 45 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Est,.           
9030: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 29 3b  pTab->tabFlags);
9040: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
9050: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
9060: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
9070: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73  Next){.        s
9080: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
9090: 6f 61 64 28 76 2c 20 32 2c 20 22 73 69 69 69 58  oad(v, 2, "siiiX
90a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  ",.           pI
90b0: 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  dx->zName,.     
90c0: 20 20 20 20 20 20 70 49 64 78 2d 3e 73 7a 49 64        pIdx->szId
90d0: 78 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  xRow,.          
90e0: 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45   pIdx->aiRowLogE
90f0: 73 74 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  st[0],.         
9100: 20 20 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31    pIdx->hasStat1
9110: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9120: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9130: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
9140: 20 35 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   5);.      }.   
9150: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9160: 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65 20 50  #endif..  case P
9170: 72 61 67 54 79 70 5f 49 4e 44 45 58 5f 49 4e 46  ragTyp_INDEX_INF
9180: 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b  O: if( zRight ){
9190: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
91a0: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
91b0: 62 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71  b;.    pIdx = sq
91c0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
91d0: 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  b, zRight, zDb);
91e0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b  .    if( pIdx ){
91f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
9200: 20 20 20 20 69 6e 74 20 6d 78 3b 0a 20 20 20 20      int mx;.    
9210: 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69    if( pPragma->i
9220: 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Arg ){.        /
9230: 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78  * PRAGMA index_x
9240: 69 6e 66 6f 20 28 6e 65 77 65 72 20 76 65 72 73  info (newer vers
9250: 69 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20 72 6f  ion with more ro
9260: 77 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 29 20  ws and columns) 
9270: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20  */.        mx = 
9280: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
9290: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
92a0: 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 7d  Mem = 6;.      }
92b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
92c0: 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 69 6e   PRAGMA index_in
92d0: 66 6f 20 28 6c 65 67 61 63 79 20 76 65 72 73 69  fo (legacy versi
92e0: 6f 6e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  on) */.        m
92f0: 78 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  x = pIdx->nKeyCo
9300: 6c 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  l;.        pPars
9310: 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20  e->nMem = 3;.   
9320: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 20     }.      pTab 
9330: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a  = pIdx->pTable;.
9340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
9350: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
9360: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
9370: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
9380: 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61 67 6d 61 2d  ->nMem<=pPragma-
9390: 3e 6e 50 72 61 67 43 4e 61 6d 65 20 29 3b 0a 20  >nPragCName );. 
93a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
93b0: 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mx; i++){.      
93c0: 20 20 69 31 36 20 63 6e 75 6d 20 3d 20 70 49 64    i16 cnum = pId
93d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
93e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
93f0: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
9400: 31 2c 20 22 69 69 73 58 22 2c 20 69 2c 20 63 6e  1, "iisX", i, cn
9410: 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 63 6e 75 6d 3c 30 20 3f 20 30 20 3a 20 70 54   cnum<0 ? 0 : pT
9440: 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a  ab->aCol[cnum].z
9450: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
9460: 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67  f( pPragma->iArg
9470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
9480: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9490: 61 64 28 76 2c 20 34 2c 20 22 69 73 69 58 22 2c  ad(v, 4, "isiX",
94a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
94b0: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
94c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ,.            pI
94d0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 0a 20  dx->azColl[i],. 
94e0: 20 20 20 20 20 20 20 20 20 20 20 69 3c 70 49 64             i<pId
94f0: 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20  x->nKeyCol);.   
9500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
9510: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9520: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9530: 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 1, pParse->nMe
9540: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
9550: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
9560: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 49    case PragTyp_I
9570: 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66 28 20 7a  NDEX_LIST: if( z
9580: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 49 6e 64  Right ){.    Ind
9590: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61  ex *pIdx;.    Ta
95a0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
95b0: 6e 74 20 69 3b 0a 20 20 20 20 70 54 61 62 20 3d  nt i;.    pTab =
95c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
95d0: 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  e(db, zRight, zD
95e0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
95f0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
9600: 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20  ->nMem = 5;.    
9610: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
9620: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
9630: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f  , iDb);.      fo
9640: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
9650: 64 65 78 2c 20 69 3d 30 3b 20 70 49 64 78 3b 20  dex, i=0; pIdx; 
9660: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
9670: 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
9680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f 72  const char *azOr
9690: 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c 20  igin[] = { "c", 
96a0: 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a 20 20 20  "u", "pk" };.   
96b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
96c0: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
96d0: 22 69 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20  "isisi",.       
96e0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20      i,.         
96f0: 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20    pIdx->zName,. 
9700: 20 20 20 20 20 20 20 20 20 20 49 73 55 6e 69 71            IsUniq
9710: 75 65 49 6e 64 65 78 28 70 49 64 78 29 2c 0a 20  ueIndex(pIdx),. 
9720: 20 20 20 20 20 20 20 20 20 20 61 7a 4f 72 69 67            azOrig
9730: 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54 79 70 65  in[pIdx->idxType
9740: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  ],.           pI
9750: 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
9760: 65 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e!=0);.      }. 
9770: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
9780: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
9790: 70 5f 44 41 54 41 42 41 53 45 5f 4c 49 53 54 3a  p_DATABASE_LIST:
97a0: 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
97b0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
97c0: 20 33 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   3;.    for(i=0;
97d0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
97e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
97f0: 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[i].pBt==0 ) 
9800: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9810: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
9820: 69 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d 30 20 29  i].zDbSName!=0 )
9830: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9840: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
9850: 31 2c 20 22 69 73 73 22 2c 0a 20 20 20 20 20 20  1, "iss",.      
9860: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20 64     i,.         d
9870: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
9880: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  me,.         sql
9890: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
98a0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  name(db->aDb[i].
98b0: 70 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pBt));.    }.  }
98c0: 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73  .  break;..  cas
98d0: 65 20 50 72 61 67 54 79 70 5f 43 4f 4c 4c 41 54  e PragTyp_COLLAT
98e0: 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20  ION_LIST: {.    
98f0: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 48  int i = 0;.    H
9900: 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20  ashElem *p;.    
9910: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32  pParse->nMem = 2
9920: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
9930: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
9940: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 70 3b 20 70  >aCollSeq); p; p
9950: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9960: 70 29 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  p)){.      CollS
9970: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c  eq *pColl = (Col
9980: 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73  lSeq *)sqliteHas
9990: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20  hData(p);.      
99a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
99b0: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 22 2c  Load(v, 1, "is",
99c0: 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   i++, pColl->zNa
99d0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
99e0: 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66 20   break;..#ifdef 
99f0: 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43  SQLITE_INTROSPEC
9a00: 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 63  TION_PRAGMAS.  c
9a10: 61 73 65 20 50 72 61 67 54 79 70 5f 46 55 4e 43  ase PragTyp_FUNC
9a20: 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20  TION_LIST: {.   
9a30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 48 61 73 68   int i;.    Hash
9a40: 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 46 75 6e  Elem *j;.    Fun
9a50: 63 44 65 66 20 2a 70 3b 0a 20 20 20 20 70 50 61  cDef *p;.    pPa
9a60: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20  rse->nMem = 2;. 
9a70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51     for(i=0; i<SQ
9a80: 4c 49 54 45 5f 46 55 4e 43 5f 48 41 53 48 5f 53  LITE_FUNC_HASH_S
9a90: 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  Z; i++){.      f
9aa0: 6f 72 28 70 3d 73 71 6c 69 74 65 33 42 75 69 6c  or(p=sqlite3Buil
9ab0: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 2e 61 5b 69  tinFunctions.a[i
9ac0: 5d 3b 20 70 3b 20 70 3d 70 2d 3e 75 2e 70 48 61  ]; p; p=p->u.pHa
9ad0: 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  sh ){.        sq
9ae0: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9af0: 61 64 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70  ad(v, 1, "si", p
9b00: 2d 3e 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20  ->zName, 1);.   
9b10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
9b20: 6f 72 28 6a 3d 73 71 6c 69 74 65 48 61 73 68 46  or(j=sqliteHashF
9b30: 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e 63 29  irst(&db->aFunc)
9b40: 3b 20 6a 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73  ; j; j=sqliteHas
9b50: 68 4e 65 78 74 28 6a 29 29 7b 0a 20 20 20 20 20  hNext(j)){.     
9b60: 20 70 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73   p = (FuncDef*)s
9b70: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6a 29  qliteHashData(j)
9b80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9b90: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
9ba0: 31 2c 20 22 73 69 22 2c 20 70 2d 3e 7a 4e 61 6d  1, "si", p->zNam
9bb0: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
9bc0: 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64  .  break;..#ifnd
9bd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
9be0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 63 61  IRTUALTABLE.  ca
9bf0: 73 65 20 50 72 61 67 54 79 70 5f 4d 4f 44 55 4c  se PragTyp_MODUL
9c00: 45 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 48 61  E_LIST: {.    Ha
9c10: 73 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 70  shElem *j;.    p
9c20: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b  Parse->nMem = 1;
9c30: 0a 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74  .    for(j=sqlit
9c40: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
9c50: 61 4d 6f 64 75 6c 65 29 3b 20 6a 3b 20 6a 3d 73  aModule); j; j=s
9c60: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6a 29  qliteHashNext(j)
9c70: 29 7b 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65 20  ){.      Module 
9c80: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a  *pMod = (Module*
9c90: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
9ca0: 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  j);.      sqlite
9cb0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9cc0: 2c 20 31 2c 20 22 73 22 2c 20 70 4d 6f 64 2d 3e  , 1, "s", pMod->
9cd0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
9ce0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
9cf0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
9d00: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
9d10: 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  ..  case PragTyp
9d20: 5f 50 52 41 47 4d 41 5f 4c 49 53 54 3a 20 7b 0a  _PRAGMA_LIST: {.
9d30: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
9d40: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
9d50: 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65 29  ize(aPragmaName)
9d60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
9d70: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9d80: 61 64 28 76 2c 20 31 2c 20 22 73 22 2c 20 61 50  ad(v, 1, "s", aP
9d90: 72 61 67 6d 61 4e 61 6d 65 5b 69 5d 2e 7a 4e 61  ragmaName[i].zNa
9da0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
9db0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
9dc0: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50  * SQLITE_INTROSP
9dd0: 45 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a  ECTION_PRAGMAS *
9de0: 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
9df0: 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f  ITE_OMIT_SCHEMA_
9e00: 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e  PRAGMAS */..#ifn
9e10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9e20: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 63 61  FOREIGN_KEY.  ca
9e30: 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45 49  se PragTyp_FOREI
9e40: 47 4e 5f 4b 45 59 5f 4c 49 53 54 3a 20 69 66 28  GN_KEY_LIST: if(
9e50: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 46   zRight ){.    F
9e60: 4b 65 79 20 2a 70 46 4b 3b 0a 20 20 20 20 54 61  Key *pFK;.    Ta
9e70: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
9e80: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
9e90: 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68  dTable(db, zRigh
9ea0: 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  t, zDb);.    if(
9eb0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
9ec0: 46 4b 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  FK = pTab->pFKey
9ed0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 4b 20  ;.      if( pFK 
9ee0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
9ef0: 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 20 20 70   = 0; .        p
9f00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 38 3b  Parse->nMem = 8;
9f10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9f20: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
9f30: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
9f40: 20 20 20 20 20 20 20 77 68 69 6c 65 28 70 46 4b         while(pFK
9f50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
9f60: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   j;.          fo
9f70: 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43  r(j=0; j<pFK->nC
9f80: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
9f90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9fa0: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9fb0: 20 22 69 69 73 73 73 73 73 73 22 2c 0a 20 20 20   "iissssss",.   
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
9fe0: 20 20 20 20 20 20 6a 2c 0a 20 20 20 20 20 20 20        j,.       
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d              pFK-
a000: 3e 7a 54 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  >zTo,.          
a010: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
a020: 43 6f 6c 5b 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d  Col[pFK->aCol[j]
a030: 2e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 2c 0a 20  .iFrom].zName,. 
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a    pFK->aCol[j].z
a060: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
a070: 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e 61          actionNa
a080: 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b  me(pFK->aAction[
a090: 31 5d 29 2c 20 20 2f 2a 20 4f 4e 20 55 50 44 41  1]),  /* ON UPDA
a0a0: 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  TE */.          
a0b0: 20 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e           actionN
a0c0: 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e  ame(pFK->aAction
a0d0: 5b 30 5d 29 2c 20 20 2f 2a 20 4f 4e 20 44 45 4c  [0]),  /* ON DEL
a0e0: 45 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ETE */.         
a0f0: 20 20 20 20 20 20 20 20 20 20 22 4e 4f 4e 45 22            "NONE"
a100: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
a110: 20 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20           ++i;.  
a120: 20 20 20 20 20 20 20 20 70 46 4b 20 3d 20 70 46          pFK = pF
a130: 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  K->pNextFrom;.  
a140: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a150: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
a160: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  k;.#endif /* !de
a170: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a180: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
a190: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
a1a0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
a1b0: 45 59 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  EY.#ifndef SQLIT
a1c0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
a1d0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f   case PragTyp_FO
a1e0: 52 45 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a  REIGN_KEY_CHECK:
a1f0: 20 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b   {.    FKey *pFK
a200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a210: 20 41 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63   A foreign key c
a220: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
a230: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
a240: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64          /* Child
a250: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22   table contain "
a260: 52 45 46 45 52 45 4e 43 45 53 22 20 6b 65 79 77  REFERENCES" keyw
a270: 6f 72 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ord */.    Table
a280: 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
a290: 20 20 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c    /* Parent tabl
a2a0: 65 20 74 68 61 74 20 63 68 69 6c 64 20 70 6f 69  e that child poi
a2b0: 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e  nts to */.    In
a2c0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
a2d0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
a2e0: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
a2f0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20  e */.    int i; 
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a  /* Loop counter:
a320: 20 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75    Foreign key nu
a330: 6d 62 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f  mber for pTab */
a340: 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  .    int j;     
a350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a360: 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 69  oop counter:  Fi
a370: 65 6c 64 20 6f 66 20 74 68 65 20 66 6f 72 65 69  eld of the forei
a380: 67 6e 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61  gn key */.    Ha
a390: 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
a3a0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
a3b0: 6e 74 65 72 3a 20 20 4e 65 78 74 20 74 61 62 6c  nter:  Next tabl
a3c0: 65 20 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20  e in schema */. 
a3d0: 20 20 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20     int x;       
a3e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73            /* res
a3f0: 75 6c 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ult variable */.
a400: 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c      int regResul
a410: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20  t;         /* 3 
a420: 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
a430: 64 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  d a result row *
a440: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79  /.    int regKey
a450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a460: 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64  Register to hold
a470: 20 6b 65 79 20 66 6f 72 20 63 68 65 63 6b 69 6e   key for checkin
a480: 67 20 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20  g the FK */.    
a490: 69 6e 74 20 72 65 67 52 6f 77 3b 20 20 20 20 20  int regRow;     
a4a0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
a4b0: 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f  ers to hold a ro
a4c0: 77 20 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20  w from pTab */. 
a4d0: 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20     int addrTop; 
a4e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
a4f0: 20 6f 66 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b   of a loop check
a500: 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  ing foreign keys
a510: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
a520: 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Ok;            /
a530: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
a540: 68 65 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a  he key is OK */.
a550: 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b      int *aiCols;
a560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68             /* ch
a570: 69 6c 64 20 74 6f 20 70 61 72 65 6e 74 20 63 6f  ild to parent co
a580: 6c 75 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a  lumn mapping */.
a590: 0a 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 3d  .    regResult =
a5a0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
a5b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
a5c0: 6d 20 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b  m += 4;.    regK
a5d0: 65 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ey = ++pParse->n
a5e0: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  Mem;.    regRow 
a5f0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
a600: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
a610: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
a620: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
a630: 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69  k = sqliteHashFi
a640: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62  rst(&db->aDb[iDb
a650: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
a660: 73 68 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  sh);.    while( 
a670: 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  k ){.      if( z
a680: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
a690: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
a6a0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
a6b0: 65 2c 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44  e, 0, zRight, zD
a6c0: 62 29 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  b);.        k = 
a6d0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
a6e0: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 28          pTab = (
a6f0: 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
a700: 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
a710: 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68    k = sqliteHash
a720: 4e 65 78 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d  Next(k);.      }
a730: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
a740: 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65  =0 || pTab->pFKe
a750: 79 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  y==0 ) continue;
a760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
a770: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
a780: 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
a790: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
a7a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
a7b0: 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50  ->nCol+regRow>pP
a7c0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61  arse->nMem ) pPa
a7d0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62  rse->nMem = pTab
a7e0: 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b  ->nCol + regRow;
a7f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
a800: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
a810: 30 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  0, iDb, pTab, OP
a820: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
a830: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
a840: 64 53 74 72 69 6e 67 28 76 2c 20 72 65 67 52 65  dString(v, regRe
a850: 73 75 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  sult, pTab->zNam
a860: 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  e);.      for(i=
a870: 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b  1, pFK=pTab->pFK
a880: 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46  ey; pFK; i++, pF
a890: 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d  K=pFK->pNextFrom
a8a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65  ){.        pPare
a8b0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nt = sqlite3Find
a8c0: 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a  Table(db, pFK->z
a8d0: 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  To, zDb);.      
a8e0: 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30    if( pParent==0
a8f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a900: 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20       pIdx = 0;. 
a910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61         sqlite3Ta
a920: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
a930: 69 44 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e  iDb, pParent->tn
a940: 75 6d 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e  um, 0, pParent->
a950: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
a960: 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63  x = sqlite3FkLoc
a970: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
a980: 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26   pParent, pFK, &
a990: 70 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  pIdx, 0);.      
a9a0: 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20    if( x==0 ){.  
a9b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
a9c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a9d0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
a9e0: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  ble(pParse, i, i
a9f0: 44 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50 5f  Db, pParent, OP_
aa00: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
aa10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
aa30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
aa40: 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20 70 49 64  OpenRead, i, pId
aa50: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
aa60: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
aa70: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
aa80: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
aa90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
aaa0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aab0: 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20         k = 0;.  
aac0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
aad0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
aae0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
aaf0: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c  Parse->nErr>0 ||
ab00: 20 70 46 4b 3d 3d 30 20 29 3b 0a 20 20 20 20 20   pFK==0 );.     
ab10: 20 69 66 28 20 70 46 4b 20 29 20 62 72 65 61 6b   if( pFK ) break
ab20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
ab30: 73 65 2d 3e 6e 54 61 62 3c 69 20 29 20 70 50 61  se->nTab<i ) pPa
ab40: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a 20  rse->nTab = i;. 
ab50: 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73       addrTop = s
ab60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
ab70: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30  (v, OP_Rewind, 0
ab80: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
ab90: 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  v);.      for(i=
aba0: 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b  1, pFK=pTab->pFK
abb0: 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46  ey; pFK; i++, pF
abc0: 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d  K=pFK->pNextFrom
abd0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65  ){.        pPare
abe0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nt = sqlite3Find
abf0: 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a  Table(db, pFK->z
ac00: 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  To, zDb);.      
ac10: 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20    pIdx = 0;.    
ac20: 20 20 20 20 61 69 43 6f 6c 73 20 3d 20 30 3b 0a      aiCols = 0;.
ac30: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
ac40: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
ac50: 20 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f   x = sqlite3FkLo
ac60: 63 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  cateIndex(pParse
ac70: 2c 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20  , pParent, pFK, 
ac80: 26 70 49 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b  &pIdx, &aiCols);
ac90: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
aca0: 74 28 20 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( x==0 );.     
acb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
acc0: 72 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rOk = sqlite3Vdb
acd0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
ace0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
acf0: 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 61 64  ate code to read
ad00: 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 76   the child key v
ad10: 61 6c 75 65 73 20 69 6e 74 6f 20 72 65 67 69 73  alues into regis
ad20: 74 65 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ters.        ** 
ad30: 72 65 67 52 6f 77 2e 2e 72 65 67 52 6f 77 2b 6e  regRow..regRow+n
ad40: 2e 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  . If any of the 
ad50: 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 73  child key values
ad60: 20 61 72 65 20 4e 55 4c 4c 2c 20 74 68 69 73 20   are NULL, this 
ad70: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20  .        ** row 
ad80: 63 61 6e 6e 6f 74 20 63 61 75 73 65 20 61 6e 20  cannot cause an 
ad90: 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e 20 4a 75  FK violation. Ju
ada0: 6d 70 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  mp directly to a
adb0: 64 64 72 4f 6b 20 69 6e 20 0a 20 20 20 20 20 20  ddrOk in .      
adc0: 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 2e 20    ** this case. 
add0: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
ade0: 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b  =0; j<pFK->nCol;
adf0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
ae00: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 61 69 43 6f   int iCol = aiCo
ae10: 6c 73 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d 20 3a  ls ? aiCols[j] :
ae20: 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46   pFK->aCol[j].iF
ae30: 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  rom;.          s
ae40: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
ae50: 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
ae60: 2c 20 70 54 61 62 2c 20 30 2c 20 69 43 6f 6c 2c  , pTab, 0, iCol,
ae70: 20 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20 20 20   regRow+j);.    
ae80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ae90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
aea0: 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a 2c 20  Null, regRow+j, 
aeb0: 61 64 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f 76  addrOk); VdbeCov
aec0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
aed0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
aee0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
aef0: 20 71 75 65 72 79 20 74 68 65 20 70 61 72 65 6e   query the paren
af00: 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20 6d 61  t index for a ma
af10: 74 63 68 69 6e 67 20 70 61 72 65 6e 74 0a 20 20  tching parent.  
af20: 20 20 20 20 20 20 2a 2a 20 6b 65 79 2e 20 49 66        ** key. If
af30: 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e   a match is foun
af40: 64 2c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 4f  d, jump to addrO
af50: 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  k. */.        if
af60: 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
af70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
af80: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
af90: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
afa0: 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65  pFK->nCol, regKe
afb0: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
afc0: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
afd0: 69 6e 69 74 79 53 74 72 28 64 62 2c 70 49 64 78  inityStr(db,pIdx
afe0: 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a 20  ), pFK->nCol);. 
aff0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b000: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
b010: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c 20 61 64   OP_Found, i, ad
b020: 64 72 4f 6b 2c 20 72 65 67 4b 65 79 2c 20 30 29  drOk, regKey, 0)
b030: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
b040: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b050: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
b060: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
b070: 20 20 20 20 69 6e 74 20 6a 6d 70 20 3d 20 73 71      int jmp = sq
b080: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
b090: 41 64 64 72 28 76 29 2b 32 3b 0a 20 20 20 20 20  Addr(v)+2;.     
b0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b0b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
b0c0: 6b 52 6f 77 69 64 2c 20 69 2c 20 6a 6d 70 2c 20  kRowid, i, jmp, 
b0d0: 72 65 67 52 6f 77 29 3b 20 56 64 62 65 43 6f 76  regRow); VdbeCov
b0e0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
b0f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
b100: 6f 74 6f 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a  oto(v, addrOk);.
b110: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
b120: 28 20 70 46 4b 2d 3e 6e 43 6f 6c 3d 3d 31 20 29  ( pFK->nCol==1 )
b130: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
b140: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
b150: 20 63 6f 64 65 20 74 6f 20 72 65 70 6f 72 74 20   code to report 
b160: 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 20  an FK violation 
b170: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a  to the caller. *
b180: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61  /.        if( Ha
b190: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
b1a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b1b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b1c0: 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 52  P_Rowid, 0, regR
b1d0: 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20 20  esult+1);.      
b1e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b1f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b200: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
b210: 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29   0, regResult+1)
b220: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
b240: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 72 65 67 52  ultiLoad(v, regR
b250: 65 73 75 6c 74 2b 32 2c 20 22 73 69 58 22 2c 20  esult+2, "siX", 
b260: 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29 3b 0a  pFK->zTo, i-1);.
b270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b280: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b290: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65  ResultRow, regRe
b2a0: 73 75 6c 74 2c 20 34 29 3b 0a 20 20 20 20 20 20  sult, 4);.      
b2b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
b2c0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
b2d0: 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rOk);.        sq
b2e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b2f0: 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 7d  aiCols);.      }
b300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b310: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
b320: 65 78 74 2c 20 30 2c 20 61 64 64 72 54 6f 70 2b  ext, 0, addrTop+
b330: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
b340: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
b350: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b360: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
b370: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
b380: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
b390: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
b3a0: 49 47 47 45 52 29 20 2a 2f 0a 23 65 6e 64 69 66  IGGER) */.#endif
b3b0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
b3c0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
b3d0: 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  _KEY) */..#ifnde
b3e0: 66 20 4e 44 45 42 55 47 0a 20 20 63 61 73 65 20  f NDEBUG.  case 
b3f0: 50 72 61 67 54 79 70 5f 50 41 52 53 45 52 5f 54  PragTyp_PARSER_T
b400: 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  RACE: {.    if( 
b410: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
b420: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f  if( sqlite3GetBo
b430: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29  olean(zRight, 0)
b440: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b450: 74 65 33 50 61 72 73 65 72 54 72 61 63 65 28 73  te3ParserTrace(s
b460: 74 64 6f 75 74 2c 20 22 70 61 72 73 65 72 3a 20  tdout, "parser: 
b470: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
b480: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b490: 50 61 72 73 65 72 54 72 61 63 65 28 30 2c 20 30  ParserTrace(0, 0
b4a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
b4b0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
b4c0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 69 6e 73  ndif..  /* Reins
b4d0: 74 61 6c 6c 20 74 68 65 20 4c 49 4b 45 20 61 6e  tall the LIKE an
b4e0: 64 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73  d GLOB functions
b4f0: 2e 20 20 54 68 65 20 76 61 72 69 61 6e 74 20 6f  .  The variant o
b500: 66 20 4c 49 4b 45 0a 20 20 2a 2a 20 75 73 65 64  f LIKE.  ** used
b510: 20 77 69 6c 6c 20 62 65 20 63 61 73 65 20 73 65   will be case se
b520: 6e 73 69 74 69 76 65 20 6f 72 20 6e 6f 74 20 64  nsitive or not d
b530: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
b540: 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  RHS..  */.  case
b550: 20 50 72 61 67 54 79 70 5f 43 41 53 45 5f 53 45   PragTyp_CASE_SE
b560: 4e 53 49 54 49 56 45 5f 4c 49 4b 45 3a 20 7b 0a  NSITIVE_LIKE: {.
b570: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
b580: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
b590: 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74  egisterLikeFunct
b5a0: 69 6f 6e 73 28 64 62 2c 20 73 71 6c 69 74 65 33  ions(db, sqlite3
b5b0: 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  GetBoolean(zRigh
b5c0: 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20  t, 0));.    }.  
b5d0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 6e  }.  break;..#ifn
b5e0: 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  def SQLITE_INTEG
b5f0: 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52  RITY_CHECK_ERROR
b600: 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65 20 53 51  _MAX.# define SQ
b610: 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43  LITE_INTEGRITY_C
b620: 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 20 31  HECK_ERROR_MAX 1
b630: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
b640: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
b650: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 20  NTEGRITY_CHECK. 
b660: 20 2f 2a 20 20 20 20 50 52 41 47 4d 41 20 69 6e   /*    PRAGMA in
b670: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 20 20  tegrity_check.  
b680: 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  **    PRAGMA int
b690: 65 67 72 69 74 79 5f 63 68 65 63 6b 28 4e 29 0a  egrity_check(N).
b6a0: 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71    **    PRAGMA q
b6b0: 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20 2a 2a 20  uick_check.  ** 
b6c0: 20 20 20 50 52 41 47 4d 41 20 71 75 69 63 6b 5f     PRAGMA quick_
b6d0: 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a 0a 20 20  check(N).  **.  
b6e0: 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20 69 6e  ** Verify the in
b6f0: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 64  tegrity of the d
b700: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
b710: 2a 2a 20 54 68 65 20 22 71 75 69 63 6b 5f 63 68  ** The "quick_ch
b720: 65 63 6b 22 20 69 73 20 72 65 64 75 63 65 64 20  eck" is reduced 
b730: 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a  version of .  **
b740: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
b750: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 64 65 74   designed to det
b760: 65 63 74 20 6d 6f 73 74 20 64 61 74 61 62 61 73  ect most databas
b770: 65 20 63 6f 72 72 75 70 74 69 6f 6e 0a 20 20 2a  e corruption.  *
b780: 2a 20 77 69 74 68 6f 75 74 20 74 68 65 20 6f 76  * without the ov
b790: 65 72 68 65 61 64 20 6f 66 20 63 72 6f 73 73 2d  erhead of cross-
b7a0: 63 68 65 63 6b 69 6e 67 20 69 6e 64 65 78 65 73  checking indexes
b7b0: 2e 20 20 51 75 69 63 6b 5f 63 68 65 63 6b 0a 20  .  Quick_check. 
b7c0: 20 2a 2a 20 69 73 20 6c 69 6e 65 61 72 20 74 69   ** is linear ti
b7d0: 6d 65 20 77 68 65 72 65 61 73 65 20 69 6e 74 65  me wherease inte
b7e0: 67 72 69 74 79 5f 63 68 65 63 6b 20 69 73 20 4f  grity_check is O
b7f0: 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a 2f 0a 20 20  (NlogN)..  */.  
b800: 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 54  case PragTyp_INT
b810: 45 47 52 49 54 59 5f 43 48 45 43 4b 3a 20 7b 0a  EGRITY_CHECK: {.
b820: 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 61 64      int i, j, ad
b830: 64 72 2c 20 6d 78 45 72 72 3b 0a 0a 20 20 20 20  dr, mxErr;..    
b840: 69 6e 74 20 69 73 51 75 69 63 6b 20 3d 20 28 73  int isQuick = (s
b850: 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a 4c  qlite3Tolower(zL
b860: 65 66 74 5b 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a  eft[0])=='q');..
b870: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52      /* If the PR
b880: 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 77 61 73  AGMA command was
b890: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 50 52   of the form "PR
b8a0: 41 47 4d 41 20 3c 64 62 3e 2e 69 6e 74 65 67 72  AGMA <db>.integr
b8b0: 69 74 79 5f 63 68 65 63 6b 22 2c 0a 20 20 20 20  ity_check",.    
b8c0: 2a 2a 20 74 68 65 6e 20 69 44 62 20 69 73 20 73  ** then iDb is s
b8d0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
b8e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
b8f0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 3c 64  identified by <d
b900: 62 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  b>..    ** In th
b910: 69 73 20 63 61 73 65 2c 20 74 68 65 20 69 6e 74  is case, the int
b920: 65 67 72 69 74 79 20 6f 66 20 64 61 74 61 62 61  egrity of databa
b930: 73 65 20 69 44 62 20 6f 6e 6c 79 20 69 73 20 76  se iDb only is v
b940: 65 72 69 66 69 65 64 20 62 79 0a 20 20 20 20 2a  erified by.    *
b950: 2a 20 74 68 65 20 56 44 42 45 20 63 72 65 61 74  * the VDBE creat
b960: 65 64 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  ed below..    **
b970: 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
b980: 65 2c 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e  e, if the comman
b990: 64 20 77 61 73 20 73 69 6d 70 6c 79 20 22 50 52  d was simply "PR
b9a0: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
b9b0: 68 65 63 6b 22 20 28 6f 72 0a 20 20 20 20 2a 2a  heck" (or.    **
b9c0: 20 22 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63   "PRAGMA quick_c
b9d0: 68 65 63 6b 22 29 2c 20 74 68 65 6e 20 69 44 62  heck"), then iDb
b9e0: 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 49 6e   is set to 0. In
b9f0: 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20   this case, set 
ba00: 69 44 62 0a 20 20 20 20 2a 2a 20 74 6f 20 2d 31  iDb.    ** to -1
ba10: 20 68 65 72 65 2c 20 74 6f 20 69 6e 64 69 63 61   here, to indica
ba20: 74 65 20 74 68 61 74 20 74 68 65 20 56 44 42 45  te that the VDBE
ba30: 20 73 68 6f 75 6c 64 20 76 65 72 69 66 79 20 74   should verify t
ba40: 68 65 20 69 6e 74 65 67 72 69 74 79 0a 20 20 20  he integrity.   
ba50: 20 2a 2a 20 6f 66 20 61 6c 6c 20 61 74 74 61 63   ** of all attac
ba60: 68 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  hed databases.  
ba70: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
ba80: 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  Db>=0 );.    ass
ba90: 65 72 74 28 20 69 44 62 3d 3d 30 20 7c 7c 20 70  ert( iDb==0 || p
baa0: 49 64 32 2d 3e 7a 20 29 3b 0a 20 20 20 20 69 66  Id2->z );.    if
bab0: 28 20 70 49 64 32 2d 3e 7a 3d 3d 30 20 29 20 69  ( pId2->z==0 ) i
bac0: 44 62 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a  Db = -1;..    /*
bad0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
bae0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 2a 2f 0a  VDBE program */.
baf0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
bb00: 20 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   = 6;..    /* Se
bb10: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 65 72  t the maximum er
bb20: 72 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  ror count */.   
bb30: 20 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f   mxErr = SQLITE_
bb40: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f  INTEGRITY_CHECK_
bb50: 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 69  ERROR_MAX;.    i
bb60: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
bb70: 20 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74     sqlite3GetInt
bb80: 33 32 28 7a 52 69 67 68 74 2c 20 26 6d 78 45 72  32(zRight, &mxEr
bb90: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  r);.      if( mx
bba0: 45 72 72 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  Err<=0 ){.      
bbb0: 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45    mxErr = SQLITE
bbc0: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
bbd0: 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20  _ERROR_MAX;.    
bbe0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
bbf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bc00: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d  v, OP_Integer, m
bc10: 78 45 72 72 2d 31 2c 20 31 29 3b 20 2f 2a 20 72  xErr-1, 1); /* r
bc20: 65 67 5b 31 5d 20 68 6f 6c 64 73 20 65 72 72 6f  eg[1] holds erro
bc30: 72 73 20 6c 65 66 74 20 2a 2f 0a 0a 20 20 20 20  rs left */..    
bc40: 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69  /* Do an integri
bc50: 74 79 20 63 68 65 63 6b 20 6f 6e 20 65 61 63 68  ty check on each
bc60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
bc70: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
bc80: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
bc90: 20 20 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a        HashElem *
bca0: 78 3b 0a 20 20 20 20 20 20 48 61 73 68 20 2a 70  x;.      Hash *p
bcb0: 54 62 6c 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  Tbls;.      int 
bcc0: 2a 61 52 6f 6f 74 3b 0a 20 20 20 20 20 20 69 6e  *aRoot;.      in
bcd0: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  t cnt = 0;.     
bce0: 20 69 6e 74 20 6d 78 49 64 78 20 3d 20 30 3b 0a   int mxIdx = 0;.
bcf0: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 78 3b 0a        int nIdx;.
bd00: 0a 20 20 20 20 20 20 69 66 28 20 4f 4d 49 54 5f  .      if( OMIT_
bd10: 54 45 4d 50 44 42 20 26 26 20 69 3d 3d 31 20 29  TEMPDB && i==1 )
bd20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
bd30: 20 69 66 28 20 69 44 62 3e 3d 30 20 26 26 20 69   if( iDb>=0 && i
bd40: 21 3d 69 44 62 20 29 20 63 6f 6e 74 69 6e 75 65  !=iDb ) continue
bd50: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
bd60: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
bd70: 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 0a 20 20  (pParse, i);..  
bd80: 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74      /* Do an int
bd90: 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f 66 20  egrity check of 
bda0: 74 68 65 20 42 2d 54 72 65 65 0a 20 20 20 20 20  the B-Tree.     
bdb0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 67   **.      ** Beg
bdc0: 69 6e 20 62 79 20 66 69 6e 64 69 6e 67 20 74 68  in by finding th
bdd0: 65 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d  e root pages num
bde0: 62 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 66 6f  bers.      ** fo
bdf0: 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  r all tables and
be00: 20 69 6e 64 69 63 65 73 20 69 6e 20 74 68 65 20   indices in the 
be10: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
be20: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
be30: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
be40: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 2c 20 30  texHeld(db, i, 0
be50: 29 20 29 3b 0a 20 20 20 20 20 20 70 54 62 6c 73  ) );.      pTbls
be60: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 70   = &db->aDb[i].p
be70: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
be80: 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74 3d 30  .      for(cnt=0
be90: 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69  , x=sqliteHashFi
bea0: 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78  rst(pTbls); x; x
beb0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
bec0: 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  x)){.        Tab
bed0: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
bee0: 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20  eHashData(x);.  
bef0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
bf00: 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 48  x;.        if( H
bf10: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
bf20: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66  cnt++;.        f
bf30: 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49 64 78 3d  or(nIdx=0, pIdx=
bf40: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
bf50: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
bf60: 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29 7b 20 63  Next, nIdx++){ c
bf70: 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20  nt++; }.        
bf80: 69 66 28 20 6e 49 64 78 3e 6d 78 49 64 78 20 29  if( nIdx>mxIdx )
bf90: 20 6d 78 49 64 78 20 3d 20 6e 49 64 78 3b 0a 20   mxIdx = nIdx;. 
bfa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 52 6f       }.      aRo
bfb0: 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ot = sqlite3DbMa
bfc0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
bfd0: 7a 65 6f 66 28 69 6e 74 29 2a 28 63 6e 74 2b 31  zeof(int)*(cnt+1
bfe0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 52  ));.      if( aR
bff0: 6f 6f 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  oot==0 ) break;.
c000: 20 20 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c        for(cnt=0,
c010: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72   x=sqliteHashFir
c020: 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d  st(pTbls); x; x=
c030: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78  sqliteHashNext(x
c040: 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  )){.        Tabl
c050: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
c060: 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20  HashData(x);.   
c070: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
c080: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61  ;.        if( Ha
c090: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 61  sRowid(pTab) ) a
c0a0: 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70 54  Root[cnt++] = pT
c0b0: 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  ab->tnum;.      
c0c0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
c0d0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
c0e0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
c0f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 52 6f 6f  {.          aRoo
c100: 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70 49 64 78 2d  t[cnt++] = pIdx-
c110: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 7d  >tnum;.        }
c120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
c130: 52 6f 6f 74 5b 63 6e 74 5d 20 3d 20 30 3b 0a 0a  Root[cnt] = 0;..
c140: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
c150: 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 6e 75  re sufficient nu
c160: 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
c170: 73 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  s have been allo
c180: 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 70  cated */.      p
c190: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41  Parse->nMem = MA
c1a0: 58 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c  X( pParse->nMem,
c1b0: 20 38 2b 6d 78 49 64 78 20 29 3b 0a 20 20 20 20   8+mxIdx );.    
c1c0: 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
c1d0: 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
c1e0: 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f  e);..      /* Do
c1f0: 20 74 68 65 20 62 2d 74 72 65 65 20 69 6e 74 65   the b-tree inte
c200: 67 72 69 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a  grity checks */.
c210: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c220: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e  eAddOp4(v, OP_In
c230: 74 65 67 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e  tegrityCk, 2, cn
c240: 74 2c 20 31 2c 20 28 63 68 61 72 2a 29 61 52 6f  t, 1, (char*)aRo
c250: 6f 74 2c 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  ot,P4_INTARRAY);
c260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c270: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
c280: 38 29 69 29 3b 0a 20 20 20 20 20 20 61 64 64 72  8)i);.      addr
c290: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c2a0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
c2b0: 6c 2c 20 32 29 3b 20 56 64 62 65 43 6f 76 65 72  l, 2); VdbeCover
c2c0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
c2d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
c2e0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
c2f0: 2c 20 33 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 3, 0,.        
c300: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
c310: 64 62 2c 20 22 2a 2a 2a 20 69 6e 20 64 61 74 61  db, "*** in data
c320: 62 61 73 65 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20  base %s ***\n", 
c330: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
c340: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 50  ame),.         P
c350: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
c360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c370: 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20  Op3(v, OP_Move, 
c380: 32 2c 20 34 2c 20 31 29 3b 0a 20 20 20 20 20 20  2, 4, 1);.      
c390: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c3a0: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
c3b0: 34 2c 20 33 2c 20 32 29 3b 0a 20 20 20 20 20 20  4, 3, 2);.      
c3c0: 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65  integrityCheckRe
c3d0: 73 75 6c 74 52 6f 77 28 76 2c 20 32 29 3b 0a 20  sultRow(v, 2);. 
c3e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c3f0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
c400: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b  );..      /* Mak
c410: 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 69  e sure all the i
c420: 6e 64 69 63 65 73 20 61 72 65 20 63 6f 6e 73 74  ndices are const
c430: 72 75 63 74 65 64 20 63 6f 72 72 65 63 74 6c 79  ructed correctly
c440: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c450: 20 66 6f 72 28 78 3d 73 71 6c 69 74 65 48 61 73   for(x=sqliteHas
c460: 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78  hFirst(pTbls); x
c470: 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; x=sqliteHashNe
c480: 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(x)){.        
c490: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
c4a0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b  liteHashData(x);
c4b0: 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
c4c0: 70 49 64 78 2c 20 2a 70 50 6b 3b 0a 20 20 20 20  pIdx, *pPk;.    
c4d0: 20 20 20 20 49 6e 64 65 78 20 2a 70 50 72 69 6f      Index *pPrio
c4e0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  r = 0;.        i
c4f0: 6e 74 20 6c 6f 6f 70 54 6f 70 3b 0a 20 20 20 20  nt loopTop;.    
c500: 20 20 20 20 69 6e 74 20 69 44 61 74 61 43 75 72      int iDataCur
c510: 2c 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  , iIdxCur;.     
c520: 20 20 20 69 6e 74 20 72 31 20 3d 20 2d 31 3b 0a     int r1 = -1;.
c530: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
c540: 62 2d 3e 74 6e 75 6d 3c 31 20 29 20 63 6f 6e 74  b->tnum<1 ) cont
c550: 69 6e 75 65 3b 20 20 2f 2a 20 53 6b 69 70 20 56  inue;  /* Skip V
c560: 49 45 57 73 20 6f 72 20 56 49 52 54 55 41 4c 20  IEWs or VIRTUAL 
c570: 54 41 42 4c 45 73 20 2a 2f 0a 20 20 20 20 20 20  TABLEs */.      
c580: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 43 68 65    if( pTab->pChe
c590: 63 6b 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ck==0.         &
c5a0: 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
c5b0: 73 20 26 20 54 46 5f 48 61 73 4e 6f 74 4e 75 6c  s & TF_HasNotNul
c5c0: 6c 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  l)==0.         &
c5d0: 26 20 28 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  & (pTab->pIndex=
c5e0: 3d 30 20 7c 7c 20 69 73 51 75 69 63 6b 29 0a 20  =0 || isQuick). 
c5f0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
c600: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
c610: 2a 20 4e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  * No additional 
c620: 63 68 65 63 6b 73 20 6e 65 65 64 65 64 20 66 6f  checks needed fo
c630: 72 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  r this table */.
c640: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c650: 20 20 70 50 6b 20 3d 20 48 61 73 52 6f 77 69 64    pPk = HasRowid
c660: 28 70 54 61 62 29 20 3f 20 30 20 3a 20 73 71 6c  (pTab) ? 0 : sql
c670: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
c680: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
c690: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
c6a0: 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
c6b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c6c0: 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64  3OpenTableAndInd
c6d0: 69 63 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ices(pParse, pTa
c6e0: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  b, OP_OpenRead, 
c6f0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 20 20 20 20 31 2c 20 30 2c 20 26 69 44 61        1, 0, &iDa
c720: 74 61 43 75 72 2c 20 26 69 49 64 78 43 75 72 29  taCur, &iIdxCur)
c730: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c740: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c750: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 37 29  P_Integer, 0, 7)
c760: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
c770: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
c780: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
c790: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b  =pIdx->pNext, j+
c7a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
c7b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c7c0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
c7d0: 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65 78  , 8+j); /* index
c7e0: 20 65 6e 74 72 69 65 73 20 63 6f 75 6e 74 65 72   entries counter
c7f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
c800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c810: 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20  arse->nMem>=8+j 
c820: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
c830: 74 28 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70  t( sqlite3NoTemp
c840: 73 49 6e 52 61 6e 67 65 28 70 50 61 72 73 65 2c  sInRange(pParse,
c850: 31 2c 37 2b 6a 29 20 29 3b 0a 20 20 20 20 20 20  1,7+j) );.      
c860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c870: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
c880: 2c 20 69 44 61 74 61 43 75 72 2c 20 30 29 3b 20  , iDataCur, 0); 
c890: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
c8a0: 0a 20 20 20 20 20 20 20 20 6c 6f 6f 70 54 6f 70  .        loopTop
c8b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c8c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
c8d0: 6d 2c 20 37 2c 20 31 29 3b 0a 20 20 20 20 20 20  m, 7, 1);.      
c8e0: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
c8f0: 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f   all NOT NULL co
c900: 6c 75 6d 6e 73 20 72 65 61 6c 6c 79 20 61 72 65  lumns really are
c910: 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20   NOT NULL */.   
c920: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
c930: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
c940: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
c950: 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20   *zErr;.        
c960: 20 20 69 6e 74 20 6a 6d 70 32 3b 0a 20 20 20 20    int jmp2;.    
c970: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
c980: 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69  b->iPKey ) conti
c990: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
c9a0: 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  f( pTab->aCol[j]
c9b0: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f  .notNull==0 ) co
c9c0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
c9d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c9e0: 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
c9f0: 65 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61  e(v, pTab, iData
ca00: 43 75 72 2c 20 6a 2c 20 33 29 3b 0a 20 20 20 20  Cur, j, 3);.    
ca10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ca20: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
ca30: 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
ca40: 20 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d            jmp2 =
ca50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ca60: 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
ca70: 2c 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 3); VdbeCovera
ca80: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
ca90: 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d   zErr = sqlite3M
caa0: 50 72 69 6e 74 66 28 64 62 2c 20 22 4e 55 4c 4c  Printf(db, "NULL
cab0: 20 76 61 6c 75 65 20 69 6e 20 25 73 2e 25 73 22   value in %s.%s"
cac0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20  , pTab->zName,. 
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
caf0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
cb00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
cb10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
cb20: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
cb30: 20 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f   3, 0, zErr, P4_
cb40: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
cb50: 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65      integrityChe
cb60: 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 2c 20 33  ckResultRow(v, 3
cb70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
cb80: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
cb90: 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20  (v, jmp2);.     
cba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
cbb0: 56 65 72 69 66 79 20 43 48 45 43 4b 20 63 6f 6e  Verify CHECK con
cbc0: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
cbd0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 43      if( pTab->pC
cbe0: 68 65 63 6b 20 26 26 20 28 64 62 2d 3e 66 6c 61  heck && (db->fla
cbf0: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 67 6e 6f  gs & SQLITE_Igno
cc00: 72 65 43 68 65 63 6b 73 29 3d 3d 30 20 29 7b 0a  reChecks)==0 ){.
cc10: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
cc20: 73 74 20 2a 70 43 68 65 63 6b 20 3d 20 73 71 6c  st *pCheck = sql
cc30: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
cc40: 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  db, pTab->pCheck
cc50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
cc60: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
cc70: 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iled==0 ){.     
cc80: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 43         int addrC
cc90: 6b 46 61 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  kFault = sqlite3
cca0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ccb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
ccc0: 74 20 61 64 64 72 43 6b 4f 6b 20 3d 20 73 71 6c  t addrCkOk = sql
ccd0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
cce0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l(v);.          
ccf0: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
cd00: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
cd10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
cd20: 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20  rse->iSelfTab = 
cd30: 69 44 61 74 61 43 75 72 20 2b 20 31 3b 0a 20 20  iDataCur + 1;.  
cd40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cd50: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
cd60: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
cd70: 20 20 20 20 66 6f 72 28 6b 3d 70 43 68 65 63 6b      for(k=pCheck
cd80: 2d 3e 6e 45 78 70 72 2d 31 3b 20 6b 3e 30 3b 20  ->nExpr-1; k>0; 
cd90: 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k--){.          
cda0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
cdb0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
cdc0: 43 68 65 63 6b 2d 3e 61 5b 6b 5d 2e 70 45 78 70  Check->a[k].pExp
cdd0: 72 2c 20 61 64 64 72 43 6b 46 61 75 6c 74 2c 20  r, addrCkFault, 
cde0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
cdf0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
ce00: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
ce10: 70 50 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e  pParse, pCheck->
ce20: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 64 64 72  a[0].pExpr, addr
ce30: 43 6b 4f 6b 2c 20 0a 20 20 20 20 20 20 20 20 20  CkOk, .         
ce40: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55         SQLITE_JU
ce50: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
ce60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ce70: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
ce80: 2c 20 61 64 64 72 43 6b 46 61 75 6c 74 29 3b 0a  , addrCkFault);.
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
cea0: 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30  se->iSelfTab = 0
ceb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 45  ;.            zE
cec0: 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  rr = sqlite3MPri
ced0: 6e 74 66 28 64 62 2c 20 22 43 48 45 43 4b 20 63  ntf(db, "CHECK c
cee0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
cef0: 20 69 6e 20 25 73 22 2c 0a 20 20 20 20 20 20 20   in %s",.       
cf00: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
cf10: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
cf20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cf30: 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
cf40: 67 38 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72  g8, 0, 3, 0, zEr
cf50: 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  r, P4_DYNAMIC);.
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65              inte
cf70: 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74  grityCheckResult
cf80: 52 6f 77 28 76 2c 20 33 29 3b 0a 20 20 20 20 20  Row(v, 3);.     
cf90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cfa0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
cfb0: 2c 20 61 64 64 72 43 6b 4f 6b 29 3b 0a 20 20 20  , addrCkOk);.   
cfc0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cfd0: 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
cfe0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
cff0: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
d000: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
d010: 65 28 64 62 2c 20 70 43 68 65 63 6b 29 3b 0a 20  e(db, pCheck);. 
d020: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d030: 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 69 6e 64   /* Validate ind
d040: 65 78 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ex entries for t
d050: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a  he current row *
d060: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  /.        for(j=
d070: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
d080: 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 21 69  ndex; pIdx && !i
d090: 73 51 75 69 63 6b 3b 20 70 49 64 78 3d 70 49 64  sQuick; pIdx=pId
d0a0: 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a  x->pNext, j++){.
d0b0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d            int jm
d0c0: 70 32 2c 20 6a 6d 70 33 2c 20 6a 6d 70 34 2c 20  p2, jmp3, jmp4, 
d0d0: 6a 6d 70 35 3b 0a 20 20 20 20 20 20 20 20 20 20  jmp5;.          
d0e0: 69 6e 74 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c  int ckUniq = sql
d0f0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
d100: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l(v);.          
d110: 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20  if( pPk==pIdx ) 
d120: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
d130: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
d140: 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
d150: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69  (pParse, pIdx, i
d160: 44 61 74 61 43 75 72 2c 20 30 2c 20 30 2c 20 26  DataCur, 0, 0, &
d170: 6a 6d 70 33 2c 0a 20 20 20 20 20 20 20 20 20 20  jmp3,.          
d180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
d1a0: 69 6f 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ior, r1);.      
d1b0: 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 49 64      pPrior = pId
d1c0: 78 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  x;.          sql
d1d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d1e0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 38 2b 6a  , OP_AddImm, 8+j
d1f0: 2c 20 31 29 3b 20 20 2f 2a 20 69 6e 63 72 65 6d  , 1);  /* increm
d200: 65 6e 74 20 65 6e 74 72 79 20 63 6f 75 6e 74 20  ent entry count 
d210: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  */.          /* 
d220: 56 65 72 69 66 79 20 74 68 61 74 20 61 6e 20 69  Verify that an i
d230: 6e 64 65 78 20 65 6e 74 72 79 20 65 78 69 73 74  ndex entry exist
d240: 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
d250: 74 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20  t table row */. 
d260: 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20           jmp2 = 
d270: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d280: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
d290: 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 63 6b 55  , iIdxCur+j, ckU
d2a0: 6e 69 71 2c 20 72 31 2c 0a 20 20 20 20 20 20 20  niq, r1,.       
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d2d0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 20 56  Idx->nColumn); V
d2e0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d2f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d300: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
d310: 76 2c 20 33 2c 20 22 72 6f 77 20 22 29 3b 0a 20  v, 3, "row ");. 
d320: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d330: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d340: 5f 43 6f 6e 63 61 74 2c 20 37 2c 20 33 2c 20 33  _Concat, 7, 3, 3
d350: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d360: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
d370: 6e 67 28 76 2c 20 34 2c 20 22 20 6d 69 73 73 69  ng(v, 4, " missi
d380: 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78 20 22 29  ng from index ")
d390: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d3a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d3b0: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33   OP_Concat, 4, 3
d3c0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
d3d0: 6a 6d 70 35 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp5 = sqlite3Vd
d3e0: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
d3f0: 34 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  4, pIdx->zName);
d400: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d410: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d420: 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c  OP_Concat, 4, 3,
d430: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a   3);.          j
d440: 6d 70 34 20 3d 20 69 6e 74 65 67 72 69 74 79 43  mp4 = integrityC
d450: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 2c  heckResultRow(v,
d460: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   3);.          s
d470: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
d480: 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20  re(v, jmp2);.   
d490: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e         /* For UN
d4a0: 49 51 55 45 20 69 6e 64 65 78 65 73 2c 20 76 65  IQUE indexes, ve
d4b0: 72 69 66 79 20 74 68 61 74 20 6f 6e 6c 79 20 6f  rify that only o
d4c0: 6e 65 20 65 6e 74 72 79 20 65 78 69 73 74 73 20  ne entry exists 
d4d0: 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 20  with the.       
d4e0: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 6b 65     ** current ke
d4f0: 79 2e 20 20 54 68 65 20 65 6e 74 72 79 20 69 73  y.  The entry is
d500: 20 75 6e 69 71 75 65 20 69 66 20 28 31 29 20 61   unique if (1) a
d510: 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c  ny column is NUL
d520: 4c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  L.          ** o
d530: 72 20 28 32 29 20 74 68 65 20 6e 65 78 74 20 65  r (2) the next e
d540: 6e 74 72 79 20 68 61 73 20 61 20 64 69 66 66 65  ntry has a diffe
d550: 72 65 6e 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20  rent key */.    
d560: 20 20 20 20 20 20 69 66 28 20 49 73 55 6e 69 71        if( IsUniq
d570: 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b  ueIndex(pIdx) ){
d580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d590: 20 75 6e 69 71 4f 6b 20 3d 20 73 71 6c 69 74 65   uniqOk = sqlite
d5a0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
d5b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
d5c0: 6e 74 20 6a 6d 70 36 3b 0a 20 20 20 20 20 20 20  nt jmp6;.       
d5d0: 20 20 20 20 20 69 6e 74 20 6b 6b 3b 0a 20 20 20       int kk;.   
d5e0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 6b 3d           for(kk=
d5f0: 30 3b 20 6b 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79  0; kk<pIdx->nKey
d600: 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20  Col; kk++){.    
d610: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
d620: 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
d630: 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20 20 20 20 20 20  umn[kk];.       
d640: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
d650: 43 6f 6c 21 3d 58 4e 5f 52 4f 57 49 44 20 26 26  Col!=XN_ROWID &&
d660: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
d670: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
d680: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
d690: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
d6a0: 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f 6e 74  ].notNull ) cont
d6b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
d6c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d6d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
d6e0: 6c 6c 2c 20 72 31 2b 6b 6b 2c 20 75 6e 69 71 4f  ll, r1+kk, uniqO
d6f0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
d700: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
d710: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
d720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70  .            jmp
d730: 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  6 = sqlite3VdbeA
d740: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp1(v, OP_Next
d750: 2c 20 69 49 64 78 43 75 72 2b 6a 29 3b 20 56 64  , iIdxCur+j); Vd
d760: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d770: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d780: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 75 6e  e3VdbeGoto(v, un
d790: 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  iqOk);.         
d7a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d7b0: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 36 29 3b  mpHere(v, jmp6);
d7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
d7e0: 74 28 76 2c 20 4f 50 5f 49 64 78 47 54 2c 20 69  t(v, OP_IdxGT, i
d7f0: 49 64 78 43 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b  IdxCur+j, uniqOk
d800: 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , r1,.          
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 4b 65         pIdx->nKe
d830: 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  yCol); VdbeCover
d840: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
d850: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
d860: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20  oadString(v, 3, 
d870: 22 6e 6f 6e 2d 75 6e 69 71 75 65 20 65 6e 74 72  "non-unique entr
d880: 79 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20  y in index ");. 
d890: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d8a0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 6d  e3VdbeGoto(v, jm
d8b0: 70 35 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p5);.           
d8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
d8d0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 75 6e 69 71  lveLabel(v, uniq
d8e0: 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Ok);.          }
d8f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d900: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d910: 2c 20 6a 6d 70 34 29 3b 0a 20 20 20 20 20 20 20  , jmp4);.       
d920: 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
d930: 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50  ePartIdxLabel(pP
d940: 61 72 73 65 2c 20 6a 6d 70 33 29 3b 0a 20 20 20  arse, jmp3);.   
d950: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
d960: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d970: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 44 61  (v, OP_Next, iDa
d980: 74 61 43 75 72 2c 20 6c 6f 6f 70 54 6f 70 29 3b  taCur, loopTop);
d990: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d9a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d9b0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
d9c0: 20 6c 6f 6f 70 54 6f 70 2d 31 29 3b 0a 23 69 66   loopTop-1);.#if
d9d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d9e0: 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20  _BTREECOUNT.    
d9f0: 20 20 20 20 69 66 28 20 21 69 73 51 75 69 63 6b      if( !isQuick
da00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
da10: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
da20: 69 6e 67 28 76 2c 20 32 2c 20 22 77 72 6f 6e 67  ing(v, 2, "wrong
da30: 20 23 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e   # of entries in
da40: 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20   index ");.     
da50: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
da60: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
da70: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
da80: 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20  ->pNext, j++){. 
da90: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
daa0: 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74 69  Pk==pIdx ) conti
dab0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
dac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dad0: 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
dae0: 69 49 64 78 43 75 72 2b 6a 2c 20 33 29 3b 0a 20  iIdxCur+j, 3);. 
daf0: 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20             addr 
db00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
db10: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 38 2b  Op3(v, OP_Eq, 8+
db20: 6a 2c 20 30 2c 20 33 29 3b 20 56 64 62 65 43 6f  j, 0, 3); VdbeCo
db30: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
db40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
db50: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
db60: 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  LITE_NOTNULL);. 
db70: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
db80: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
db90: 28 76 2c 20 33 2c 20 70 49 64 78 2d 3e 7a 4e 61  (v, 3, pIdx->zNa
dba0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
dbb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dbc0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c  p3(v, OP_Concat,
dbd0: 20 33 2c 20 32 2c 20 37 29 3b 0a 20 20 20 20 20   3, 2, 7);.     
dbe0: 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74 79         integrity
dbf0: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76  CheckResultRow(v
dc00: 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 7);.          
dc10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
dc20: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
dc30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
dc40: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
dc50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
dc60: 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20  ECOUNT */.      
dc70: 7d 20 0a 20 20 20 20 7d 0a 20 20 20 20 7b 0a 20  } .    }.    {. 
dc80: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
dc90: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
dca0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
dcb0: 29 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  );.      static 
dcc0: 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
dcd0: 20 65 6e 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20   endCode[] = {. 
dce0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49         { OP_AddI
dcf0: 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20  mm,      1, 0,  
dd00: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
dd10: 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  0 */.        { O
dd20: 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 20 20 31  P_IfNotZero,   1
dd30: 2c 20 34 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 4,        0}, 
dd40: 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20     /* 1 */.     
dd50: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c     { OP_String8,
dd60: 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20       0, 3,      
dd70: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f    0},    /* 2 */
dd80: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  .        { OP_Re
dd90: 73 75 6c 74 52 6f 77 2c 20 20 20 33 2c 20 31 2c  sultRow,   3, 1,
dda0: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
ddb0: 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a  * 3 */.      };.
ddc0: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f        VdbeOp *aO
ddd0: 70 3b 0a 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  p;..      aOp = 
dde0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ddf0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
de00: 65 28 65 6e 64 43 6f 64 65 29 2c 20 65 6e 64 43  e(endCode), endC
de10: 6f 64 65 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20  ode, iLn);.     
de20: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20   if( aOp ){.    
de30: 20 20 20 20 61 4f 70 5b 30 5d 2e 70 32 20 3d 20      aOp[0].p2 = 
de40: 31 2d 6d 78 45 72 72 3b 0a 20 20 20 20 20 20 20  1-mxErr;.       
de50: 20 61 4f 70 5b 32 5d 2e 70 34 74 79 70 65 20 3d   aOp[2].p4type =
de60: 20 50 34 5f 53 54 41 54 49 43 3b 0a 20 20 20 20   P4_STATIC;.    
de70: 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 2e 7a 20      aOp[2].p4.z 
de80: 3d 20 22 6f 6b 22 3b 0a 20 20 20 20 20 20 7d 0a  = "ok";.      }.
de90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
dea0: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
deb0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
dec0: 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
ded0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
dee0: 5f 55 54 46 31 36 0a 20 20 2f 2a 0a 20 20 2a 2a  _UTF16.  /*.  **
def0: 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69     PRAGMA encodi
df00: 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  ng.  **   PRAGMA
df10: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75 74 66   encoding = "utf
df20: 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c 22 75 74  -8"|"utf-16"|"ut
df30: 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31 36 62  f-16le"|"utf-16b
df40: 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  e".  **.  ** In 
df50: 69 74 73 20 66 69 72 73 74 20 66 6f 72 6d 2c 20  its first form, 
df60: 74 68 69 73 20 70 72 61 67 6d 61 20 72 65 74 75  this pragma retu
df70: 72 6e 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  rns the encoding
df80: 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a   of the main.  *
df90: 2a 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  * database. If t
dfa0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
dfb0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  ot initialized, 
dfc0: 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
dfd0: 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  d now..  **.  **
dfe0: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
dff0: 20 6f 66 20 74 68 69 73 20 70 72 61 67 6d 61 20   of this pragma 
e000: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
e010: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
e020: 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6e 6f  file.  ** has no
e030: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  t already been i
e040: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 6e 20 74  nitialized. In t
e050: 68 69 73 20 63 61 73 65 20 69 74 20 73 65 74 73  his case it sets
e060: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a   the default.  *
e070: 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68 61 74 20  * encoding that 
e080: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
e090: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e0a0: 73 65 20 66 69 6c 65 20 69 66 20 61 20 6e 65 77  se file if a new
e0b0: 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 63 72   file.  ** is cr
e0c0: 65 61 74 65 64 2e 20 49 66 20 61 6e 20 65 78 69  eated. If an exi
e0d0: 73 74 69 6e 67 20 6d 61 69 6e 20 64 61 74 61 62  sting main datab
e0e0: 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
e0f0: 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ed, then the.  *
e100: 2a 20 64 65 66 61 75 6c 74 20 74 65 78 74 20 65  * default text e
e110: 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20  ncoding for the 
e120: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
e130: 65 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2a 20  e is used..  ** 
e140: 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73  .  ** In all cas
e150: 65 73 20 6e 65 77 20 64 61 74 61 62 61 73 65 73  es new databases
e160: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
e170: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
e180: 64 20 61 72 65 0a 20 20 2a 2a 20 63 72 65 61 74  d are.  ** creat
e190: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 73 61  ed to use the sa
e1a0: 6d 65 20 64 65 66 61 75 6c 74 20 74 65 78 74 20  me default text 
e1b0: 65 6e 63 6f 64 69 6e 67 20 61 73 20 74 68 65 20  encoding as the 
e1c0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 49  main database. I
e1d0: 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20  f.  ** the main 
e1e0: 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74  database has not
e1f0: 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
e200: 64 20 61 6e 64 2f 6f 72 20 63 72 65 61 74 65 64  d and/or created
e210: 20 77 68 65 6e 20 41 54 54 41 43 48 0a 20 20 2a   when ATTACH.  *
e220: 2a 20 69 73 20 65 78 65 63 75 74 65 64 2c 20 74  * is executed, t
e230: 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
e240: 72 65 20 74 68 65 20 41 54 54 41 43 48 20 6f 70  re the ATTACH op
e250: 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20  eration..  **.  
e260: 2a 2a 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** In the second
e270: 20 66 6f 72 6d 20 74 68 69 73 20 70 72 61 67 6d   form this pragm
e280: 61 20 73 65 74 73 20 74 68 65 20 74 65 78 74 20  a sets the text 
e290: 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65 20 75  encoding to be u
e2a0: 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e 65 77 20  sed in.  ** new 
e2b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63  database files c
e2c0: 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 69  reated using thi
e2d0: 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
e2e0: 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a 20 20  e. It is only.  
e2f0: 2a 2a 20 75 73 65 66 75 6c 20 69 66 20 69 6e 76  ** useful if inv
e300: 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  oked immediately
e310: 20 61 66 74 65 72 20 74 68 65 20 6d 61 69 6e 20   after the main 
e320: 64 61 74 61 62 61 73 65 20 69 0a 20 20 2a 2f 0a  database i.  */.
e330: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 45    case PragTyp_E
e340: 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20 20 20 20 73  NCODING: {.    s
e350: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
e360: 63 74 20 45 6e 63 4e 61 6d 65 20 7b 0a 20 20 20  ct EncName {.   
e370: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
e380: 20 20 20 20 20 20 75 38 20 65 6e 63 3b 0a 20 20        u8 enc;.  
e390: 20 20 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d    } encnames[] =
e3a0: 20 7b 0a 20 20 20 20 20 20 7b 20 22 55 54 46 38   {.      { "UTF8
e3b0: 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  ",     SQLITE_UT
e3c0: 46 38 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  F8        },.   
e3d0: 20 20 20 7b 20 22 55 54 46 2d 38 22 2c 20 20 20     { "UTF-8",   
e3e0: 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20   SQLITE_UTF8    
e3f0: 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20      },  /* Must 
e400: 62 65 20 65 6c 65 6d 65 6e 74 20 5b 31 5d 20 2a  be element [1] *
e410: 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31  /.      { "UTF-1
e420: 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  6le", SQLITE_UTF
e430: 31 36 4c 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20  16LE     },  /* 
e440: 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20  Must be element 
e450: 5b 32 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22  [2] */.      { "
e460: 55 54 46 2d 31 36 62 65 22 2c 20 53 51 4c 49 54  UTF-16be", SQLIT
e470: 45 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c  E_UTF16BE     },
e480: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65    /* Must be ele
e490: 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a 20 20 20 20  ment [3] */.    
e4a0: 20 20 7b 20 22 55 54 46 31 36 6c 65 22 2c 20 20    { "UTF16le",  
e4b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20  SQLITE_UTF16LE  
e4c0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55     },.      { "U
e4d0: 54 46 31 36 62 65 22 2c 20 20 53 51 4c 49 54 45  TF16be",  SQLITE
e4e0: 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c 0a  _UTF16BE     },.
e4f0: 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 22        { "UTF-16"
e500: 2c 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  ,   0           
e510: 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c         }, /* SQL
e520: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
e530: 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31  */.      { "UTF1
e540: 36 22 2c 20 20 20 20 30 20 20 20 20 20 20 20 20  6",    0        
e550: 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20            }, /* 
e560: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
e570: 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 30 2c  VE */.      { 0,
e580: 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0 }.    };.    
e590: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45 6e 63  const struct Enc
e5a0: 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a 20 20 20 20  Name *pEnc;.    
e5b0: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 20 20  if( !zRight ){  
e5c0: 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63    /* "PRAGMA enc
e5d0: 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20 20 20 20  oding" */.      
e5e0: 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53  if( sqlite3ReadS
e5f0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
e600: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
e610: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
e620: 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55  ncnames[SQLITE_U
e630: 54 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45  TF8].enc==SQLITE
e640: 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 61  _UTF8 );.      a
e650: 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b  ssert( encnames[
e660: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 5d 2e  SQLITE_UTF16LE].
e670: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
e680: 36 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  6LE );.      ass
e690: 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51  ert( encnames[SQ
e6a0: 4c 49 54 45 5f 55 54 46 31 36 42 45 5d 2e 65 6e  LITE_UTF16BE].en
e6b0: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c==SQLITE_UTF16B
e6c0: 45 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  E );.      retur
e6d0: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 65  nSingleText(v, e
e6e0: 6e 63 6e 61 6d 65 73 5b 45 4e 43 28 70 50 61 72  ncnames[ENC(pPar
e6f0: 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61 6d 65 29 3b  se->db)].zName);
e700: 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20  .    }else{     
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e     /* "PRAGMA en
e730: 63 6f 64 69 6e 67 20 3d 20 58 58 58 22 20 2a 2f  coding = XXX" */
e740: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 63  .      /* Only c
e750: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
e760: 6f 66 20 73 71 6c 69 74 65 2e 65 6e 63 20 69 66  of sqlite.enc if
e770: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
e780: 6e 64 6c 65 20 69 73 20 6e 6f 74 0a 20 20 20 20  ndle is not.    
e790: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
e7a0: 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61  . If the main da
e7b0: 74 61 62 61 73 65 20 65 78 69 73 74 73 2c 20 74  tabase exists, t
e7c0: 68 65 20 6e 65 77 20 73 71 6c 69 74 65 2e 65 6e  he new sqlite.en
e7d0: 63 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  c value.      **
e7e0: 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69   will be overwri
e7f0: 74 74 65 6e 20 77 68 65 6e 20 74 68 65 20 73 63  tten when the sc
e800: 68 65 6d 61 20 69 73 20 6e 65 78 74 20 6c 6f 61  hema is next loa
e810: 64 65 64 2e 20 49 66 20 69 74 20 64 6f 65 73 20  ded. If it does 
e820: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72  not.      ** alr
e830: 65 61 64 79 20 65 78 69 73 74 73 2c 20 69 74 20  eady exists, it 
e840: 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
e850: 74 6f 20 75 73 65 20 74 68 65 20 6e 65 77 20 65  to use the new e
e860: 6e 63 6f 64 69 6e 67 20 76 61 6c 75 65 2e 0a 20  ncoding value.. 
e870: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
e880: 28 20 0a 20 20 20 20 20 20 20 20 21 28 44 62 48  ( .        !(DbH
e890: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 30  asProperty(db, 0
e8a0: 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
e8b0: 64 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  d)) || .        
e8c0: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
e8d0: 2c 20 30 2c 20 44 42 5f 45 6d 70 74 79 29 20 0a  , 0, DB_Empty) .
e8e0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
e8f0: 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e 63 6e 61   for(pEnc=&encna
e900: 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e 7a 4e  mes[0]; pEnc->zN
e910: 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a 20 20  ame; pEnc++){.  
e920: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
e930: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52  qlite3StrICmp(zR
e940: 69 67 68 74 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d  ight, pEnc->zNam
e950: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
e960: 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29    SCHEMA_ENC(db)
e970: 20 3d 20 45 4e 43 28 64 62 29 20 3d 0a 20 20 20   = ENC(db) =.   
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 6e               pEn
e990: 63 2d 3e 65 6e 63 20 3f 20 70 45 6e 63 2d 3e 65  c->enc ? pEnc->e
e9a0: 6e 63 20 3a 20 53 51 4c 49 54 45 5f 55 54 46 31  nc : SQLITE_UTF1
e9b0: 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 20 20 20  6NATIVE;.       
e9c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e9d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e9e0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  }.        if( !p
e9f0: 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  Enc->zName ){.  
ea00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ea10: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ea20: 22 75 6e 73 75 70 70 6f 72 74 65 64 20 65 6e 63  "unsupported enc
ea30: 6f 64 69 6e 67 3a 20 25 73 22 2c 20 7a 52 69 67  oding: %s", zRig
ea40: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ht);.        }. 
ea50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ea60: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
ea70: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
ea80: 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65  UTF16 */..#ifnde
ea90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  f SQLITE_OMIT_SC
eaa0: 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41  HEMA_VERSION_PRA
eab0: 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  GMAS.  /*.  **  
eac0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
ead0: 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 0a  ]schema_version.
eae0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
eaf0: 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65  chema.]schema_ve
eb00: 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72  rsion = <integer
eb10: 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52  >.  **.  **   PR
eb20: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73  AGMA [schema.]us
eb30: 65 72 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20  er_version.  ** 
eb40: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
eb50: 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 20 3d  .]user_version =
eb60: 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a   <integer>.  **.
eb70: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
eb80: 63 68 65 6d 61 2e 5d 66 72 65 65 6c 69 73 74 5f  chema.]freelist_
eb90: 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  count.  **.  ** 
eba0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
ebb0: 2e 5d 64 61 74 61 5f 76 65 72 73 69 6f 6e 0a 20  .]data_version. 
ebc0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
ebd0: 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69  A [schema.]appli
ebe0: 63 61 74 69 6f 6e 5f 69 64 0a 20 20 2a 2a 20 20  cation_id.  **  
ebf0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
ec00: 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 20  ]application_id 
ec10: 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a  = <integer>.  **
ec20: 0a 20 20 2a 2a 20 54 68 65 20 70 72 61 67 6d 61  .  ** The pragma
ec30: 27 73 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  's schema_versio
ec40: 6e 20 61 6e 64 20 75 73 65 72 5f 76 65 72 73 69  n and user_versi
ec50: 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  on are used to s
ec60: 65 74 20 6f 72 20 67 65 74 0a 20 20 2a 2a 20 74  et or get.  ** t
ec70: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
ec80: 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61  schema-version a
ec90: 6e 64 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 2c  nd user-version,
eca0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 42   respectively. B
ecb0: 6f 74 68 0a 20 20 2a 2a 20 74 68 65 20 73 63 68  oth.  ** the sch
ecc0: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20  ema-version and 
ecd0: 74 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e  the user-version
ece0: 20 61 72 65 20 33 32 2d 62 69 74 20 73 69 67 6e   are 32-bit sign
ecf0: 65 64 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a  ed integers.  **
ed00: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
ed10: 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 0a  atabase header..
ed20: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 63    **.  ** The sc
ed30: 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 69 73 20 75  hema-cookie is u
ed40: 73 75 61 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69  sually only mani
ed50: 70 75 6c 61 74 65 64 20 69 6e 74 65 72 6e 61 6c  pulated internal
ed60: 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74  ly by SQLite. It
ed70: 0a 20 20 2a 2a 20 69 73 20 69 6e 63 72 65 6d 65  .  ** is increme
ed80: 6e 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  nted by SQLite w
ed90: 68 65 6e 65 76 65 72 20 74 68 65 20 64 61 74 61  henever the data
eda0: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6d  base schema is m
edb0: 6f 64 69 66 69 65 64 20 28 62 79 0a 20 20 2a 2a  odified (by.  **
edc0: 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 72 6f   creating or dro
edd0: 70 70 69 6e 67 20 61 20 74 61 62 6c 65 20 6f 72  pping a table or
ede0: 20 69 6e 64 65 78 29 2e 20 54 68 65 20 73 63 68   index). The sch
edf0: 65 6d 61 20 76 65 72 73 69 6f 6e 20 69 73 20 75  ema version is u
ee00: 73 65 64 20 62 79 0a 20 20 2a 2a 20 53 51 4c 69  sed by.  ** SQLi
ee10: 74 65 20 65 61 63 68 20 74 69 6d 65 20 61 20 71  te each time a q
ee20: 75 65 72 79 20 69 73 20 65 78 65 63 75 74 65 64  uery is executed
ee30: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
ee40: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
ee50: 68 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  he.  ** of the s
ee60: 63 68 65 6d 61 20 75 73 65 64 20 77 68 65 6e 20  chema used when 
ee70: 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51  compiling the SQ
ee80: 4c 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 20  L query matches 
ee90: 74 68 65 20 73 63 68 65 6d 61 20 6f 66 0a 20 20  the schema of.  
eea0: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
eeb0: 61 67 61 69 6e 73 74 20 77 68 69 63 68 20 74 68  against which th
eec0: 65 20 63 6f 6d 70 69 6c 65 64 20 71 75 65 72 79  e compiled query
eed0: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 65 78 65   is actually exe
eee0: 63 75 74 65 64 2e 0a 20 20 2a 2a 20 53 75 62 76  cuted..  ** Subv
eef0: 65 72 74 69 6e 67 20 74 68 69 73 20 6d 65 63 68  erting this mech
ef00: 61 6e 69 73 6d 20 62 79 20 75 73 69 6e 67 20 22  anism by using "
ef10: 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65  PRAGMA schema_ve
ef20: 72 73 69 6f 6e 22 20 74 6f 20 6d 6f 64 69 66 79  rsion" to modify
ef30: 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
ef40: 2d 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 74 65  -version is pote
ef50: 6e 74 69 61 6c 6c 79 20 64 61 6e 67 65 72 6f 75  ntially dangerou
ef60: 73 20 61 6e 64 20 6d 61 79 20 6c 65 61 64 20 74  s and may lead t
ef70: 6f 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 63  o program.  ** c
ef80: 72 61 73 68 65 73 20 6f 72 20 64 61 74 61 62 61  rashes or databa
ef90: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 55  se corruption. U
efa0: 73 65 20 77 69 74 68 20 63 61 75 74 69 6f 6e 21  se with caution!
efb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 75  .  **.  ** The u
efc0: 73 65 72 2d 76 65 72 73 69 6f 6e 20 69 73 20 6e  ser-version is n
efd0: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
efe0: 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74  ly by SQLite. It
eff0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 62 79 0a   may be used by.
f000: 20 20 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e    ** application
f010: 73 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73  s for any purpos
f020: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  e..  */.  case P
f030: 72 61 67 54 79 70 5f 48 45 41 44 45 52 5f 56 41  ragTyp_HEADER_VA
f040: 4c 55 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  LUE: {.    int i
f050: 43 6f 6f 6b 69 65 20 3d 20 70 50 72 61 67 6d 61  Cookie = pPragma
f060: 2d 3e 69 41 72 67 3b 20 20 2f 2a 20 57 68 69 63  ->iArg;  /* Whic
f070: 68 20 63 6f 6f 6b 69 65 20 74 6f 20 72 65 61 64  h cookie to read
f080: 20 6f 72 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   or write */.   
f090: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
f0a0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
f0b0: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 26 26     if( zRight &&
f0c0: 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67   (pPragma->mPrag
f0d0: 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65  Flg & PragFlg_Re
f0e0: 61 64 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a 20 20  adOnly)==0 ){.  
f0f0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
f100: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f 6b 69   specified cooki
f110: 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20  e value */.     
f120: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
f130: 62 65 4f 70 4c 69 73 74 20 73 65 74 43 6f 6f 6b  beOpList setCook
f140: 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ie[] = {.       
f150: 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f   { OP_Transactio
f160: 6e 2c 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d  n,    0,  1,  0}
f170: 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20  ,    /* 0 */.   
f180: 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f       { OP_SetCoo
f190: 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 30 2c  kie,      0,  0,
f1a0: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f    0},    /* 1 */
f1b0: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
f1c0: 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20  VdbeOp *aOp;.   
f1d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
f1e0: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
f1f0: 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a  ired(v, ArraySiz
f200: 65 28 73 65 74 43 6f 6f 6b 69 65 29 29 3b 0a 20  e(setCookie));. 
f210: 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74       aOp = sqlit
f220: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
f230: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65 74  v, ArraySize(set
f240: 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43 6f 6f 6b  Cookie), setCook
f250: 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ie, 0);.      if
f260: 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f  ( ONLY_IF_REALLO
f270: 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29  C_STRESS(aOp==0)
f280: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
f290: 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[0].p1 = iDb;
f2a0: 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31  .      aOp[1].p1
f2b0: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
f2c0: 70 5b 31 5d 2e 70 32 20 3d 20 69 43 6f 6f 6b 69  p[1].p2 = iCooki
f2d0: 65 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e  e;.      aOp[1].
f2e0: 70 33 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69  p3 = sqlite3Atoi
f2f0: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 65  (zRight);.    }e
f300: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  lse{.      /* Re
f310: 61 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ad the specified
f320: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f   cookie value */
f330: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
f340: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 72  nst VdbeOpList r
f350: 65 61 64 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a  eadCookie[] = {.
f360: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61          { OP_Tra
f370: 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 30 2c  nsaction,     0,
f380: 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20    0,  0},    /* 
f390: 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  0 */.        { O
f3a0: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 20  P_ReadCookie,   
f3b0: 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20     0,  1,  0},  
f3c0: 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20    /* 1 */.      
f3d0: 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77    { OP_ResultRow
f3e0: 2c 20 20 20 20 20 20 20 31 2c 20 20 31 2c 20 20  ,       1,  1,  
f3f0: 30 7d 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  0}.      };.    
f400: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
f410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f420: 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65  VerifyNoMallocRe
f430: 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79 53  quired(v, ArrayS
f440: 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 29  ize(readCookie))
f450: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
f460: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
f470: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
f480: 72 65 61 64 43 6f 6f 6b 69 65 29 2c 72 65 61 64  readCookie),read
f490: 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20 20 20 20 20  Cookie,0);.     
f4a0: 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41   if( ONLY_IF_REA
f4b0: 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d  LLOC_STRESS(aOp=
f4c0: 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
f4d0: 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69     aOp[0].p1 = i
f4e0: 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  Db;.      aOp[1]
f4f0: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
f500: 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 69 43 6f   aOp[1].p3 = iCo
f510: 6f 6b 69 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  okie;.      sqli
f520: 74 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28  te3VdbeReusable(
f530: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  v);.    }.  }.  
f540: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
f550: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
f560: 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47  EMA_VERSION_PRAG
f570: 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  MAS */..#ifndef 
f580: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
f590: 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a  ILEOPTION_DIAGS.
f5a0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
f5b0: 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f 70 74 69 6f  MA compile_optio
f5c0: 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  ns.  **.  ** Ret
f5d0: 75 72 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  urn the names of
f5e0: 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   all compile-tim
f5f0: 65 20 6f 70 74 69 6f 6e 73 20 75 73 65 64 20 69  e options used i
f600: 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 0a 20 20  n this build,.  
f610: 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f 6e 20 70 65  ** one option pe
f620: 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61  r row..  */.  ca
f630: 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4d 50 49  se PragTyp_COMPI
f640: 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20 7b 0a 20 20  LE_OPTIONS: {.  
f650: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
f660: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
f670: 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  t;.    pParse->n
f680: 4d 65 6d 20 3d 20 31 3b 0a 20 20 20 20 77 68 69  Mem = 1;.    whi
f690: 6c 65 28 20 28 7a 4f 70 74 20 3d 20 73 71 6c 69  le( (zOpt = sqli
f6a0: 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  te3_compileoptio
f6b0: 6e 5f 67 65 74 28 69 2b 2b 29 29 21 3d 30 20 29  n_get(i++))!=0 )
f6c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
f6d0: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
f6e0: 20 31 2c 20 7a 4f 70 74 29 3b 0a 20 20 20 20 20   1, zOpt);.     
f6f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f700: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
f710: 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ow, 1, 1);.    }
f720: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f730: 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20 20 7d  Reusable(v);.  }
f740: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
f750: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f760: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
f770: 41 47 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  AGS */..#ifndef 
f780: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
f790: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
f7a0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 77 61 6c 5f  MA [schema.]wal_
f7b0: 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 70 61 73  checkpoint = pas
f7c0: 73 69 76 65 7c 66 75 6c 6c 7c 72 65 73 74 61 72  sive|full|restar
f7d0: 74 7c 74 72 75 6e 63 61 74 65 0a 20 20 2a 2a 0a  t|truncate.  **.
f7e0: 20 20 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20    ** Checkpoint 
f7f0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
f800: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
f810: 70 5f 57 41 4c 5f 43 48 45 43 4b 50 4f 49 4e 54  p_WAL_CHECKPOINT
f820: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 42 74 20  : {.    int iBt 
f830: 3d 20 28 70 49 64 32 2d 3e 7a 3f 69 44 62 3a 53  = (pId2->z?iDb:S
f840: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
f850: 45 44 29 3b 0a 20 20 20 20 69 6e 74 20 65 4d 6f  ED);.    int eMo
f860: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
f870: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3b 0a  KPOINT_PASSIVE;.
f880: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
f890: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
f8a0: 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68  te3StrICmp(zRigh
f8b0: 74 2c 20 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b  t, "full")==0 ){
f8c0: 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
f8d0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
f8e0: 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  NT_FULL;.      }
f8f0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
f900: 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  StrICmp(zRight, 
f910: 22 72 65 73 74 61 72 74 22 29 3d 3d 30 20 29 7b  "restart")==0 ){
f920: 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
f930: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
f940: 4e 54 5f 52 45 53 54 41 52 54 3b 0a 20 20 20 20  NT_RESTART;.    
f950: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
f960: 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68  te3StrICmp(zRigh
f970: 74 2c 20 22 74 72 75 6e 63 61 74 65 22 29 3d 3d  t, "truncate")==
f980: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
f990: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
f9a0: 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 3b  KPOINT_TRUNCATE;
f9b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f9c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
f9d0: 3d 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 3;.    sqlite3
f9e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f9f0: 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 42 74  _Checkpoint, iBt
fa00: 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a 20 20 20  , eMode, 1);.   
fa10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa20: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
fa30: 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 7d 0a 20  ow, 1, 3);.  }. 
fa40: 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a 0a 20 20   break;..  /*.  
fa50: 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  **   PRAGMA wal_
fa60: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 0a 20  autocheckpoint. 
fa70: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c   **   PRAGMA wal
fa80: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20  _autocheckpoint 
fa90: 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  = N.  **.  ** Co
faa0: 6e 66 69 67 75 72 65 20 61 20 64 61 74 61 62 61  nfigure a databa
fab0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
fac0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
fad0: 68 65 63 6b 70 6f 69 6e 74 20 61 20 64 61 74 61  heckpoint a data
fae0: 62 61 73 65 0a 20 20 2a 2a 20 61 66 74 65 72 20  base.  ** after 
faf0: 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 4e 20 66  accumulating N f
fb00: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
fb10: 2e 20 4f 72 20 71 75 65 72 79 20 66 6f 72 20 74  . Or query for t
fb20: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
fb30: 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20 20 2a 2f  .  ** of N..  */
fb40: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
fb50: 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49  WAL_AUTOCHECKPOI
fb60: 4e 54 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  NT: {.    if( zR
fb70: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
fb80: 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
fb90: 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 73 71 6c  eckpoint(db, sql
fba0: 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29  ite3Atoi(zRight)
fbb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
fbc0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
fbd0: 0a 20 20 20 20 20 20 20 64 62 2d 3e 78 57 61 6c  .       db->xWal
fbe0: 43 61 6c 6c 62 61 63 6b 3d 3d 73 71 6c 69 74 65  Callback==sqlite
fbf0: 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 20  3WalDefaultHook 
fc00: 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 53 51  ? .           SQ
fc10: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
fc20: 64 62 2d 3e 70 57 61 6c 41 72 67 29 20 3a 20 30  db->pWalArg) : 0
fc30: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
fc40: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
fc50: 2a 20 20 50 52 41 47 4d 41 20 73 68 72 69 6e 6b  *  PRAGMA shrink
fc60: 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a 0a 20 20 2a  _memory.  **.  *
fc70: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
fc80: 2d 4f 46 3a 20 52 2d 32 33 34 34 35 2d 34 36 31  -OF: R-23445-461
fc90: 30 39 20 54 68 69 73 20 70 72 61 67 6d 61 20 63  09 This pragma c
fca0: 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
fcb0: 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69  se.  ** connecti
fcc0: 6f 6e 20 6f 6e 20 77 68 69 63 68 20 69 74 20 69  on on which it i
fcd0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 66 72 65  s invoked to fre
fce0: 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d  e up as much mem
fcf0: 6f 72 79 20 61 73 20 69 74 0a 20 20 2a 2a 20 63  ory as it.  ** c
fd00: 61 6e 2c 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  an, by calling s
fd10: 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73  qlite3_db_releas
fd20: 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 20 20 2a 2f  e_memory()..  */
fd30: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
fd40: 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52 59 3a 20 7b  SHRINK_MEMORY: {
fd50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
fd60: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64  release_memory(d
fd70: 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  b);.    break;. 
fd80: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
fd90: 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a 65 0a 20  RAGMA optimize. 
fda0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70 74 69   **  PRAGMA opti
fdb0: 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20 2a 2a 20  mize(MASK).  ** 
fdc0: 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61 2e 6f   PRAGMA schema.o
fdd0: 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20 20 50 52  ptimize.  **  PR
fde0: 41 47 4d 41 20 73 63 68 65 6d 61 2e 6f 70 74 69  AGMA schema.opti
fdf0: 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20 2a 2a 0a  mize(MASK).  **.
fe00: 20 20 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    ** Attempt to 
fe10: 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 64 61 74  optimize the dat
fe20: 61 62 61 73 65 2e 20 20 41 6c 6c 20 73 63 68 65  abase.  All sche
fe30: 6d 61 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  mas are optimize
fe40: 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 0a 20  d in the first. 
fe50: 20 2a 2a 20 74 77 6f 20 66 6f 72 6d 73 2c 20 61   ** two forms, a
fe60: 6e 64 20 6f 6e 6c 79 20 74 68 65 20 73 70 65 63  nd only the spec
fe70: 69 66 69 65 64 20 73 63 68 65 6d 61 20 69 73 20  ified schema is 
fe80: 6f 70 74 69 6d 69 7a 65 64 20 69 6e 20 74 68 65  optimized in the
fe90: 20 6c 61 74 74 65 72 20 74 77 6f 2e 0a 20 20 2a   latter two..  *
fea0: 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 74 61 69  *.  ** The detai
feb0: 6c 73 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69  ls of optimizati
fec0: 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79  ons performed by
fed0: 20 74 68 69 73 20 70 72 61 67 6d 61 20 61 72 65   this pragma are
fee0: 20 65 78 70 65 63 74 65 64 0a 20 20 2a 2a 20 74   expected.  ** t
fef0: 6f 20 63 68 61 6e 67 65 20 61 6e 64 20 69 6d 70  o change and imp
ff00: 72 6f 76 65 20 6f 76 65 72 20 74 69 6d 65 2e 20  rove over time. 
ff10: 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 73 68   Applications sh
ff20: 6f 75 6c 64 20 61 6e 74 69 63 69 70 61 74 65 20  ould anticipate 
ff30: 74 68 61 74 0a 20 20 2a 2a 20 74 68 69 73 20 70  that.  ** this p
ff40: 72 61 67 6d 61 20 77 69 6c 6c 20 70 65 72 66 6f  ragma will perfo
ff50: 72 6d 20 6e 65 77 20 6f 70 74 69 6d 69 7a 61 74  rm new optimizat
ff60: 69 6f 6e 73 20 69 6e 20 66 75 74 75 72 65 20 72  ions in future r
ff70: 65 6c 65 61 73 65 73 2e 0a 20 20 2a 2a 0a 20 20  eleases..  **.  
ff80: 2a 2a 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 20  ** The optional 
ff90: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 62 69  argument is a bi
ffa0: 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a  tmask of optimiz
ffb0: 61 74 69 6f 6e 73 20 74 6f 20 70 65 72 66 6f 72  ations to perfor
ffc0: 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
ffd0: 30 78 30 30 30 31 20 20 20 20 44 65 62 75 67 67  0x0001    Debugg
ffe0: 69 6e 67 20 6d 6f 64 65 2e 20 20 44 6f 20 6e 6f  ing mode.  Do no
fff0: 74 20 61 63 74 75 61 6c 6c 79 20 70 65 72 66 6f  t actually perfo
10000 72 6d 20 61 6e 79 20 6f 70 74 69 6d 69 7a 61 74  rm any optimizat
10010 69 6f 6e 73 0a 20 20 2a 2a 20 20 20 20 20 20 20  ions.  **       
10020 20 20 20 20 20 20 20 62 75 74 20 69 6e 73 74 65         but inste
10030 61 64 20 72 65 74 75 72 6e 20 6f 6e 65 20 6c 69  ad return one li
10040 6e 65 20 6f 66 20 74 65 78 74 20 66 6f 72 20 65  ne of text for e
10050 61 63 68 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ach optimization
10060 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
10070 20 20 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61     that would ha
10080 76 65 20 62 65 65 6e 20 64 6f 6e 65 2e 20 20 4f  ve been done.  O
10090 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 20  ff by default.. 
100a0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30   **.  **    0x00
100b0 30 32 20 20 20 20 52 75 6e 20 41 4e 41 4c 59 5a  02    Run ANALYZ
100c0 45 20 6f 6e 20 74 61 62 6c 65 73 20 74 68 61 74  E on tables that
100d0 20 6d 69 67 68 74 20 62 65 6e 65 66 69 74 2e 20   might benefit. 
100e0 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 2e 0a   On by default..
100f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
10100 20 20 53 65 65 20 62 65 6c 6f 77 20 66 6f 72 20    See below for 
10110 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
10120 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  mation..  **.  *
10130 2a 20 20 20 20 30 78 30 30 30 34 20 20 20 20 28  *    0x0004    (
10140 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d 65 6e  Not yet implemen
10150 74 65 64 29 20 52 65 63 6f 72 64 20 75 73 61 67  ted) Record usag
10160 65 20 61 6e 64 20 70 65 72 66 6f 72 6d 61 6e 63  e and performanc
10170 65 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  e .  **         
10180 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e       information
10190 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
101a0 74 20 73 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  t session in the
101b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
101c0 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
101d0 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
101e0 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   be available to
101f0 20 22 6f 70 74 69 6d 69 7a 65 22 0a 20 20 2a 2a   "optimize".  **
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
10210 61 67 6d 61 73 20 72 75 6e 20 62 79 20 66 75 74  agmas run by fut
10220 75 72 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ure database con
10230 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20  nections..  **. 
10240 20 2a 2a 20 20 20 20 30 78 30 30 30 38 20 20 20   **    0x0008   
10250 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d   (Not yet implem
10260 65 6e 74 65 64 29 20 43 72 65 61 74 65 20 69 6e  ented) Create in
10270 64 65 78 65 73 20 74 68 61 74 20 6d 69 67 68 74  dexes that might
10280 20 68 61 76 65 0a 20 20 2a 2a 20 20 20 20 20 20   have.  **      
10290 20 20 20 20 20 20 20 20 62 65 65 6e 20 68 65 6c          been hel
102a0 70 66 75 6c 20 74 6f 20 72 65 63 65 6e 74 20 71  pful to recent q
102b0 75 65 72 69 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a  ueries.  **.  **
102c0 20 54 68 65 20 64 65 66 61 75 6c 74 20 4d 41 53   The default MAS
102d0 4b 20 69 73 20 61 6e 64 20 61 6c 77 61 79 73 20  K is and always 
102e0 73 68 61 6c 6c 20 62 65 20 30 78 66 66 66 65 2e  shall be 0xfffe.
102f0 20 20 30 78 66 66 66 65 20 6d 65 61 6e 73 20 70    0xfffe means p
10300 65 72 66 6f 72 6d 20 61 6c 6c 0a 20 20 2a 2a 20  erform all.  ** 
10310 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  of the optimizat
10320 69 6f 6e 73 20 6c 69 73 74 65 64 20 61 62 6f 76  ions listed abov
10330 65 20 65 78 63 65 70 74 20 44 65 62 75 67 20 4d  e except Debug M
10340 6f 64 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6e  ode, including n
10350 65 77 0a 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61  ew.  ** optimiza
10360 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  tions that have 
10370 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e 76  not yet been inv
10380 65 6e 74 65 64 2e 20 20 49 66 20 6e 65 77 20 6f  ented.  If new o
10390 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61 72 65  ptimizations are
103a0 0a 20 20 2a 2a 20 65 76 65 72 20 61 64 64 65 64  .  ** ever added
103b0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
103c0 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2c 20  off by default, 
103d0 74 68 6f 73 65 20 6f 66 66 2d 62 79 2d 64 65 66  those off-by-def
103e0 61 75 6c 74 20 0a 20 20 2a 2a 20 6f 70 74 69 6d  ault .  ** optim
103f0 69 7a 61 74 69 6f 6e 73 20 77 69 6c 6c 20 68 61  izations will ha
10400 76 65 20 62 69 74 6d 61 73 6b 73 20 6f 66 20 30  ve bitmasks of 0
10410 78 31 30 30 30 30 20 6f 72 20 6c 61 72 67 65 72  x10000 or larger
10420 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 45 54 45  ..  **.  ** DETE
10430 52 4d 49 4e 41 54 49 4f 4e 20 4f 46 20 57 48 45  RMINATION OF WHE
10440 4e 20 54 4f 20 52 55 4e 20 41 4e 41 4c 59 5a 45  N TO RUN ANALYZE
10450 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68  .  **.  ** In th
10460 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
10470 65 6e 74 61 74 69 6f 6e 2c 20 61 20 74 61 62 6c  entation, a tabl
10480 65 20 69 73 20 61 6e 61 6c 79 7a 65 64 20 69 66  e is analyzed if
10490 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 6f 66 0a   only if all of.
104a0 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
104b0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a  ng are true:.  *
104c0 2a 0a 20 20 2a 2a 20 28 31 29 20 4d 41 53 4b 20  *.  ** (1) MASK 
104d0 62 69 74 20 30 78 30 32 20 69 73 20 73 65 74 2e  bit 0x02 is set.
104e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 32 29 20 54  .  **.  ** (2) T
104f0 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
10500 20 75 73 65 64 20 73 71 6c 69 74 65 5f 73 74 61   used sqlite_sta
10510 74 31 2d 73 74 79 6c 65 20 73 74 61 74 69 73 74  t1-style statist
10520 69 63 73 20 66 6f 72 20 6f 6e 65 20 6f 72 0a 20  ics for one or. 
10530 20 2a 2a 20 20 20 20 20 6d 6f 72 65 20 69 6e 64   **     more ind
10540 65 78 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  exes of the tabl
10550 65 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  e at some point 
10560 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65 74  during the lifet
10570 69 6d 65 20 6f 66 0a 20 20 2a 2a 20 20 20 20 20  ime of.  **     
10580 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e  the current conn
10590 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  ection..  **.  *
105a0 2a 20 28 33 29 20 4f 6e 65 20 6f 72 20 6d 6f 72  * (3) One or mor
105b0 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 68 65  e indexes of the
105c0 20 74 61 62 6c 65 20 61 72 65 20 63 75 72 72 65   table are curre
105d0 6e 74 6c 79 20 75 6e 61 6e 61 6c 79 7a 65 64 20  ntly unanalyzed 
105e0 4f 52 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20  OR.  **     the 
105f0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
10600 6e 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  n the table has 
10610 69 6e 63 72 65 61 73 65 64 20 62 79 20 32 35 20  increased by 25 
10620 74 69 6d 65 73 20 6f 72 20 6d 6f 72 65 0a 20 20  times or more.  
10630 2a 2a 20 20 20 20 20 73 69 6e 63 65 20 74 68 65  **     since the
10640 20 6c 61 73 74 20 74 69 6d 65 20 41 4e 41 4c 59   last time ANALY
10650 5a 45 20 77 61 73 20 72 75 6e 2e 0a 20 20 2a 2a  ZE was run..  **
10660 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 73 20  .  ** The rules 
10670 66 6f 72 20 77 68 65 6e 20 74 61 62 6c 65 73 20  for when tables 
10680 61 72 65 20 61 6e 61 6c 79 7a 65 64 20 61 72 65  are analyzed are
10690 20 6c 69 6b 65 6c 79 20 74 6f 20 63 68 61 6e 67   likely to chang
106a0 65 20 69 6e 0a 20 20 2a 2a 20 66 75 74 75 72 65  e in.  ** future
106b0 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a 2f 0a   releases..  */.
106c0 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4f    case PragTyp_O
106d0 50 54 49 4d 49 5a 45 3a 20 7b 0a 20 20 20 20 69  PTIMIZE: {.    i
106e0 6e 74 20 69 44 62 4c 61 73 74 3b 20 20 20 20 20  nt iDbLast;     
106f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 65        /* Loop te
10700 72 6d 69 6e 61 74 69 6f 6e 20 70 6f 69 6e 74 20  rmination point 
10710 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 6c  for the schema l
10720 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  oop */.    int i
10730 54 61 62 43 75 72 3b 20 20 20 20 20 20 20 20 20  TabCur;         
10740 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20    /* Cursor for 
10750 61 20 74 61 62 6c 65 20 77 68 6f 73 65 20 73 69  a table whose si
10760 7a 65 20 6e 65 65 64 73 20 63 68 65 63 6b 69 6e  ze needs checkin
10770 67 20 2a 2f 0a 20 20 20 20 48 61 73 68 45 6c 65  g */.    HashEle
10780 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20  m *k;           
10790 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 61 62  /* Loop over tab
107a0 6c 65 73 20 6f 66 20 61 20 73 63 68 65 6d 61 20  les of a schema 
107b0 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
107c0 53 63 68 65 6d 61 3b 20 20 20 20 20 20 20 2f 2a  Schema;       /*
107d0 20 54 68 65 20 63 75 72 72 65 6e 74 20 73 63 68   The current sch
107e0 65 6d 61 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ema */.    Table
107f0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
10800 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
10810 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  the schema */.  
10820 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
10830 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
10840 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
10850 65 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20  e */.    LogEst 
10860 73 7a 54 68 72 65 73 68 6f 6c 64 3b 20 20 20 20  szThreshold;    
10870 2f 2a 20 53 69 7a 65 20 74 68 72 65 73 68 6f 6c  /* Size threshol
10880 64 20 61 62 6f 76 65 20 77 68 69 63 68 20 72 65  d above which re
10890 61 6e 61 6c 79 73 69 73 20 69 73 20 6e 65 65 64  analysis is need
108a0 64 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  d */.    char *z
108b0 53 75 62 53 71 6c 3b 20 20 20 20 20 20 20 20 20  SubSql;         
108c0 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  /* SQL statement
108d0 20 66 6f 72 20 74 68 65 20 4f 50 5f 53 71 6c 45   for the OP_SqlE
108e0 78 65 63 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  xec opcode */.  
108f0 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20 20 20    u32 opMask;   
10900 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
10910 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
10920 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 0a 20 20  o perform */..  
10930 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
10940 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 28        opMask = (
10950 75 33 32 29 73 71 6c 69 74 65 33 41 74 6f 69 28  u32)sqlite3Atoi(
10960 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69  zRight);.      i
10970 66 28 20 28 6f 70 4d 61 73 6b 20 26 20 30 78 30  f( (opMask & 0x0
10980 32 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  2)==0 ) break;. 
10990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
109a0 6f 70 4d 61 73 6b 20 3d 20 30 78 66 66 66 65 3b  opMask = 0xfffe;
109b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62 43  .    }.    iTabC
109c0 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
109d0 62 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 69 44 62  b++;.    for(iDb
109e0 4c 61 73 74 20 3d 20 7a 44 62 3f 69 44 62 3a 64  Last = zDb?iDb:d
109f0 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3c 3d 69  b->nDb-1; iDb<=i
10a00 44 62 4c 61 73 74 3b 20 69 44 62 2b 2b 29 7b 0a  DbLast; iDb++){.
10a10 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
10a20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10a30 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
10a40 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
10a50 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 70  e, iDb);.      p
10a60 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
10a70 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
10a80 20 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74       for(k=sqlit
10a90 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
10aa0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b  ema->tblHash); k
10ab0 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; k=sqliteHashNe
10ac0 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(k)){.        
10ad0 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
10ae0 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
10af0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;..        /* If
10b00 20 74 61 62 6c 65 20 70 54 61 62 20 68 61 73 20   table pTab has 
10b10 6e 6f 74 20 62 65 65 6e 20 75 73 65 64 20 69 6e  not been used in
10b20 20 61 20 77 61 79 20 74 68 61 74 20 77 6f 75 6c   a way that woul
10b30 64 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 0a 20  d benefit from. 
10b40 20 20 20 20 20 20 20 2a 2a 20 68 61 76 69 6e 67         ** having
10b50 20 61 6e 61 6c 79 73 69 73 20 73 74 61 74 69 73   analysis statis
10b60 74 69 63 73 20 64 75 72 69 6e 67 20 74 68 65 20  tics during the 
10b70 63 75 72 72 65 6e 74 20 73 65 73 73 69 6f 6e 2c  current session,
10b80 20 74 68 65 6e 20 73 6b 69 70 20 69 74 2e 0a 20   then skip it.. 
10b90 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61         ** This a
10ba0 6c 73 6f 20 68 61 73 20 74 68 65 20 65 66 66 65  lso has the effe
10bb0 63 74 20 6f 66 20 73 6b 69 70 70 69 6e 67 20 76  ct of skipping v
10bc0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 61 6e  irtual tables an
10bd0 64 20 76 69 65 77 73 20 2a 2f 0a 20 20 20 20 20  d views */.     
10be0 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
10bf0 62 46 6c 61 67 73 20 26 20 54 46 5f 53 74 61 74  bFlags & TF_Stat
10c00 73 55 73 65 64 29 3d 3d 30 20 29 20 63 6f 6e 74  sUsed)==0 ) cont
10c10 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f  inue;..        /
10c20 2a 20 52 65 61 6e 61 6c 79 7a 65 20 69 66 20 74  * Reanalyze if t
10c30 68 65 20 74 61 62 6c 65 20 69 73 20 32 35 20 74  he table is 25 t
10c40 69 6d 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e  imes larger than
10c50 20 74 68 65 20 6c 61 73 74 20 61 6e 61 6c 79 73   the last analys
10c60 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 7a  is */.        sz
10c70 54 68 72 65 73 68 6f 6c 64 20 3d 20 70 54 61 62  Threshold = pTab
10c80 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 2b 20 34  ->nRowLogEst + 4
10c90 36 3b 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  6; assert( sqlit
10ca0 65 33 4c 6f 67 45 73 74 28 32 35 29 3d 3d 34 36  e3LogEst(25)==46
10cb0 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
10cc0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
10cd0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
10ce0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
10cf0 20 20 20 20 20 20 69 66 28 20 21 70 49 64 78 2d        if( !pIdx-
10d00 3e 68 61 73 53 74 61 74 31 20 29 7b 0a 20 20 20  >hasStat1 ){.   
10d10 20 20 20 20 20 20 20 20 20 73 7a 54 68 72 65 73           szThres
10d20 68 6f 6c 64 20 3d 20 30 3b 20 2f 2a 20 41 6c 77  hold = 0; /* Alw
10d30 61 79 73 20 61 6e 61 6c 79 7a 65 20 69 66 20 61  ays analyze if a
10d40 6e 79 20 69 6e 64 65 78 20 6c 61 63 6b 73 20 73  ny index lacks s
10d50 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 20  tatistics */.   
10d60 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
10d70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10d80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
10d90 28 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 29 7b  ( szThreshold ){
10da0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10db0 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
10dc0 73 65 2c 20 69 54 61 62 43 75 72 2c 20 69 44 62  se, iTabCur, iDb
10dd0 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
10de0 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ead);.          
10df0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10e00 33 28 76 2c 20 4f 50 5f 49 66 53 6d 61 6c 6c 65  3(v, OP_IfSmalle
10e10 72 2c 20 69 54 61 62 43 75 72 2c 20 0a 20 20 20  r, iTabCur, .   
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10e40 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
10e50 32 2b 28 6f 70 4d 61 73 6b 26 31 29 2c 20 73 7a  2+(opMask&1), sz
10e60 54 68 72 65 73 68 6f 6c 64 29 3b 0a 20 20 20 20  Threshold);.    
10e70 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
10e80 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d  ge(v);.        }
10e90 0a 20 20 20 20 20 20 20 20 7a 53 75 62 53 71 6c  .        zSubSql
10ea0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
10eb0 66 28 64 62 2c 20 22 41 4e 41 4c 59 5a 45 20 5c  f(db, "ANALYZE \
10ec0 22 25 77 5c 22 2e 5c 22 25 77 5c 22 22 2c 0a 20  "%w\".\"%w\"",. 
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ef0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
10f00 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  SName, pTab->zNa
10f10 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
10f20 20 6f 70 4d 61 73 6b 20 26 20 30 78 30 31 20 29   opMask & 0x01 )
10f30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
10f40 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
10f50 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
10f60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10f70 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
10f80 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 31  P_String8, 0, r1
10f90 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20 50 34  , 0, zSubSql, P4
10fa0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
10fb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10fc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
10fd0 75 6c 74 52 6f 77 2c 20 72 31 2c 20 31 29 3b 0a  ultRow, r1, 1);.
10fe0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
10ff0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11000 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
11010 5f 53 71 6c 45 78 65 63 2c 20 30 2c 20 30 2c 20  _SqlExec, 0, 0, 
11020 30 2c 20 7a 53 75 62 53 71 6c 2c 20 50 34 5f 44  0, zSubSql, P4_D
11030 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
11040 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11050 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11060 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70  AddOp0(v, OP_Exp
11070 69 72 65 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ire);.    break;
11080 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
11090 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f 74 69    PRAGMA busy_ti
110a0 6d 65 6f 75 74 0a 20 20 2a 2a 20 20 20 50 52 41  meout.  **   PRA
110b0 47 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f 75 74  GMA busy_timeout
110c0 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43   = N.  **.  ** C
110d0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 62 75 73 79  all sqlite3_busy
110e0 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 4e 29 2e  _timeout(db, N).
110f0 20 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72    Return the cur
11100 72 65 6e 74 20 74 69 6d 65 6f 75 74 20 76 61 6c  rent timeout val
11110 75 65 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 69  ue.  ** if one i
11120 73 20 73 65 74 2e 20 20 49 66 20 6e 6f 20 62 75  s set.  If no bu
11130 73 79 20 68 61 6e 64 6c 65 72 20 6f 72 20 61 20  sy handler or a 
11140 64 69 66 66 65 72 65 6e 74 20 62 75 73 79 20 68  different busy h
11150 61 6e 64 6c 65 72 20 69 73 20 73 65 74 0a 20 20  andler is set.  
11160 2a 2a 20 74 68 65 6e 20 30 20 69 73 20 72 65 74  ** then 0 is ret
11170 75 72 6e 65 64 2e 20 20 53 65 74 74 69 6e 67 20  urned.  Setting 
11180 74 68 65 20 62 75 73 79 5f 74 69 6d 65 6f 75 74  the busy_timeout
11190 20 74 6f 20 30 20 6f 72 20 6e 65 67 61 74 69 76   to 0 or negativ
111a0 65 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 73 20  e.  ** disables 
111b0 74 68 65 20 74 69 6d 65 6f 75 74 2e 0a 20 20 2a  the timeout..  *
111c0 2f 0a 20 20 2f 2a 63 61 73 65 20 50 72 61 67 54  /.  /*case PragT
111d0 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55 54 2a  yp_BUSY_TIMEOUT*
111e0 2f 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20  / default: {.   
111f0 20 61 73 73 65 72 74 28 20 70 50 72 61 67 6d 61   assert( pPragma
11200 2d 3e 65 50 72 61 67 54 79 70 3d 3d 50 72 61 67  ->ePragTyp==Prag
11210 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55 54  Typ_BUSY_TIMEOUT
11220 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67   );.    if( zRig
11230 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
11240 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
11250 28 64 62 2c 20 73 71 6c 69 74 65 33 41 74 6f 69  (db, sqlite3Atoi
11260 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 7d  (zRight));.    }
11270 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
11280 65 49 6e 74 28 76 2c 20 64 62 2d 3e 62 75 73 79  eInt(v, db->busy
11290 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20 62 72  Timeout);.    br
112a0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
112b0 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f 66   **   PRAGMA sof
112c0 74 5f 68 65 61 70 5f 6c 69 6d 69 74 0a 20 20 2a  t_heap_limit.  *
112d0 2a 20 20 20 50 52 41 47 4d 41 20 73 6f 66 74 5f  *   PRAGMA soft_
112e0 68 65 61 70 5f 6c 69 6d 69 74 20 3d 20 4e 0a 20  heap_limit = N. 
112f0 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
11300 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 36  NTATION-OF: R-26
11310 33 34 33 2d 34 35 39 33 30 20 54 68 69 73 20 70  343-45930 This p
11320 72 61 67 6d 61 20 69 6e 76 6f 6b 65 73 20 74 68  ragma invokes th
11330 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73  e.  ** sqlite3_s
11340 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34  oft_heap_limit64
11350 28 29 20 69 6e 74 65 72 66 61 63 65 20 77 69 74  () interface wit
11360 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 4e  h the argument N
11370 2c 20 69 66 20 4e 20 69 73 0a 20 20 2a 2a 20 73  , if N is.  ** s
11380 70 65 63 69 66 69 65 64 20 61 6e 64 20 69 73 20  pecified and is 
11390 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
113a0 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 20 49 4d 50  nteger..  ** IMP
113b0 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
113c0 52 2d 36 34 34 35 31 2d 30 37 31 36 33 20 54 68  R-64451-07163 Th
113d0 65 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  e soft_heap_limi
113e0 74 20 70 72 61 67 6d 61 20 61 6c 77 61 79 73 0a  t pragma always.
113f0 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65    ** returns the
11400 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20 74 68   same integer th
11410 61 74 20 77 6f 75 6c 64 20 62 65 20 72 65 74 75  at would be retu
11420 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20 2a 2a  rned by the.  **
11430 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
11440 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29 20 43  ap_limit64(-1) C
11450 2d 6c 61 6e 67 75 61 67 65 20 66 75 6e 63 74 69  -language functi
11460 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
11470 50 72 61 67 54 79 70 5f 53 4f 46 54 5f 48 45 41  PragTyp_SOFT_HEA
11480 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 73  P_LIMIT: {.    s
11490 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a  qlite3_int64 N;.
114a0 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 26      if( zRight &
114b0 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  & sqlite3DecOrHe
114c0 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26  xToI64(zRight, &
114d0 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  N)==SQLITE_OK ){
114e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
114f0 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34  oft_heap_limit64
11500 28 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  (N);.    }.    r
11510 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
11520 2c 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68  , sqlite3_soft_h
11530 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29 29  eap_limit64(-1))
11540 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
11550 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  ..  /*.  **   PR
11560 41 47 4d 41 20 74 68 72 65 61 64 73 0a 20 20 2a  AGMA threads.  *
11570 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72 65 61  *   PRAGMA threa
11580 64 73 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  ds = N.  **.  **
11590 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 6d   Configure the m
115a0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
115b0 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73 2e   worker threads.
115c0 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
115d0 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 2c 20 77  .  ** maximum, w
115e0 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65  hich might be le
115f0 73 73 20 74 68 61 6e 20 72 65 71 75 65 73 74 65  ss than requeste
11600 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  d..  */.  case P
11610 72 61 67 54 79 70 5f 54 48 52 45 41 44 53 3a 20  ragTyp_THREADS: 
11620 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
11630 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a  t64 N;.    if( z
11640 52 69 67 68 74 0a 20 20 20 20 20 26 26 20 73 71  Right.     && sq
11650 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
11660 36 34 28 7a 52 69 67 68 74 2c 20 26 4e 29 3d 3d  64(zRight, &N)==
11670 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26  SQLITE_OK.     &
11680 26 20 4e 3e 3d 30 0a 20 20 20 20 29 7b 0a 20 20  & N>=0.    ){.  
11690 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69      sqlite3_limi
116a0 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c 49 4d  t(db, SQLITE_LIM
116b0 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
116c0 53 2c 20 28 69 6e 74 29 28 4e 26 30 78 37 66 66  S, (int)(N&0x7ff
116d0 66 66 66 66 66 29 29 3b 0a 20 20 20 20 7d 0a 20  fffff));.    }. 
116e0 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
116f0 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 6c 69  nt(v, sqlite3_li
11700 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c  mit(db, SQLITE_L
11710 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
11720 41 44 53 2c 20 2d 31 29 29 3b 0a 20 20 20 20 62  ADS, -1));.    b
11730 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66 20 64  reak;.  }..#if d
11740 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
11750 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
11760 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 2f  SQLITE_TEST).  /
11770 2a 0a 20 20 2a 2a 20 52 65 70 6f 72 74 20 74 68  *.  ** Report th
11780 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
11790 6f 66 20 66 69 6c 65 20 6c 6f 67 73 20 66 6f 72  of file logs for
117a0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 0a 20   all databases. 
117b0 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
117c0 79 70 5f 4c 4f 43 4b 5f 53 54 41 54 55 53 3a 20  yp_LOCK_STATUS: 
117d0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
117e0 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61  st char *const a
117f0 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a  zLockName[] = {.
11800 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 65 64 22        "unlocked"
11810 2c 20 22 73 68 61 72 65 64 22 2c 20 22 72 65 73  , "shared", "res
11820 65 72 76 65 64 22 2c 20 22 70 65 6e 64 69 6e 67  erved", "pending
11830 22 2c 20 22 65 78 63 6c 75 73 69 76 65 22 0a 20  ", "exclusive". 
11840 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b     };.    int i;
11850 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
11860 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69  m = 2;.    for(i
11870 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
11880 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
11890 20 2a 70 42 74 3b 0a 20 20 20 20 20 20 63 6f 6e   *pBt;.      con
118a0 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65 20  st char *zState 
118b0 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20  = "unknown";.   
118c0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
118d0 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  if( db->aDb[i].z
118e0 44 62 53 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e  DbSName==0 ) con
118f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 42 74  tinue;.      pBt
11900 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
11910 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
11920 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74  ==0 || sqlite3Bt
11930 72 65 65 50 61 67 65 72 28 70 42 74 29 3d 3d 30  reePager(pBt)==0
11940 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 74 61   ){.        zSta
11950 74 65 20 3d 20 22 63 6c 6f 73 65 64 22 3b 0a 20  te = "closed";. 
11960 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
11970 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
11980 72 6f 6c 28 64 62 2c 20 69 20 3f 20 64 62 2d 3e  rol(db, i ? db->
11990 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 20  aDb[i].zDbSName 
119a0 3a 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  : 0, .          
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119c0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
119d0 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
119e0 45 2c 20 26 6a 29 3d 3d 53 51 4c 49 54 45 5f 4f  E, &j)==SQLITE_O
119f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 7a 53  K ){.         zS
11a00 74 61 74 65 20 3d 20 61 7a 4c 6f 63 6b 4e 61 6d  tate = azLockNam
11a10 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e[j];.      }.  
11a20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
11a30 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
11a40 73 73 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ss", db->aDb[i].
11a50 7a 44 62 53 4e 61 6d 65 2c 20 7a 53 74 61 74 65  zDbSName, zState
11a60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
11a70 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ak;.  }.#endif..
11a80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
11a90 53 5f 43 4f 44 45 43 0a 20 20 63 61 73 65 20 50  S_CODEC.  case P
11aa0 72 61 67 54 79 70 5f 4b 45 59 3a 20 7b 0a 20 20  ragTyp_KEY: {.  
11ab0 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 20 73    if( zRight ) s
11ac0 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62  qlite3_key_v2(db
11ad0 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c 20 73  , zDb, zRight, s
11ae0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11af0 52 69 67 68 74 29 29 3b 0a 20 20 20 20 62 72 65  Right));.    bre
11b00 61 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65 20 50  ak;.  }.  case P
11b10 72 61 67 54 79 70 5f 52 45 4b 45 59 3a 20 7b 0a  ragTyp_REKEY: {.
11b20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
11b30 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76   sqlite3_rekey_v
11b40 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68  2(db, zDb, zRigh
11b50 74 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  t, sqlite3Strlen
11b60 33 30 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20  30(zRight));.   
11b70 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61   break;.  }.  ca
11b80 73 65 20 50 72 61 67 54 79 70 5f 48 45 58 4b 45  se PragTyp_HEXKE
11b90 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  Y: {.    if( zRi
11ba0 67 68 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ght ){.      u8 
11bb0 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74  iByte;.      int
11bc0 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   i;.      char z
11bd0 4b 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66  Key[40];.      f
11be0 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b  or(i=0, iByte=0;
11bf0 20 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29 2a   i<sizeof(zKey)*
11c00 32 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64  2 && sqlite3Isxd
11c10 69 67 69 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b  igit(zRight[i]);
11c20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
11c30 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34  Byte = (iByte<<4
11c40 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f  ) + sqlite3HexTo
11c50 49 6e 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 0a  Int(zRight[i]);.
11c60 20 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31          if( (i&1
11c70 29 21 3d 30 20 29 20 7a 4b 65 79 5b 69 2f 32 5d  )!=0 ) zKey[i/2]
11c80 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20   = iByte;.      
11c90 7d 0a 20 20 20 20 20 20 69 66 28 20 28 7a 4c 65  }.      if( (zLe
11ca0 66 74 5b 33 5d 20 26 20 30 78 66 29 3d 3d 30 78  ft[3] & 0xf)==0x
11cb0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
11cc0 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20  ite3_key_v2(db, 
11cd0 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b  zDb, zKey, i/2);
11ce0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
11d00 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20  key_v2(db, zDb, 
11d10 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20  zKey, i/2);.    
11d20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
11d30 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  eak;.  }.#endif.
11d40 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
11d50 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c  TE_HAS_CODEC) ||
11d60 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
11d70 45 4e 41 42 4c 45 5f 43 45 52 4f 44 29 0a 20 20  ENABLE_CEROD).  
11d80 63 61 73 65 20 50 72 61 67 54 79 70 5f 41 43 54  case PragTyp_ACT
11d90 49 56 41 54 45 5f 45 58 54 45 4e 53 49 4f 4e 53  IVATE_EXTENSIONS
11da0 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a  : if( zRight ){.
11db0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
11dc0 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20  S_CODEC.    if( 
11dd0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
11de0 7a 52 69 67 68 74 2c 20 22 73 65 65 2d 22 2c 20  zRight, "see-", 
11df0 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  4)==0 ){.      s
11e00 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f  qlite3_activate_
11e10 73 65 65 28 26 7a 52 69 67 68 74 5b 34 5d 29 3b  see(&zRight[4]);
11e20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
11e30 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11e40 4c 45 5f 43 45 52 4f 44 0a 20 20 20 20 69 66 28  LE_CEROD.    if(
11e50 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
11e60 28 7a 52 69 67 68 74 2c 20 22 63 65 72 6f 64 2d  (zRight, "cerod-
11e70 22 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 6)==0 ){.    
11e80 20 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61    sqlite3_activa
11e90 74 65 5f 63 65 72 6f 64 28 26 7a 52 69 67 68 74  te_cerod(&zRight
11ea0 5b 36 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  [6]);.    }.#end
11eb0 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  if.  }.  break;.
11ec0 23 65 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a 20 45  #endif..  } /* E
11ed0 6e 64 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41  nd of the PRAGMA
11ee0 20 73 77 69 74 63 68 20 2a 2f 0a 0a 20 20 2f 2a   switch */..  /*
11ef0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
11f00 6c 6f 63 6b 20 69 73 20 61 20 6e 6f 2d 6f 70 20  lock is a no-op 
11f10 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45  unless SQLITE_DE
11f20 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 20  BUG is defined. 
11f30 49 74 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 75  Its only.  ** pu
11f40 72 70 6f 73 65 20 69 73 20 74 6f 20 65 78 65 63  rpose is to exec
11f50 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ute assert() sta
11f60 74 65 6d 65 6e 74 73 20 74 6f 20 76 65 72 69 66  tements to verif
11f70 79 20 74 68 61 74 20 69 66 20 74 68 65 0a 20 20  y that if the.  
11f80 2a 2a 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c  ** PragFlg_NoCol
11f90 75 6d 6e 73 31 20 66 6c 61 67 20 69 73 20 73 65  umns1 flag is se
11fa0 74 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  t and the caller
11fb0 20 73 70 65 63 69 66 69 65 64 20 61 6e 20 61 72   specified an ar
11fc0 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 74  gument.  ** to t
11fd0 68 65 20 50 52 41 47 4d 41 2c 20 74 68 65 20 69  he PRAGMA, the i
11fe0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 68 61  mplementation ha
11ff0 73 20 6e 6f 74 20 61 64 64 65 64 20 61 6e 79 20  s not added any 
12000 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 0a 20 20  OP_ResultRow .  
12010 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
12020 74 6f 20 74 68 65 20 56 4d 2e 20 20 2a 2f 0a 20  to the VM.  */. 
12030 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d   if( (pPragma->m
12040 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
12050 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 20 26 26  g_NoColumns1) &&
12060 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73   zRight ){.    s
12070 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
12080 4e 6f 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a  NoResultRow(v);.
12090 20 20 7d 0a 0a 70 72 61 67 6d 61 5f 6f 75 74 3a    }..pragma_out:
120a0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
120b0 28 64 62 2c 20 7a 4c 65 66 74 29 3b 0a 20 20 73  (db, zLeft);.  s
120c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
120d0 20 7a 52 69 67 68 74 29 3b 0a 7d 0a 23 69 66 6e   zRight);.}.#ifn
120e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
120f0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a  VIRTUALTABLE./**
12100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49  ***********.** I
12150 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
12160 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69   an eponymous vi
12170 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74  rtual table that
12180 20 72 75 6e 73 20 61 20 70 72 61 67 6d 61 2e 0a   runs a pragma..
12190 2a 2a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  **.*/.typedef st
121a0 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 20  ruct PragmaVtab 
121b0 50 72 61 67 6d 61 56 74 61 62 3b 0a 74 79 70 65  PragmaVtab;.type
121c0 64 65 66 20 73 74 72 75 63 74 20 50 72 61 67 6d  def struct Pragm
121d0 61 56 74 61 62 43 75 72 73 6f 72 20 50 72 61 67  aVtabCursor Prag
121e0 6d 61 56 74 61 62 43 75 72 73 6f 72 3b 0a 73 74  maVtabCursor;.st
121f0 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 20  ruct PragmaVtab 
12200 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
12210 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 2f 2a   base;        /*
12220 20 42 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75   Base class.  Mu
12230 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20  st be first */. 
12240 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
12250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12260 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12270 63 74 69 6f 6e 20 74 6f 20 77 68 69 63 68 20 69  ction to which i
12280 74 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63  t belongs */.  c
12290 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
122a0 2a 70 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65  *pName;  /* Name
122b0 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 2a   of the pragma *
122c0 2f 0a 20 20 75 38 20 6e 48 69 64 64 65 6e 3b 20  /.  u8 nHidden; 
122d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
122e0 20 4e 75 6d 62 65 72 20 6f 66 20 68 69 64 64 65   Number of hidde
122f0 6e 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  n columns */.  u
12300 38 20 69 48 69 64 64 65 6e 3b 20 20 20 20 20 20  8 iHidden;      
12310 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
12320 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 68  x of the first h
12330 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  idden column */.
12340 7d 3b 0a 73 74 72 75 63 74 20 50 72 61 67 6d 61  };.struct Pragma
12350 56 74 61 62 43 75 72 73 6f 72 20 7b 0a 20 20 73  VtabCursor {.  s
12360 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
12370 6f 72 20 62 61 73 65 3b 20 2f 2a 20 42 61 73 65  or base; /* Base
12380 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65   class.  Must be
12390 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69   first */.  sqli
123a0 74 65 33 5f 73 74 6d 74 20 2a 70 50 72 61 67 6d  te3_stmt *pPragm
123b0 61 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 72 61  a;    /* The pra
123c0 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  gma statement to
123d0 20 72 75 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65   run */.  sqlite
123e0 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 3b 20 20  _int64 iRowid;  
123f0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
12400 6f 77 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  owid */.  char *
12410 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20 20 20 20  azArg[2];       
12420 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
12430 74 68 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  the argument and
12440 20 73 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f   schema */.};../
12450 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72  * .** Pragma vir
12460 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
12470 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f  e xConnect metho
12480 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12490 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65   pragmaVtabConne
124a0 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
124b0 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  b,.  void *pAux,
124c0 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  .  int argc, con
124d0 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
124e0 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgv,.  sqlite3_v
124f0 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20  tab **ppVtab,.  
12500 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
12510 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61    const PragmaNa
12520 6d 65 20 2a 70 50 72 61 67 6d 61 20 3d 20 28 63  me *pPragma = (c
12530 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 2a  onst PragmaName*
12540 29 70 41 75 78 3b 0a 20 20 50 72 61 67 6d 61 56  )pAux;.  PragmaV
12550 74 61 62 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20  tab *pTab = 0;. 
12560 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
12570 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 53 65 70  , j;.  char cSep
12580 20 3d 20 27 28 27 3b 0a 20 20 53 74 72 41 63 63   = '(';.  StrAcc
12590 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72 20 7a  um acc;.  char z
125a0 42 75 66 5b 32 30 30 5d 3b 0a 0a 20 20 55 4e 55  Buf[200];..  UNU
125b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
125c0 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  gc);.  UNUSED_PA
125d0 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b 0a 20  RAMETER(argv);. 
125e0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
125f0 49 6e 69 74 28 26 61 63 63 2c 20 30 2c 20 7a 42  Init(&acc, 0, zB
12600 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29  uf, sizeof(zBuf)
12610 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 0);.  sqlite3S
12620 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c  trAccumAppendAll
12630 28 26 61 63 63 2c 20 22 43 52 45 41 54 45 20 54  (&acc, "CREATE T
12640 41 42 4c 45 20 78 22 29 3b 0a 20 20 66 6f 72 28  ABLE x");.  for(
12650 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d 3e  i=0, j=pPragma->
12660 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 70 50  iPragCName; i<pP
12670 72 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d  ragma->nPragCNam
12680 65 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  e; i++, j++){.  
12690 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
126a0 28 26 61 63 63 2c 20 22 25 63 5c 22 25 73 5c 22  (&acc, "%c\"%s\"
126b0 22 2c 20 63 53 65 70 2c 20 70 72 61 67 43 4e 61  ", cSep, pragCNa
126c0 6d 65 5b 6a 5d 29 3b 0a 20 20 20 20 63 53 65 70  me[j]);.    cSep
126d0 20 3d 20 27 2c 27 3b 0a 20 20 7d 0a 20 20 69 66   = ',';.  }.  if
126e0 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( i==0 ){.    sq
126f0 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 61 63  lite3XPrintf(&ac
12700 63 2c 20 22 28 5c 22 25 73 5c 22 22 2c 20 70 50  c, "(\"%s\"", pP
12710 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  ragma->zName);. 
12720 20 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20     cSep = ',';. 
12730 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6a 20     i++;.  }.  j 
12740 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 72 61 67  = 0;.  if( pPrag
12750 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  ma->mPragFlg & P
12760 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 20 29  ragFlg_Result1 )
12770 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72  {.    sqlite3Str
12780 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26  AccumAppendAll(&
12790 61 63 63 2c 20 22 2c 61 72 67 20 48 49 44 44 45  acc, ",arg HIDDE
127a0 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  N");.    j++;.  
127b0 7d 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d  }.  if( pPragma-
127c0 3e 6d 50 72 61 67 46 6c 67 20 26 20 28 50 72 61  >mPragFlg & (Pra
127d0 67 46 6c 67 5f 53 63 68 65 6d 61 4f 70 74 7c 50  gFlg_SchemaOpt|P
127e0 72 61 67 46 6c 67 5f 53 63 68 65 6d 61 52 65 71  ragFlg_SchemaReq
127f0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
12800 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
12810 6c 28 26 61 63 63 2c 20 22 2c 73 63 68 65 6d 61  l(&acc, ",schema
12820 20 48 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a   HIDDEN");.    j
12830 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ++;.  }.  sqlite
12840 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
12850 26 61 63 63 2c 20 22 29 22 2c 20 31 29 3b 0a 20  &acc, ")", 1);. 
12860 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
12870 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20  Finish(&acc);.  
12880 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a  assert( strlen(z
12890 42 75 66 29 20 3c 20 73 69 7a 65 6f 66 28 7a 42  Buf) < sizeof(zB
128a0 75 66 29 2d 31 20 29 3b 0a 20 20 72 63 20 3d 20  uf)-1 );.  rc = 
128b0 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
128c0 76 74 61 62 28 64 62 2c 20 7a 42 75 66 29 3b 0a  vtab(db, zBuf);.
128d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
128e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 20  _OK ){.    pTab 
128f0 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 73  = (PragmaVtab*)s
12900 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
12910 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29  zeof(PragmaVtab)
12920 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
12930 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
12940 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12960 6d 65 6d 73 65 74 28 70 54 61 62 2c 20 30 2c 20  memset(pTab, 0, 
12970 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61  sizeof(PragmaVta
12980 62 29 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  b));.      pTab-
12990 3e 70 4e 61 6d 65 20 3d 20 70 50 72 61 67 6d 61  >pName = pPragma
129a0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62  ;.      pTab->db
129b0 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 70 54 61   = db;.      pTa
129c0 62 2d 3e 69 48 69 64 64 65 6e 20 3d 20 69 3b 0a  b->iHidden = i;.
129d0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 48 69 64        pTab->nHid
129e0 64 65 6e 20 3d 20 6a 3b 0a 20 20 20 20 7d 0a 20  den = j;.    }. 
129f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45   }else{.    *pzE
12a00 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
12a10 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
12a20 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
12a30 20 20 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d    }..  *ppVtab =
12a40 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29   (sqlite3_vtab*)
12a50 70 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 72  pTab;.  return r
12a60 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61  c;.}../* .** Pra
12a70 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
12a80 65 20 6d 6f 64 75 6c 65 20 78 44 69 73 63 6f 6e  e module xDiscon
12a90 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  nect method..*/.
12aa0 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
12ab0 61 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  aVtabDisconnect(
12ac0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
12ad0 74 61 62 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  tab){.  PragmaVt
12ae0 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67  ab *pTab = (Prag
12af0 6d 61 56 74 61 62 2a 29 70 56 74 61 62 3b 0a 20  maVtab*)pVtab;. 
12b00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
12b10 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ab);.  return SQ
12b20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 46  LITE_OK;.}../* F
12b30 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 65  igure out the be
12b40 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
12b50 74 6f 20 73 65 61 72 63 68 20 61 20 70 72 61 67  to search a prag
12b60 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
12b70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
12b80 65 20 6e 6f 74 20 72 65 61 6c 6c 79 20 61 6e 79  e not really any
12b90 20 69 6e 64 65 78 20 63 68 6f 69 63 65 73 2e 20   index choices. 
12ba0 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   But we want to 
12bb0 65 6e 63 6f 75 72 61 67 65 20 74 68 65 0a 2a 2a  encourage the.**
12bc0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 74   query planner t
12bd0 6f 20 67 69 76 65 20 3d 3d 20 63 6f 6e 73 74 72  o give == constr
12be0 61 69 6e 74 73 20 6f 6e 20 61 73 20 6d 61 6e 79  aints on as many
12bf0 20 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65   hidden paramete
12c00 72 73 20 61 73 0a 2a 2a 20 70 6f 73 73 69 62 6c  rs as.** possibl
12c10 65 2c 20 61 6e 64 20 65 73 70 65 63 69 61 6c 6c  e, and especiall
12c20 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 68  y on the first h
12c30 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 2e  idden parameter.
12c40 20 20 53 6f 20 72 65 74 75 72 6e 20 61 0a 2a 2a    So return a.**
12c50 20 68 69 67 68 20 63 6f 73 74 20 69 66 20 68 69   high cost if hi
12c60 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20  dden parameters 
12c70 61 72 65 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65  are unconstraine
12c80 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12c90 20 70 72 61 67 6d 61 56 74 61 62 42 65 73 74 49   pragmaVtabBestI
12ca0 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61  ndex(sqlite3_vta
12cb0 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f  b *tab, sqlite3_
12cc0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
12cd0 49 6e 66 6f 29 7b 0a 20 20 50 72 61 67 6d 61 56  Info){.  PragmaV
12ce0 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61  tab *pTab = (Pra
12cf0 67 6d 61 56 74 61 62 2a 29 74 61 62 3b 0a 20 20  gmaVtab*)tab;.  
12d00 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
12d10 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
12d20 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69  raint *pConstrai
12d30 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  nt;.  int i, j;.
12d40 20 20 69 6e 74 20 73 65 65 6e 5b 32 5d 3b 0a 0a    int seen[2];..
12d50 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
12d60 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
12d70 62 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 54 61  ble)1;.  if( pTa
12d80 62 2d 3e 6e 48 69 64 64 65 6e 3d 3d 30 20 29 7b  b->nHidden==0 ){
12d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12da0 4b 3b 20 7d 0a 20 20 70 43 6f 6e 73 74 72 61 69  K; }.  pConstrai
12db0 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  nt = pIdxInfo->a
12dc0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 73 65  Constraint;.  se
12dd0 65 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 73 65 65  en[0] = 0;.  see
12de0 6e 5b 31 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28  n[1] = 0;.  for(
12df0 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
12e00 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
12e10 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b  +, pConstraint++
12e20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73  ){.    if( pCons
12e30 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d  traint->usable==
12e40 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
12e50 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e    if( pConstrain
12e60 74 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e  t->op!=SQLITE_IN
12e70 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
12e80 51 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  Q ) continue;.  
12e90 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e    if( pConstrain
12ea0 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3c 20 70 54 61  t->iColumn < pTa
12eb0 62 2d 3e 69 48 69 64 64 65 6e 20 29 20 63 6f 6e  b->iHidden ) con
12ec0 74 69 6e 75 65 3b 0a 20 20 20 20 6a 20 3d 20 70  tinue;.    j = p
12ed0 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
12ee0 75 6d 6e 20 2d 20 70 54 61 62 2d 3e 69 48 69 64  umn - pTab->iHid
12ef0 64 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  den;.    assert(
12f00 20 6a 20 3c 20 32 20 29 3b 0a 20 20 20 20 73 65   j < 2 );.    se
12f10 65 6e 5b 6a 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d  en[j] = i+1;.  }
12f20 0a 20 20 69 66 28 20 73 65 65 6e 5b 30 5d 3d 3d  .  if( seen[0]==
12f30 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66  0 ){.    pIdxInf
12f40 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
12f50 20 3d 20 28 64 6f 75 62 6c 65 29 32 31 34 37 34   = (double)21474
12f60 38 33 36 34 37 3b 0a 20 20 20 20 70 49 64 78 49  83647;.    pIdxI
12f70 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
12f80 77 73 20 3d 20 32 31 34 37 34 38 33 36 34 37 3b  ws = 2147483647;
12f90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12fa0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6a 20 3d  TE_OK;.  }.  j =
12fb0 20 73 65 65 6e 5b 30 5d 2d 31 3b 0a 20 20 70 49   seen[0]-1;.  pI
12fc0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
12fd0 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76  intUsage[j].argv
12fe0 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 70 49 64  Index = 1;.  pId
12ff0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
13000 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20  ntUsage[j].omit 
13010 3d 20 31 3b 0a 20 20 69 66 28 20 73 65 65 6e 5b  = 1;.  if( seen[
13020 31 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  1]==0 ) return S
13030 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 49 64 78  QLITE_OK;.  pIdx
13040 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
13050 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 30  ost = (double)20
13060 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
13070 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 30  timatedRows = 20
13080 3b 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 31 5d 2d  ;.  j = seen[1]-
13090 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  1;.  pIdxInfo->a
130a0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
130b0 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 32  j].argvIndex = 2
130c0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
130d0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
130e0 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 72 65  ].omit = 1;.  re
130f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13100 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20 61 20 6e  }../* Create a n
13110 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
13120 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  e pragma virtual
13130 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63   table */.static
13140 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4f   int pragmaVtabO
13150 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62  pen(sqlite3_vtab
13160 20 2a 70 56 74 61 62 2c 20 73 71 6c 69 74 65 33   *pVtab, sqlite3
13170 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70  _vtab_cursor **p
13180 70 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67  pCursor){.  Prag
13190 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
131a0 73 72 3b 0a 20 20 70 43 73 72 20 3d 20 28 50 72  sr;.  pCsr = (Pr
131b0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
131c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
131d0 69 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20  izeof(*pCsr));. 
131e0 20 69 66 28 20 70 43 73 72 3d 3d 30 20 29 20 72   if( pCsr==0 ) r
131f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13200 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 73  EM;.  memset(pCs
13210 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61  r, 0, sizeof(Pra
13220 67 6d 61 56 74 61 62 43 75 72 73 6f 72 29 29 3b  gmaVtabCursor));
13230 0a 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56  .  pCsr->base.pV
13240 74 61 62 20 3d 20 70 56 74 61 62 3b 0a 20 20 2a  tab = pVtab;.  *
13250 70 70 43 75 72 73 6f 72 20 3d 20 26 70 43 73 72  ppCursor = &pCsr
13260 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e  ->base;.  return
13270 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13280 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6e 74  * Clear all cont
13290 65 6e 74 20 66 72 6f 6d 20 70 72 61 67 6d 61 20  ent from pragma 
132a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
132b0 72 73 6f 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20  rsor. */.static 
132c0 76 6f 69 64 20 70 72 61 67 6d 61 56 74 61 62 43  void pragmaVtabC
132d0 75 72 73 6f 72 43 6c 65 61 72 28 50 72 61 67 6d  ursorClear(Pragm
132e0 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
132f0 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  r){.  int i;.  s
13300 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
13310 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a  pCsr->pPragma);.
13320 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20    pCsr->pPragma 
13330 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
13340 69 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72  i<ArraySize(pCsr
13350 2d 3e 61 7a 41 72 67 29 3b 20 69 2b 2b 29 7b 0a  ->azArg); i++){.
13360 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13370 28 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 29  (pCsr->azArg[i])
13380 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72  ;.    pCsr->azAr
13390 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  g[i] = 0;.  }.}.
133a0 0a 2f 2a 20 43 6c 6f 73 65 20 61 20 70 72 61 67  ./* Close a prag
133b0 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
133c0 20 63 75 72 73 6f 72 20 2a 2f 0a 73 74 61 74 69   cursor */.stati
133d0 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
133e0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74  Close(sqlite3_vt
133f0 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
13400 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13410 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13420 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 63  gmaVtabCursor*)c
13430 75 72 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62  ur;.  pragmaVtab
13440 43 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72  CursorClear(pCsr
13450 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
13460 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72  e(pCsr);.  retur
13470 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13480 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 70  /* Advance the p
13490 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
134a0 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  ble cursor to th
134b0 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 73 74  e next row */.st
134c0 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
134d0 74 61 62 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  tabNext(sqlite3_
134e0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
134f0 61 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61  abCursor){.  Pra
13500 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
13510 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
13520 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
13530 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  rsor;.  int rc =
13540 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
13550 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
13560 78 52 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a  xRowid value */.
13570 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 2b 2b    pCsr->iRowid++
13580 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
13590 2d 3e 70 50 72 61 67 6d 61 20 29 3b 0a 20 20 69  ->pPragma );.  i
135a0 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73  f( SQLITE_ROW!=s
135b0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72  qlite3_step(pCsr
135c0 2d 3e 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20  ->pPragma) ){.  
135d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
135e0 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50  inalize(pCsr->pP
135f0 72 61 67 6d 61 29 3b 0a 20 20 20 20 70 43 73 72  ragma);.    pCsr
13600 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20  ->pPragma = 0;. 
13610 20 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72     pragmaVtabCur
13620 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a  sorClear(pCsr);.
13630 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13640 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d  .}../* .** Pragm
13650 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
13660 6d 6f 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d  module xFilter m
13670 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
13680 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 46   int pragmaVtabF
13690 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ilter(.  sqlite3
136a0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
136b0 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e  tabCursor, .  in
136c0 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20  t idxNum, const 
136d0 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20  char *idxStr,.  
136e0 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
136f0 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
13700 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
13710 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
13720 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
13730 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50  pVtabCursor;.  P
13740 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
13750 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28  = (PragmaVtab*)(
13760 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
13770 61 62 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ab);.  int rc;. 
13780 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 53 74 72   int i, j;.  Str
13790 41 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61  Accum acc;.  cha
137a0 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20 55 4e 55 53  r *zSql;..  UNUS
137b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 78  ED_PARAMETER(idx
137c0 4e 75 6d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Num);.  UNUSED_P
137d0 41 52 41 4d 45 54 45 52 28 69 64 78 53 74 72 29  ARAMETER(idxStr)
137e0 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 75  ;.  pragmaVtabCu
137f0 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b  rsorClear(pCsr);
13800 0a 20 20 6a 20 3d 20 28 70 54 61 62 2d 3e 70 4e  .  j = (pTab->pN
13810 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  ame->mPragFlg & 
13820 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 29  PragFlg_Result1)
13830 21 3d 30 20 3f 20 30 20 3a 20 31 3b 0a 20 20 66  !=0 ? 0 : 1;.  f
13840 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
13850 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 63  i++, j++){.    c
13860 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
13870 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
13880 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13890 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  xt(argv[i]);.   
138a0 20 61 73 73 65 72 74 28 20 6a 3c 41 72 72 61 79   assert( j<Array
138b0 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67  Size(pCsr->azArg
138c0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
138d0 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d   pCsr->azArg[j]=
138e0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  =0 );.    if( zT
138f0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 73  ext ){.      pCs
13900 72 2d 3e 61 7a 41 72 67 5b 6a 5d 20 3d 20 73 71  r->azArg[j] = sq
13910 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
13920 73 22 2c 20 7a 54 65 78 74 29 3b 0a 20 20 20 20  s", zText);.    
13930 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72    if( pCsr->azAr
13940 67 5b 6a 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  g[j]==0 ){.     
13950 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13960 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
13970 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
13980 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
13990 26 61 63 63 2c 20 30 2c 20 30 2c 20 30 2c 20 70  &acc, 0, 0, 0, p
139a0 54 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Tab->db->aLimit[
139b0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
139c0 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 73 71 6c  _LENGTH]);.  sql
139d0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
139e0 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 50 52 41  ndAll(&acc, "PRA
139f0 47 4d 41 20 22 29 3b 0a 20 20 69 66 28 20 70 43  GMA ");.  if( pC
13a00 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 20 29 7b 0a  sr->azArg[1] ){.
13a10 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
13a20 74 66 28 26 61 63 63 2c 20 22 25 51 2e 22 2c 20  tf(&acc, "%Q.", 
13a30 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 29 3b  pCsr->azArg[1]);
13a40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
13a50 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
13a60 26 61 63 63 2c 20 70 54 61 62 2d 3e 70 4e 61 6d  &acc, pTab->pNam
13a70 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  e->zName);.  if(
13a80 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 20   pCsr->azArg[0] 
13a90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50  ){.    sqlite3XP
13aa0 72 69 6e 74 66 28 26 61 63 63 2c 20 22 3d 25 51  rintf(&acc, "=%Q
13ab0 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30  ", pCsr->azArg[0
13ac0 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d  ]);.  }.  zSql =
13ad0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
13ae0 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20  Finish(&acc);.  
13af0 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65  if( zSql==0 ) re
13b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13b10 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  M;.  rc = sqlite
13b20 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 54 61  3_prepare_v2(pTa
13b30 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
13b40 20 26 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c   &pCsr->pPragma,
13b50 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
13b60 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28  ree(zSql);.  if(
13b70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13b80 7b 0a 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65  {.    pTab->base
13b90 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  .zErrMsg = sqlit
13ba0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
13bb0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
13bc0 70 54 61 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20  pTab->db));.    
13bd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
13be0 20 72 65 74 75 72 6e 20 70 72 61 67 6d 61 56 74   return pragmaVt
13bf0 61 62 4e 65 78 74 28 70 56 74 61 62 43 75 72 73  abNext(pVtabCurs
13c00 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  or);.}../*.** Pr
13c10 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
13c20 6c 65 20 6d 6f 64 75 6c 65 20 78 45 6f 66 20 6d  le module xEof m
13c30 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
13c40 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 45   int pragmaVtabE
13c50 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  of(sqlite3_vtab_
13c60 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
13c70 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  sor){.  PragmaVt
13c80 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  abCursor *pCsr =
13c90 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73   (PragmaVtabCurs
13ca0 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  or*)pVtabCursor;
13cb0 0a 20 20 72 65 74 75 72 6e 20 28 70 43 73 72 2d  .  return (pCsr-
13cc0 3e 70 50 72 61 67 6d 61 3d 3d 30 29 3b 0a 7d 0a  >pPragma==0);.}.
13cd0 0a 2f 2a 20 54 68 65 20 78 43 6f 6c 75 6d 6e 20  ./* The xColumn 
13ce0 6d 65 74 68 6f 64 20 73 69 6d 70 6c 79 20 72 65  method simply re
13cf0 74 75 72 6e 73 20 74 68 65 20 63 6f 72 72 65 73  turns the corres
13d00 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 66  ponding column f
13d10 72 6f 6d 0a 2a 2a 20 74 68 65 20 50 52 41 47 4d  rom.** the PRAGM
13d20 41 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  A.  .*/.static i
13d30 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c  nt pragmaVtabCol
13d40 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  umn(.  sqlite3_v
13d50 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
13d60 62 43 75 72 73 6f 72 2c 20 0a 20 20 73 71 6c 69  bCursor, .  sqli
13d70 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
13d80 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b 0a 20 20  , .  int i.){.  
13d90 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13da0 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61   *pCsr = (Pragma
13db0 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61  VtabCursor*)pVta
13dc0 62 43 75 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d  bCursor;.  Pragm
13dd0 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50  aVtab *pTab = (P
13de0 72 61 67 6d 61 56 74 61 62 2a 29 28 70 56 74 61  ragmaVtab*)(pVta
13df0 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b  bCursor->pVtab);
13e00 0a 20 20 69 66 28 20 69 3c 70 54 61 62 2d 3e 69  .  if( i<pTab->i
13e10 48 69 64 64 65 6e 20 29 7b 0a 20 20 20 20 73 71  Hidden ){.    sq
13e20 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
13e30 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f  ue(ctx, sqlite3_
13e40 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 73  column_value(pCs
13e50 72 2d 3e 70 50 72 61 67 6d 61 2c 20 69 29 29 3b  r->pPragma, i));
13e60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
13e70 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
13e80 74 28 63 74 78 2c 20 70 43 73 72 2d 3e 61 7a 41  t(ctx, pCsr->azA
13e90 72 67 5b 69 2d 70 54 61 62 2d 3e 69 48 69 64 64  rg[i-pTab->iHidd
13ea0 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52  en],-1,SQLITE_TR
13eb0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20  ANSIENT);.  }.  
13ec0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13ed0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67  ;.}../* .** Prag
13ee0 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
13ef0 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69 64 20 6d   module xRowid m
13f00 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
13f10 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 52   int pragmaVtabR
13f20 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61  owid(sqlite3_vta
13f30 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
13f40 75 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e  ursor, sqlite_in
13f50 74 36 34 20 2a 70 29 7b 0a 20 20 50 72 61 67 6d  t64 *p){.  Pragm
13f60 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13f70 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
13f80 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
13f90 6f 72 3b 0a 20 20 2a 70 20 3d 20 70 43 73 72 2d  or;.  *p = pCsr-
13fa0 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72  >iRowid;.  retur
13fb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13fc0 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 76 69  /* The pragma vi
13fd0 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65  rtual table obje
13fe0 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  ct */.static con
13ff0 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
14000 65 20 70 72 61 67 6d 61 56 74 61 62 4d 6f 64 75  e pragmaVtabModu
14010 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20  le = {.  0,     
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
14040 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14060 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2d      /* xCreate -
14070 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
14080 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43  */.  pragmaVtabC
14090 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20  onnect,         
140a0 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20    /* xConnect - 
140b0 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e 20 65 78  connect to an ex
140c0 69 73 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  isting table */.
140d0 20 20 70 72 61 67 6d 61 56 74 61 62 42 65 73 74    pragmaVtabBest
140e0 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 2f  Index,         /
140f0 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d 20 44  * xBestIndex - D
14100 65 74 65 72 6d 69 6e 65 20 73 65 61 72 63 68 20  etermine search 
14110 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 70 72  strategy */.  pr
14120 61 67 6d 61 56 74 61 62 44 69 73 63 6f 6e 6e 65  agmaVtabDisconne
14130 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ct,        /* xD
14140 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44 69 73 63  isconnect - Disc
14150 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61 20 74 61  onnect from a ta
14160 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ble */.  0,     
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14180 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f        /* xDestro
14190 79 20 2d 20 44 72 6f 70 20 61 20 74 61 62 6c 65  y - Drop a table
141a0 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
141b0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
141c0 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70     /* xOpen - op
141d0 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  en a cursor */. 
141e0 20 70 72 61 67 6d 61 56 74 61 62 43 6c 6f 73 65   pragmaVtabClose
141f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
14200 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20   xClose - close 
14210 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72  a cursor */.  pr
14220 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72 2c 20  agmaVtabFilter, 
14230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
14240 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
14250 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
14260 74 73 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  ts */.  pragmaVt
14270 61 62 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20  abNext,         
14280 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20       /* xNext - 
14290 61 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72  advance a cursor
142a0 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
142b0 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Eof,            
142c0 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20     /* xEof */.  
142d0 70 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e  pragmaVtabColumn
142e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
142f0 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64  xColumn - read d
14300 61 74 61 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  ata */.  pragmaV
14310 74 61 62 52 6f 77 69 64 2c 20 20 20 20 20 20 20  tabRowid,       
14320 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20        /* xRowid 
14330 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
14340 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14360 20 78 55 70 64 61 74 65 20 2d 20 77 72 69 74 65   xUpdate - write
14370 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20   data */.  0,   
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14390 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69          /* xBegi
143a0 6e 20 2d 20 62 65 67 69 6e 20 74 72 61 6e 73 61  n - begin transa
143b0 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143d0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
143e0 20 2d 20 73 79 6e 63 20 74 72 61 6e 73 61 63 74   - sync transact
143f0 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ion */.  0,     
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14410 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74        /* xCommit
14420 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61   - commit transa
14430 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
14440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14450 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
14460 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b 20  back - rollback 
14470 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
14480 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
144a0 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 2d   xFindFunction -
144b0 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f   function overlo
144c0 61 64 69 6e 67 20 2a 2f 0a 20 20 30 2c 20 20 20  ading */.  0,   
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144e0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
144f0 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74 68 65 20  me - rename the 
14500 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20  table */.  0,   
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14520 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61 76 65          /* xSave
14530 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20  point */.  0,   
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14550 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65          /* xRele
14560 61 73 65 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  ase */.  0      
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14580 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61        /* xRollba
14590 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ckTo */.};../*.*
145a0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
145b0 66 20 7a 54 61 62 4e 61 6d 65 20 69 73 20 72 65  f zTabName is re
145c0 61 6c 6c 79 20 74 68 65 20 6e 61 6d 65 20 6f 66  ally the name of
145d0 20 61 20 70 72 61 67 6d 61 2e 20 20 49 66 20 69   a pragma.  If i
145e0 74 20 69 73 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  t is,.** then re
145f0 67 69 73 74 65 72 20 61 6e 20 65 70 6f 6e 79 6d  gister an eponym
14600 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ous virtual tabl
14610 65 20 66 6f 72 20 74 68 61 74 20 70 72 61 67 6d  e for that pragm
14620 61 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  a and return.** 
14630 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
14640 20 4d 6f 64 75 6c 65 20 6f 62 6a 65 63 74 20 66   Module object f
14650 6f 72 20 74 68 65 20 6e 65 77 20 76 69 72 74 75  or the new virtu
14660 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64  al table..*/.Mod
14670 75 6c 65 20 2a 73 71 6c 69 74 65 33 50 72 61 67  ule *sqlite3Prag
14680 6d 61 56 74 61 62 52 65 67 69 73 74 65 72 28 73  maVtabRegister(s
14690 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
146a0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
146b0 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61    const PragmaNa
146c0 6d 65 20 2a 70 4e 61 6d 65 3b 0a 20 20 61 73 73  me *pName;.  ass
146d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 73 74 72  ert( sqlite3_str
146e0 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72  nicmp(zName, "pr
146f0 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 3b  agma_", 7)==0 );
14700 0a 20 20 70 4e 61 6d 65 20 3d 20 70 72 61 67 6d  .  pName = pragm
14710 61 4c 6f 63 61 74 65 28 7a 4e 61 6d 65 2b 37 29  aLocate(zName+7)
14720 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30  ;.  if( pName==0
14730 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
14740 66 28 20 28 70 4e 61 6d 65 2d 3e 6d 50 72 61 67  f( (pName->mPrag
14750 46 6c 67 20 26 20 28 50 72 61 67 46 6c 67 5f 52  Flg & (PragFlg_R
14760 65 73 75 6c 74 30 7c 50 72 61 67 46 6c 67 5f 52  esult0|PragFlg_R
14770 65 73 75 6c 74 31 29 29 3d 3d 30 20 29 20 72 65  esult1))==0 ) re
14780 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
14790 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  ( sqlite3HashFin
147a0 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20  d(&db->aModule, 
147b0 7a 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a 20 20 72  zName)==0 );.  r
147c0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 74 61  eturn sqlite3Vta
147d0 62 43 72 65 61 74 65 4d 6f 64 75 6c 65 28 64 62  bCreateModule(db
147e0 2c 20 7a 4e 61 6d 65 2c 20 26 70 72 61 67 6d 61  , zName, &pragma
147f0 56 74 61 62 4d 6f 64 75 6c 65 2c 20 28 76 6f 69  VtabModule, (voi
14800 64 2a 29 70 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a  d*)pName, 0);.}.
14810 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
14820 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
14830 42 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  BLE */..#endif /
14840 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  * SQLITE_OMIT_PR
14850 41 47 4d 41 20 2a 2f 0a                          AGMA */.