/ Hex Artifact Content
Login

Artifact 130a325228a1db026627e9137ce1372e4184d759361b88184230d2387e112493:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 61  esult row with a
2400: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
2410: 20 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20   string held in 
2420: 72 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63  register 3.  Dec
2430: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c  rement the resul
2440: 74 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73  t count in regis
2450: 74 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c  ter 1.** and hal
2460: 74 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d  t if the maximum
2470: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
2480: 74 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  t rows have been
2490: 20 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74   issued..*/.stat
24a0: 69 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79  ic int integrity
24b0: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56  CheckResultRow(V
24c0: 64 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61  dbe *v){.  int a
24d0: 64 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ddr;.  sqlite3Vd
24e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
24f0: 65 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b  esultRow, 3, 1);
2500: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
2510: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2520: 50 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69  P_IfPos, 1, sqli
2530: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2540: 64 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56  dr(v)+2, 1);.  V
2550: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2570: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
2580: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
25a0: 20 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d   a pragma statem
25b0: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61  ent.  .**.** Pra
25c0: 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73  gmas are of this
25d0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
25e0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
25f0: 2e 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a  .]id [= value].*
2600: 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66  *.** The identif
2610: 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  ier might also b
2620: 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65  e a string.  The
2630: 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
2640: 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74  ng, and.** ident
2650: 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62  ifier, or a numb
2660: 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61  er.  If minusFla
2670: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
2680: 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  the value is.** 
2690: 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61  a number that wa
26a0: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
26b0: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
26c0: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69  * If the left si
26d0: 64 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e  de is "database.
26e0: 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73  id" then pId1 is
26f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
2700: 6d 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69  me.** and pId2 i
2710: 73 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68  s the id.  If th
2720: 65 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a  e left side is j
2730: 75 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49  ust "id" then pI
2740: 64 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20  d1 is the.** id 
2750: 61 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20  and pId2 is any 
2760: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f  empty string..*/
2770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61  .void sqlite3Pra
2780: 67 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gma(.  Parse *pP
2790: 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a  arse, .  Token *
27a0: 70 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20  pId1,        /* 
27b0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73  First part of [s
27c0: 63 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20  chema.]id field 
27d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32  */.  Token *pId2
27e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  ,        /* Seco
27f0: 6e 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65  nd part of [sche
2800: 6d 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72  ma.]id field, or
2810: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
2820: 20 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f   *pValue,      /
2830: 2a 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c  * Token for <val
2840: 75 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ue>, or NULL */.
2850: 20 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20    int minusFlag 
2860: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2870: 20 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63   a '-' sign prec
2880: 65 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a  eded <value> */.
2890: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74  ){.  char *zLeft
28a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
28b0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
28c0: 46 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20  F-8 string <id> 
28d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68  */.  char *zRigh
28e0: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  t = 0;      /* N
28f0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2900: 46 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75  F-8 string <valu
2910: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2920: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2930: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64   = 0;   /* The d
2940: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
2950: 20 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20    Token *pId;   
2960: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2970: 74 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65  ter to <id> toke
2980: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63  n */.  char *aFc
2990: 6e 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a  ntl[4];       /*
29a0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c   Argument to SQL
29b0: 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41  ITE_FCNTL_PRAGMA
29c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 44 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66  Database index f
29f0: 6f 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f  or <database> */
2a00: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 2f 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  /* return value 
2a30: 66 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54  form SQLITE_FCNT
2a40: 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71  L_PRAGMA */.  sq
2a50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2a60: 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68  se->db;    /* Th
2a70: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2a80: 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70  ction */.  Db *p
2a90: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
2ab0: 70 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65  pecific database
2ac0: 20 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20   being pragmaed 
2ad0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
2ae0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
2af0: 61 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61  arse);  /* Prepa
2b00: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
2b10: 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e  .  const PragmaN
2b20: 61 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20  ame *pPragma;   
2b30: 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f  /* The pragma */
2b40: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
2b50: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2b60: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
2b70: 76 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  v);.  pParse->nM
2b80: 65 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e  em = 2;..  /* In
2b90: 74 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68  terpret the [sch
2ba0: 65 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68  ema.] part of th
2bb0: 65 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  e pragma stateme
2bc0: 6e 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20  nt. iDb is the. 
2bd0: 20 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65   ** index of the
2be0: 20 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70   database this p
2bf0: 72 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61  ragma is being a
2c00: 70 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e  pplied to in db.
2c10: 61 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20  aDb[]. */.  iDb 
2c20: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
2c30: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64  Name(pParse, pId
2c40: 31 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a  1, pId2, &pId);.
2c50: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
2c60: 74 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64  turn;.  pDb = &d
2c70: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
2c80: 2f 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64  /* If the temp d
2c90: 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
2ca0: 20 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65   explicitly name
2cb0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2cc0: 20 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d   .  ** pragma, m
2cd0: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f  ake sure it is o
2ce0: 70 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  pen. .  */.  if(
2cf0: 20 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74   iDb==1 && sqlit
2d00: 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
2d10: 73 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  se(pParse) ){.  
2d20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2d30: 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   zLeft = sqlite3
2d40: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
2d50: 2c 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a  , pId);.  if( !z
2d60: 4c 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Left ) return;. 
2d70: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
2d80: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
2d90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2da0: 2c 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29  , "-%T", pValue)
2db0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2dc0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e  Right = sqlite3N
2dd0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2de0: 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20   pValue);.  }.. 
2df0: 20 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b   assert( pId2 );
2e00: 0a 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e  .  zDb = pId2->n
2e10: 3e 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61  >0 ? pDb->zDbSNa
2e20: 6d 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71  me : 0;.  if( sq
2e30: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
2e40: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52  Parse, SQLITE_PR
2e50: 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69  AGMA, zLeft, zRi
2e60: 67 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ght, zDb) ){.   
2e70: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
2e80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64  ;.  }..  /* Send
2e90: 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   an SQLITE_FCNTL
2ea0: 5f 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e  _PRAGMA file-con
2eb0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65  trol to the unde
2ec0: 72 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20  rlying VFS.  ** 
2ed0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20  connection.  If 
2ee0: 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
2ef0: 45 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d  E_OK, then assum
2f00: 65 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20  e that the VFS. 
2f10: 20 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20   ** handled the 
2f20: 70 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72  pragma and gener
2f30: 61 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70  ate a no-op prep
2f40: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
2f50: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
2f60: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31  ENTATION-OF: R-1
2f70: 32 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65  2238-55120 Whene
2f80: 76 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61  ver a PRAGMA sta
2f90: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
2fa0: 2c 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45  ,.  ** an SQLITE
2fb0: 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69  _FCNTL_PRAGMA fi
2fc0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65  le control is se
2fd0: 6e 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73  nt to the open s
2fe0: 71 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a  qlite3_file.  **
2ff0: 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
3000: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  nding to the dat
3010: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68  abase file to wh
3020: 69 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20  ich the pragma. 
3030: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
3040: 66 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fers..  **.  ** 
3050: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
3060: 46 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38  F: R-29875-31678
3070: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   The argument to
3080: 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
3090: 4c 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69  L_PRAGMA.  ** fi
30a0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e  le control is an
30b0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
30c0: 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63  rs to strings (c
30d0: 68 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20  har**) in which 
30e0: 74 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20  the.  ** second 
30f0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
3100: 72 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65  rray is the name
3110: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61   of the pragma a
3120: 6e 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a  nd the third.  *
3130: 2a 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65  * element is the
3140: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3150: 20 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20   pragma or NULL 
3160: 69 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61  if the pragma ha
3170: 73 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65  s no.  ** argume
3180: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74  nt..  */.  aFcnt
3190: 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e  l[0] = 0;.  aFcn
31a0: 74 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20  tl[1] = zLeft;. 
31b0: 20 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69   aFcntl[2] = zRi
31c0: 67 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d  ght;.  aFcntl[3]
31d0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
31e0: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
31f0: 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
3200: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
3210: 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46  b, zDb, SQLITE_F
3220: 43 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f  CNTL_PRAGMA, (vo
3230: 69 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69  id*)aFcntl);.  i
3240: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3250: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
3260: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
3270: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
3280: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
3290: 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 0, COLNAME_NAM
32a0: 45 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51  E, aFcntl[0], SQ
32b0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
32c0: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
32d0: 65 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b  eText(v, aFcntl[
32e0: 30 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0]);.    sqlite3
32f0: 5f 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29  _free(aFcntl[0])
3300: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d  ;.    goto pragm
3310: 61 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  a_out;.  }.  if(
3320: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
3330: 4f 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20  OUND ){.    if( 
3340: 61 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20  aFcntl[0] ){.   
3350: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3360: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
3370: 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20   aFcntl[0]);.   
3380: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3390: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
33a0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  }.    pParse->nE
33b0: 72 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65  rr++;.    pParse
33c0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67  ->rc = rc;.    g
33d0: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
33e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
33f0: 20 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74   the pragma in t
3400: 68 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20  he lookup table 
3410: 2a 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70  */.  pPragma = p
3420: 72 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66  ragmaLocate(zLef
3430: 74 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d  t);.  if( pPragm
3440: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67  a==0 ) goto prag
3450: 6d 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61  ma_out;..  /* Ma
3460: 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
3470: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c  base schema is l
3480: 6f 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61  oaded if the pra
3490: 67 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61  gma requires tha
34a0: 74 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61  t */.  if( (pPra
34b0: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
34c0: 50 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65  PragFlg_NeedSche
34d0: 6d 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ma)!=0 ){.    if
34e0: 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
34f0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
3500: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
3510: 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
3520: 72 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c  r the result col
3530: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 70 72  umn names for pr
3540: 61 67 6d 61 73 20 74 68 61 74 20 72 65 74 75 72  agmas that retur
3550: 6e 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  n results */.  i
3560: 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72  f( (pPragma->mPr
3570: 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
3580: 4e 6f 43 6f 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20  NoColumns)==0 . 
3590: 20 20 26 26 20 28 28 70 50 72 61 67 6d 61 2d 3e    && ((pPragma->
35a0: 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
35b0: 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d  lg_NoColumns1)==
35c0: 30 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 29 0a  0 || zRight==0).
35d0: 20 20 29 7b 0a 20 20 20 20 73 65 74 50 72 61 67    ){.    setPrag
35e0: 6d 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61  maResultColumnNa
35f0: 6d 65 73 28 76 2c 20 70 50 72 61 67 6d 61 29 3b  mes(v, pPragma);
3600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
3610: 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
3620: 74 65 20 70 72 61 67 6d 61 20 68 61 6e 64 6c 65  te pragma handle
3630: 72 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70  r */.  switch( p
3640: 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70  Pragma->ePragTyp
3650: 20 29 7b 0a 20 20 0a 23 69 66 20 21 64 65 66 69   ){.  .#if !defi
3660: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3670: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 26  PAGER_PRAGMAS) &
3680: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
3690: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
36a0: 44 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  D).  /*.  **  PR
36b0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65  AGMA [schema.]de
36c0: 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65  fault_cache_size
36d0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
36e0: 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63  chema.]default_c
36f0: 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a  ache_size=N.  **
3700: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
3710: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
3720: 20 63 75 72 72 65 6e 74 20 70 65 72 73 69 73 74   current persist
3730: 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ent setting for 
3740: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
3750: 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76  che size.  The v
3760: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
3770: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
3780: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65  ber of.  ** page
3790: 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
37a0: 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  che.  The second
37b0: 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20   form sets both 
37c0: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
37d0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
37e0: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
37f0: 65 72 73 69 73 74 65 6e 74 20 70 61 67 65 20 63  ersistent page c
3800: 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a  ache size value.
3810: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74    ** stored in t
3820: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3830: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65  ..  **.  ** Olde
3840: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
3850: 4c 69 74 65 20 77 6f 75 6c 64 20 73 65 74 20 74  Lite would set t
3860: 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65  he default cache
3870: 20 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a 2a 20   size to a.  ** 
3880: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
3890: 74 6f 20 69 6e 64 69 63 61 74 65 20 73 79 6e 63  to indicate sync
38a0: 68 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20 54 68  hronous=OFF.  Th
38b0: 65 73 65 20 64 61 79 73 2c 20 73 79 6e 63 68 72  ese days, synchr
38c0: 6f 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 61 6c  onous.  ** is al
38d0: 77 61 79 73 20 6f 6e 20 62 79 20 64 65 66 61 75  ways on by defau
38e0: 6c 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  lt regardless of
38f0: 20 74 68 65 20 73 69 67 6e 20 6f 66 20 74 68 65   the sign of the
3900: 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a 20   default cache. 
3910: 20 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74 20 63   ** size.  But c
3920: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b 65 20  ontinue to take 
3930: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
3940: 75 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  ue of the defaul
3950: 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a  t cache.  ** siz
3960: 65 20 6f 66 20 68 69 73 74 6f 72 69 63 61 6c 20  e of historical 
3970: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 20  compatibility.. 
3980: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
3990: 79 70 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  yp_DEFAULT_CACHE
39a0: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 74 61  _SIZE: {.    sta
39b0: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c  tic const int iL
39c0: 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f  n = VDBE_OFFSET_
39d0: 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 73  LINENO(2);.    s
39e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65  tatic const Vdbe
39f0: 4f 70 4c 69 73 74 20 67 65 74 43 61 63 68 65 53  OpList getCacheS
3a00: 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ize[] = {.      
3a10: 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  { OP_Transaction
3a20: 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30  , 0, 0,        0
3a30: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  },              
3a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
3a50: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  */.      { OP_Re
3a60: 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 31 2c  adCookie,  0, 1,
3a70: 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 44 45          BTREE_DE
3a80: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
3a90: 7d 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20  },  /* 1 */.    
3aa0: 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20    { OP_IfPos,   
3ab0: 20 20 20 20 31 2c 20 38 2c 20 20 20 20 20 20 20      1, 8,       
3ac0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
3ad0: 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20  Integer,     0, 
3ae0: 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  2,        0},.  
3af0: 20 20 20 20 7b 20 4f 50 5f 53 75 62 74 72 61 63      { OP_Subtrac
3b00: 74 2c 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20  t,    1, 2,     
3b10: 20 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     1},.      { O
3b20: 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31  P_IfPos,       1
3b30: 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 8,        0},.
3b40: 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
3b50: 65 72 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  er,     0, 1,   
3b60: 20 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20 20       0},        
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 6 */.      {
3b90: 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
3ba0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
3bb0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73  ,.      { OP_Res
3bc0: 75 6c 74 52 6f 77 2c 20 20 20 31 2c 20 31 2c 20  ultRow,   1, 1, 
3bd0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
3be0: 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f  ;.    VdbeOp *aO
3bf0: 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  p;.    sqlite3Vd
3c00: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
3c10: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52  Db);.    if( !zR
3c20: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 50  ight ){.      pP
3c30: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b  arse->nMem += 2;
3c40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3c50: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
3c60: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
3c70: 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69  ySize(getCacheSi
3c80: 7a 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20  ze));.      aOp 
3c90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3ca0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
3cb0: 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65  ize(getCacheSize
3cc0: 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 2c  ), getCacheSize,
3cd0: 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28   iLn);.      if(
3ce0: 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43   ONLY_IF_REALLOC
3cf0: 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20  _STRESS(aOp==0) 
3d00: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61  ) break;.      a
3d10: 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[0].p1 = iDb;.
3d20: 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20        aOp[1].p1 
3d30: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70  = iDb;.      aOp
3d40: 5b 36 5d 2e 70 31 20 3d 20 53 51 4c 49 54 45 5f  [6].p1 = SQLITE_
3d50: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
3d60: 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ZE;.    }else{. 
3d70: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
3d80: 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
3d90: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
3da0: 68 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ht));.      sqli
3db0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
3dc0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
3dd0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
3de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3df0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
3e00: 20 69 44 62 2c 20 42 54 52 45 45 5f 44 45 46 41   iDb, BTREE_DEFA
3e10: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20  ULT_CACHE_SIZE, 
3e20: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73  size);.      ass
3e30: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3e40: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3e50: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
3e60: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63   pDb->pSchema->c
3e70: 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
3e80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3e90: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
3ea0: 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e  (pDb->pBt, pDb->
3eb0: 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73  pSchema->cache_s
3ec0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
3ed0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
3ee0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
3ef0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20  T_PAGER_PRAGMAS 
3f00: 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  && !SQLITE_OMIT_
3f10: 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 23  DEPRECATED */..#
3f20: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
3f30: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
3f40: 41 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a  AGMAS).  /*.  **
3f50: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
3f60: 2e 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20 2a 2a  .]page_size.  **
3f70: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
3f80: 2e 5d 70 61 67 65 5f 73 69 7a 65 3d 4e 0a 20 20  .]page_size=N.  
3f90: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
3fa0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
3fb0: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
3fc0: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
3fd0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
3fe0: 7a 65 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68  ze in bytes.  Th
3ff0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
4000: 74 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  ts the.  ** data
4010: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 76  base page size v
4020: 61 6c 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65  alue.  The value
4030: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 73 65 74   can only be set
4040: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74   if.  ** the dat
4050: 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 79 65  abase has not ye
4060: 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2e 0a  t been created..
4070: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
4080: 54 79 70 5f 50 41 47 45 5f 53 49 5a 45 3a 20 7b  Typ_PAGE_SIZE: {
4090: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
40a0: 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20  = pDb->pBt;.    
40b0: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
40c0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
40d0: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  t ){.      int s
40e0: 69 7a 65 20 3d 20 41 4c 57 41 59 53 28 70 42 74  ize = ALWAYS(pBt
40f0: 29 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  ) ? sqlite3Btree
4100: 47 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 29  GetPageSize(pBt)
4110: 20 3a 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   : 0;.      retu
4120: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73  rnSingleInt(v, s
4130: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
4140: 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  .      /* Malloc
4150: 20 6d 61 79 20 66 61 69 6c 20 77 68 65 6e 20 73   may fail when s
4160: 65 74 74 69 6e 67 20 74 68 65 20 70 61 67 65 2d  etting the page-
4170: 73 69 7a 65 2c 20 61 73 20 74 68 65 72 65 20 69  size, as there i
4180: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20  s an internal.  
4190: 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 74 68      ** buffer th
41a0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f 64  at the pager mod
41b0: 75 6c 65 20 72 65 73 69 7a 65 73 20 75 73 69 6e  ule resizes usin
41c0: 67 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  g sqlite3_reallo
41d0: 63 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  c()..      */.  
41e0: 20 20 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65      db->nextPage
41f0: 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74  size = sqlite3At
4200: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
4210: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
4220: 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
4230: 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
4240: 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
4250: 65 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20 20 20  e,-1,0) ){.     
4260: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
4270: 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  lt(db);.      }.
4280: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
4290: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
42a0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
42b0: 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20  ]secure_delete. 
42c0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
42d0: 65 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65  ema.]secure_dele
42e0: 74 65 3d 4f 4e 2f 4f 46 46 2f 46 41 53 54 0a 20  te=ON/OFF/FAST. 
42f0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
4300: 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20  st form reports 
4310: 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
4320: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
4330: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 66   secure_delete f
4340: 6c 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  lag.  The second
4350: 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68   form changes th
4360: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
4370: 20 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69 6e    ** flag settin
4380: 67 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74 68  g and reports th
4390: 65 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a  e new value..  *
43a0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
43b0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20  _SECURE_DELETE: 
43c0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
43d0: 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20   = pDb->pBt;.   
43e0: 20 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20   int b = -1;.   
43f0: 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20   assert( pBt!=0 
4400: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
4410: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  t ){.      if( s
4420: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
4430: 52 69 67 68 74 2c 20 22 66 61 73 74 22 29 3d 3d  Right, "fast")==
4440: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 20 3d  0 ){.        b =
4450: 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   2;.      }else{
4460: 0a 20 20 20 20 20 20 20 20 62 20 3d 20 73 71 6c  .        b = sql
4470: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
4480: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
4490: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
44a0: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62   pId2->n==0 && b
44b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
44c0: 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
44d0: 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
44e0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
44f0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
4500: 72 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62  reDelete(db->aDb
4510: 5b 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20  [ii].pBt, b);.  
4520: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4530: 62 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  b = sqlite3Btree
4540: 53 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74  SecureDelete(pBt
4550: 2c 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , b);.    return
4560: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b  SingleInt(v, b);
4570: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4580: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4590: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f  MA [schema.]max_
45a0: 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20  page_count.  ** 
45b0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
45c0: 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d  ]max_page_count=
45d0: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
45e0: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
45f0: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
4600: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
4610: 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62   ** maximum numb
4620: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
4630: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
4640: 2e 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63  .  The .  ** sec
4650: 6f 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74  ond form attempt
4660: 73 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73  s to change this
4670: 20 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a   setting.  Both.
4680: 20 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72    ** forms retur
4690: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  n the current se
46a0: 74 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tting..  **.  **
46b0: 20 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   The absolute va
46c0: 6c 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64  lue of N is used
46d0: 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
46e0: 75 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68  umented and migh
46f0: 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20  t.  ** change.  
4700: 54 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65  The only purpose
4710: 20 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61   is to provide a
4720: 6e 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65  n easy way to te
4730: 73 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  st.  ** the sqli
4740: 74 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75  te3AbsInt32() fu
4750: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  nction..  **.  *
4760: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4770: 61 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20  a.]page_count.  
4780: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
4790: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
47a0: 65 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  es in the specif
47b0: 69 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ied database..  
47c0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
47d0: 70 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a  p_PAGE_COUNT: {.
47e0: 20 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20      int iReg;.  
47f0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
4800: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
4810: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67  , iDb);.    iReg
4820: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4830: 6d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  m;.    if( sqlit
4840: 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b  e3Tolower(zLeft[
4850: 30 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20  0])=='p' ){.    
4860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4870: 4f 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f  Op2(v, OP_Pageco
4880: 75 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b  unt, iDb, iReg);
4890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
48a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
48b0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63  Op3(v, OP_MaxPgc
48c0: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a  nt, iDb, iReg, .
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
48f0: 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41  bsInt32(sqlite3A
4900: 74 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20  toi(zRight)));. 
4910: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
4920: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4930: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67  _ResultRow, iReg
4940: 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 1);.    break;
4950: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4960: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4970: 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20  ]locking_mode.  
4980: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4990: 6d 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ma.]locking_mode
49a0: 20 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75   = (normal|exclu
49b0: 73 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73  sive).  */.  cas
49c0: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e  e PragTyp_LOCKIN
49d0: 47 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f  G_MODE: {.    co
49e0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  nst char *zRet =
49f0: 20 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69   "normal";.    i
4a00: 6e 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f  nt eMode = getLo
4a10: 63 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74  ckingMode(zRight
4a20: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32  );..    if( pId2
4a30: 2d 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d  ->n==0 && eMode=
4a40: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4a50: 44 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20  DE_QUERY ){.    
4a60: 20 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41    /* Simple "PRA
4a70: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
4a80: 3b 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ;" statement. Th
4a90: 69 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f  is is a query fo
4aa0: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
4ab0: 75 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c  urrent default l
4ac0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69  ocking mode (whi
4ad0: 63 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  ch may be differ
4ae0: 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ent to.      ** 
4af0: 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
4b00: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
4b10: 61 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f  abase)..      */
4b20: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64  .      eMode = d
4b30: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b  b->dfltLockMode;
4b40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b50: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
4b60: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d  .      if( pId2-
4b70: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >n==0 ){.       
4b80: 20 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   /* This indicat
4b90: 65 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62  es that no datab
4ba0: 61 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65  ase name was spe
4bb0: 63 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20  cified as part. 
4bc0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
4bd0: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e   PRAGMA command.
4be0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
4bf0: 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d  e locking-mode m
4c00: 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
4c10: 2a 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74  * set on all att
4c20: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c  ached databases,
4c30: 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
4c40: 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20  main db file..  
4c50: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
4c60: 20 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71   ** Also, the sq
4c70: 6c 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f  lite3.dfltLockMo
4c80: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  de variable is s
4c90: 65 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20  et so that.     
4ca0: 20 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71     ** any subseq
4cb0: 75 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20  uently attached 
4cc0: 64 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75  databases also u
4cd0: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
4ce0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
4cf0: 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20  ing mode..      
4d00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
4d10: 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
4d20: 65 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44  ert(pDb==&db->aD
4d30: 62 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  b[0]);.        f
4d40: 6f 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e  or(ii=2; ii<db->
4d50: 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
4d60: 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
4d70: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4d80: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4da0: 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
4db0: 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f  Mode(pPager, eMo
4dc0: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  de);.        }. 
4dd0: 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c         db->dfltL
4de0: 6f 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  ockMode = (u8)eM
4df0: 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
4e00: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
4e10: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
4e20: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65  b->pBt);.      e
4e30: 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Mode = sqlite3Pa
4e40: 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  gerLockingMode(p
4e50: 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  Pager, eMode);. 
4e60: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
4e70: 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
4e80: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
4e90: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
4ea0: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4eb0: 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
4ec0: 49 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65  IVE );.    if( e
4ed0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4ee0: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
4ef0: 45 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20  E ){.      zRet 
4f00: 3d 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20  = "exclusive";. 
4f10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
4f20: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65  ingleText(v, zRe
4f30: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
4f40: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
4f50: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
4f60: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a  ournal_mode.  **
4f70: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4f80: 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  .]journal_mode =
4f90: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
4fa0: 20 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65             (dele
4fb0: 74 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74  te|persist|off|t
4fc0: 72 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77  runcate|memory|w
4fd0: 61 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63  al|off).  */.  c
4fe0: 61 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52  ase PragTyp_JOUR
4ff0: 4e 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20  NAL_MODE: {.    
5000: 69 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20  int eMode;      
5010: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
5020: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
5030: 45 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f  E_XXX symbols */
5040: 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
5050: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5060: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69  ounter */..    i
5070: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( zRight==0 ){.
5080: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
5090: 65 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20  e is no "=MODE" 
50a0: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67  part of the prag
50b0: 6d 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66  ma, do a query f
50c0: 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
50d0: 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a  current mode */.
50e0: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41        eMode = PA
50f0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
5100: 51 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65  QUERY;.    }else
5110: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
5120: 61 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20  ar *zMode;.     
5130: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
5140: 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29  Strlen30(zRight)
5150: 3b 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64  ;.      for(eMod
5160: 65 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71  e=0; (zMode = sq
5170: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65  lite3JournalMode
5180: 6e 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b  name(eMode))!=0;
5190: 20 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20   eMode++){.     
51a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
51b0: 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a  rNICmp(zRight, z
51c0: 4d 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72  Mode, n)==0 ) br
51d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
51e0: 20 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b     if( !zMode ){
51f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
5200: 68 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20  he "=MODE" part 
5210: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
5220: 6e 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c  ny known journal
5230: 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a   mode,.        *
5240: 2a 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72  * then do a quer
5250: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f  y */.        eMo
5260: 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
5270: 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20  ALMODE_QUERY;.  
5280: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5290: 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  if( eMode==PAGER
52a0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
52b0: 52 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30  RY && pId2->n==0
52c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e   ){.      /* Con
52d0: 76 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75  vert "PRAGMA jou
52e0: 72 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20  rnal_mode" into 
52f0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
5300: 72 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20  rnal_mode" */.  
5310: 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20      iDb = 0;.   
5320: 20 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a     pId2->n = 1;.
5330: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
5340: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d  =db->nDb-1; ii>=
5350: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
5360: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  if( db->aDb[ii].
5370: 70 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20  pBt && (ii==iDb 
5380: 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29  || pId2->n==0) )
5390: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
53a0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
53b0: 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73  , ii);.        s
53c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
53d0: 28 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  (v, OP_JournalMo
53e0: 64 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65  de, ii, 1, eMode
53f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5400: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5410: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
5420: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
5430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
5440: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
5450: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5460: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a  l_size_limit.  *
5470: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
5480: 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  a.]journal_size_
5490: 6c 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  limit=N.  **.  *
54a0: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
54b0: 20 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72   size limit on r
54c0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
54d0: 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  files..  */.  ca
54e0: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
54f0: 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b  AL_SIZE_LIMIT: {
5500: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
5510: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
5520: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
5530: 3b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74  ;.    i64 iLimit
5540: 20 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a   = -2;.    if( z
5550: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
5560: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
5570: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69  I64(zRight, &iLi
5580: 6d 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mit);.      if( 
5590: 69 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d  iLimit<-1 ) iLim
55a0: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  it = -1;.    }. 
55b0: 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69     iLimit = sqli
55c0: 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
55d0: 69 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c  izeLimit(pPager,
55e0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65   iLimit);.    re
55f0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
5600: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72   iLimit);.    br
5610: 65 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  eak;.  }..#endif
5620: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5630: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
5640: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
5650: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74  GMA [schema.]aut
5660: 6f 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50  o_vacuum.  **  P
5670: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
5680: 75 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a  uto_vacuum=N.  *
5690: 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65  *.  ** Get or se
56a0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
56b0: 68 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74  he database 'aut
56c0: 6f 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65  o-vacuum' parame
56d0: 74 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  ter..  ** The va
56e0: 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20  lue is one of:  
56f0: 30 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20  0 NONE 1 FULL 2 
5700: 49 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f  INCREMENTAL.  */
5710: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5720: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
5730: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
5740: 55 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20  UTO_VACUUM: {.  
5750: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
5760: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  Db->pBt;.    ass
5770: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
5780: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
5790: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
57a0: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74  ngleInt(v, sqlit
57b0: 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
57c0: 63 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20  cuum(pBt));.    
57d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
57e0: 20 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f   eAuto = getAuto
57f0: 56 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a  Vacuum(zRight);.
5800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41        assert( eA
5810: 75 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c  uto>=0 && eAuto<
5820: 3d 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  =2 );.      db->
5830: 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75  nextAutovac = (u
5840: 38 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f  8)eAuto;.      /
5850: 2a 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61  * Call SetAutoVa
5860: 63 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e  cuum() to set in
5870: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74  itialize the int
5880: 65 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20  ernal auto and. 
5890: 20 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63       ** incr-vac
58a0: 75 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20  uum flags. This 
58b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
58c0: 61 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ase this connect
58d0: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65  ion.      ** cre
58e0: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
58f0: 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d  e file. It is im
5900: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20  portant that it 
5910: 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  is created.     
5920: 20 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76   ** as an auto-v
5930: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62  acuum capable db
5940: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5950: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5960: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
5970: 70 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20  pBt, eAuto);.   
5980: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5990: 45 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d  E_OK && (eAuto==
59a0: 31 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29  1 || eAuto==2) )
59b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  {.        /* Whe
59c0: 6e 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75  n setting the au
59d0: 74 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to_vacuum mode t
59e0: 6f 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20  o either "full" 
59f0: 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  or .        ** "
5a00: 69 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72  incremental", wr
5a10: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ite the value of
5a20: 20 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20   meta[6] in the 
5a30: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
5a40: 20 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65   ** file. Before
5a50: 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61   writing to meta
5a60: 5b 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20  [6], check that 
5a70: 6d 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65  meta[3] indicate
5a80: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
5a90: 74 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73  t this really is
5aa0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
5ab0: 63 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65  capable database
5ac0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5ad0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
5ae0: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
5af0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
5b00: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  );.        stati
5b10: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
5b20: 73 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20  st setMeta6[] = 
5b30: 7b 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50  {.          { OP
5b40: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
5b50: 20 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20   0,         1,  
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b70: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
5b80: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61          { OP_Rea
5b90: 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20  dCookie,     0, 
5ba0: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5bb0: 20 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54     BTREE_LARGEST
5bc0: 5f 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20  _ROOT_PAGE},.   
5bd0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20         { OP_If, 
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20              1,  
5bf0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
5c00: 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20            0},   
5c10: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20   /* 2 */.       
5c20: 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20     { OP_Halt,   
5c30: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
5c40: 4b 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20  K, OE_Abort,    
5c50: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c60: 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  3 */.          {
5c70: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
5c80: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42      0,         B
5c90: 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d  TREE_INCR_VACUUM
5ca0: 2c 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f  , 0},    /* 4 */
5cb0: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
5cc0: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
5cd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64  .        int iAd
5ce0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5cf0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
5d00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5d10: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
5d20: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
5d30: 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29  aySize(setMeta6)
5d40: 29 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d  );.        aOp =
5d50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d60: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
5d70: 7a 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65  ze(setMeta6), se
5d80: 74 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20  tMeta6, iLn);.  
5d90: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
5da0: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
5db0: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
5dc0: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d  ;.        aOp[0]
5dd0: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
5de0: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
5df0: 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  Db;.        aOp[
5e00: 32 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b  2].p2 = iAddr+4;
5e10: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e  .        aOp[4].
5e20: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5e30: 20 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41    aOp[4].p3 = eA
5e40: 75 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  uto - 1;.       
5e50: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
5e60: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
5e70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5e80: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
5e90: 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  if..  /*.  **  P
5ea0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69  RAGMA [schema.]i
5eb0: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
5ec0: 6d 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  m(N).  **.  ** D
5ed0: 6f 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63  o N steps of inc
5ee0: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69  remental vacuumi
5ef0: 6e 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ng on a database
5f00: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5f10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5f20: 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61  ACUUM.  case Pra
5f30: 67 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c  gTyp_INCREMENTAL
5f40: 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69  _VACUUM: {.    i
5f50: 6e 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b  nt iLimit, addr;
5f60: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
5f70: 3d 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65  =0 || !sqlite3Ge
5f80: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
5f90: 69 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69  iLimit) || iLimi
5fa0: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  t<=0 ){.      iL
5fb0: 69 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66  imit = 0x7ffffff
5fc0: 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  f;.    }.    sql
5fd0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5fe0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5ff0: 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
6000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6010: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c  , OP_Integer, iL
6020: 69 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64  imit, 1);.    ad
6030: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
6040: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63  AddOp1(v, OP_Inc
6050: 72 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56  rVacuum, iDb); V
6060: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6080: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp1(v, OP_Resu
6090: 6c 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73  ltRow, 1);.    s
60a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
60b0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
60c0: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
60d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
60e0: 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64  OP_IfPos, 1, add
60f0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
6100: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6110: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
6120: 61 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b  addr);.    break
6130: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
6140: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6150: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
6160: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6170: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6180: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
6190: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
61a0: 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20  e_size=N.  **.  
61b0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
61c0: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
61d0: 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74  rrent local sett
61e0: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
61f0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
6200: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  . The second for
6210: 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c  m sets the local
6220: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
6230: 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66   size value.  If
6240: 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74   N is positive t
6250: 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a  hen that is the.
6260: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
6270: 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
6280: 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61  e.  If N is nega
6290: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  tive, then the. 
62a0: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
62b0: 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20  ges is adjusted 
62c0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
62d0: 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79  e uses -N kibiby
62e0: 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f  tes.  ** of memo
62f0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
6300: 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49  PragTyp_CACHE_SI
6310: 5a 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE: {.    assert
6320: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
6330: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
6340: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
6350: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6360: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6370: 28 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  (v, pDb->pSchema
6380: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
6390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
63a0: 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74  int size = sqlit
63b0: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
63c0: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
63d0: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  ma->cache_size =
63e0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
63f0: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
6400: 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20  eSize(pDb->pBt, 
6410: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
6420: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
6430: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6440: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
6450: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6460: 65 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52  e_spill.  **  PR
6470: 41 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c  AGMA cache_spill
6480: 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50  =BOOLEAN.  **  P
6490: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63  RAGMA [schema.]c
64a0: 61 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a  ache_spill=N.  *
64b0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
64c0: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
64d0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20  e current local 
64e0: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
64f0: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
6500: 73 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20  spill size. The 
6510: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e  second form turn
6520: 73 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e  s cache spill on
6530: 0a 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57  .  ** or off.  W
6540: 68 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63  hen turnning cac
6550: 68 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65  he spill on, the
6560: 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
6570: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
6580: 20 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68   cache_size.  Th
6590: 65 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74  e third form set
65a0: 73 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74  s a spill size t
65b0: 68 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  hat.  ** may be 
65c0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74  different form t
65d0: 68 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  he cache size.. 
65e0: 20 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69   ** If N is posi
65f0: 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69  tive then that i
6600: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
6610: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6620: 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69  e cache.  If N i
6630: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
6640: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
6650: 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a   of pages is adj
6660: 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  usted so that th
6670: 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20  e cache uses -N 
6680: 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f  kibibytes.  ** o
6690: 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20  f memory..  **. 
66a0: 20 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   ** If the numbe
66b0: 72 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c  r of cache_spill
66c0: 20 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74   pages is less t
66d0: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
66e0: 66 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a  f.  ** cache_siz
66f0: 65 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c  e pages, no spil
6700: 6c 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69  ling occurs unti
6710: 6c 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  l the page count
6720: 20 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68   exceeds.  ** th
6730: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
6740: 65 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20  e_size pages..  
6750: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68  **.  ** The cach
6760: 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20  e_spill=BOOLEAN 
6770: 73 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20  setting applies 
6780: 74 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  to all attached 
6790: 73 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f  schemas,.  ** no
67a0: 74 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d  t just the schem
67b0: 61 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a  a specified..  *
67c0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
67d0: 5f 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a  _CACHE_SPILL: {.
67e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
67f0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
6800: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
6810: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
6820: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
6830: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20  nSingleInt(v,.  
6840: 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67         (db->flag
6850: 73 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65  s & SQLITE_Cache
6860: 53 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20  Spill)==0 ? 0 : 
6870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6880: 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
6890: 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30  lSize(pDb->pBt,0
68a0: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
68b0: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
68c0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  1;.      if( sql
68d0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
68e0: 67 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20  ght, &size) ){. 
68f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
6900: 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
6910: 70 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b  pDb->pBt, size);
6920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6930: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
6940: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a  lean(zRight, siz
6950: 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  e!=0) ){.       
6960: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
6970: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b  LITE_CacheSpill;
6980: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6990: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
69a0: 26 3d 20 7e 28 75 36 34 29 53 51 4c 49 54 45 5f  &= ~(u64)SQLITE_
69b0: 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20 20  CacheSpill;.    
69c0: 20 20 7d 0a 20 20 20 20 20 20 73 65 74 41 6c 6c    }.      setAll
69d0: 50 61 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a  PagerFlags(db);.
69e0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
69f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
6a00: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
6a10: 5d 6d 6d 61 70 5f 73 69 7a 65 28 4e 29 0a 20 20  ]mmap_size(N).  
6a20: 2a 2a 0a 20 20 2a 2a 20 55 73 65 64 20 74 6f 20  **.  ** Used to 
6a30: 73 65 74 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  set mapping size
6a40: 20 6c 69 6d 69 74 2e 20 54 68 65 20 6d 61 70 70   limit. The mapp
6a50: 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 20 69  ing size limit i
6a60: 73 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 6c  s.  ** used to l
6a70: 69 6d 69 74 20 74 68 65 20 61 67 67 72 65 67 61  imit the aggrega
6a80: 74 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 6d  te size of all m
6a90: 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65 67  emory mapped reg
6aa0: 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ions of the.  **
6ab0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
6ac0: 49 66 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  If this paramete
6ad0: 72 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  r is set to zero
6ae0: 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
6af0: 70 70 69 6e 67 0a 20 20 2a 2a 20 69 73 20 6e 6f  pping.  ** is no
6b00: 74 20 75 73 65 64 20 61 74 20 61 6c 6c 2e 20 20  t used at all.  
6b10: 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65  If N is negative
6b20: 2c 20 74 68 65 6e 20 74 68 65 20 64 65 66 61 75  , then the defau
6b30: 6c 74 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20 20  lt memory map.  
6b40: 2a 2a 20 6c 69 6d 69 74 20 64 65 74 65 72 6d 69  ** limit determi
6b50: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63  ned by sqlite3_c
6b60: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
6b70: 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 29 20 69  FIG_MMAP_SIZE) i
6b80: 73 20 73 65 74 2e 0a 20 20 2a 2a 20 54 68 65 20  s set..  ** The 
6b90: 70 61 72 61 6d 65 74 65 72 20 4e 20 69 73 20 6d  parameter N is m
6ba0: 65 61 73 75 72 65 64 20 69 6e 20 62 79 74 65 73  easured in bytes
6bb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
6bc0: 20 76 61 6c 75 65 20 69 73 20 61 64 76 69 73 6f   value is adviso
6bd0: 72 79 2e 20 20 54 68 65 20 75 6e 64 65 72 6c 79  ry.  The underly
6be0: 69 6e 67 20 56 46 53 20 69 73 20 66 72 65 65 20  ing VFS is free 
6bf0: 74 6f 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20 20  to memory map.  
6c00: 2a 2a 20 61 73 20 6c 69 74 74 6c 65 20 6f 72 20  ** as little or 
6c10: 61 73 20 6d 75 63 68 20 61 73 20 69 74 20 77 61  as much as it wa
6c20: 6e 74 73 2e 20 20 45 78 63 65 70 74 2c 20 69 66  nts.  Except, if
6c30: 20 4e 20 69 73 20 73 65 74 20 74 6f 20 30 20 74   N is set to 0 t
6c40: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 75 70 70  hen the.  ** upp
6c50: 65 72 20 6c 61 79 65 72 73 20 77 69 6c 6c 20 6e  er layers will n
6c60: 65 76 65 72 20 69 6e 76 6f 6b 65 20 74 68 65 20  ever invoke the 
6c70: 78 46 65 74 63 68 20 69 6e 74 65 72 66 61 63 65  xFetch interface
6c80: 73 20 74 6f 20 74 68 65 20 56 46 53 2e 0a 20 20  s to the VFS..  
6c90: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
6ca0: 70 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  p_MMAP_SIZE: {. 
6cb0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
6cc0: 20 73 7a 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f   sz;.#if SQLITE_
6cd0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
6ce0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
6cf0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
6d00: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
6d10: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
6d20: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
6d30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
6d40: 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69  ecOrHexToI64(zRi
6d50: 67 68 74 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20  ght, &sz);.     
6d60: 20 69 66 28 20 73 7a 3c 30 20 29 20 73 7a 20 3d   if( sz<0 ) sz =
6d70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
6d80: 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 20  nfig.szMmap;.   
6d90: 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d     if( pId2->n==
6da0: 30 20 29 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d  0 ) db->szMmap =
6db0: 20 73 7a 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   sz;.      for(i
6dc0: 69 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e  i=db->nDb-1; ii>
6dd0: 3d 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20  =0; ii--){.     
6de0: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
6df0: 69 5d 2e 70 42 74 20 26 26 20 28 69 69 3d 3d 69  i].pBt && (ii==i
6e00: 44 62 20 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30  Db || pId2->n==0
6e10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
6e20: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
6e30: 61 70 4c 69 6d 69 74 28 64 62 2d 3e 61 44 62 5b  apLimit(db->aDb[
6e40: 69 69 5d 2e 70 42 74 2c 20 73 7a 29 3b 0a 20 20  ii].pBt, sz);.  
6e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6e60: 20 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20 2d      }.    sz = -
6e70: 31 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  1;.    rc = sqli
6e80: 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
6e90: 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45  (db, zDb, SQLITE
6ea0: 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
6eb0: 2c 20 26 73 7a 29 3b 0a 23 65 6c 73 65 0a 20 20  , &sz);.#else.  
6ec0: 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 72 63    sz = 0;.    rc
6ed0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
6ee0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 3d  ndif.    if( rc=
6ef0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6f00: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
6f10: 49 6e 74 28 76 2c 20 73 7a 29 3b 0a 20 20 20 20  Int(v, sz);.    
6f20: 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
6f30: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
6f40: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
6f50: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Err++;.      pPa
6f60: 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
6f70: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
6f80: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
6f90: 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
6fa0: 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  e.  **   PRAGMA 
6fb0: 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 22 64 65  temp_store = "de
6fc0: 66 61 75 6c 74 22 7c 22 6d 65 6d 6f 72 79 22 7c  fault"|"memory"|
6fd0: 22 66 69 6c 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a  "file".  **.  **
6fe0: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
6ff0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f  he local value o
7000: 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65  f the temp_store
7010: 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
7020: 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20  .  ** the local 
7030: 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d  value does not m
7040: 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ake changes to t
7050: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64  he disk file and
7060: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a   the default.  *
7070: 2a 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  * value will be 
7080: 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78  restored the nex
7090: 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62  t time the datab
70a0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2e 0a 20  ase is opened.. 
70b0: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
70c0: 61 74 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  at it is possibl
70d0: 65 20 66 6f 72 20 74 68 65 20 6c 69 62 72 61 72  e for the librar
70e0: 79 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  y compile-time o
70f0: 70 74 69 6f 6e 73 20 74 6f 0a 20 20 2a 2a 20 6f  ptions to.  ** o
7100: 76 65 72 72 69 64 65 20 74 68 69 73 20 73 65 74  verride this set
7110: 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ting.  */.  case
7120: 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53 54   PragTyp_TEMP_ST
7130: 4f 52 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21  ORE: {.    if( !
7140: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
7150: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
7160: 76 2c 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  v, db->temp_stor
7170: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
7180: 20 20 20 20 20 63 68 61 6e 67 65 54 65 6d 70 53       changeTempS
7190: 74 6f 72 61 67 65 28 70 50 61 72 73 65 2c 20 7a  torage(pParse, z
71a0: 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20  Right);.    }.  
71b0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
71c0: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
71d0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
71e0: 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52 41  ctory.  **   PRA
71f0: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
7200: 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c 22 64  irectory = ""|"d
7210: 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a 20  irectory_name". 
7220: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
7230: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
7240: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65   value of the te
7250: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
7260: 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69  ry flag.  Changi
7270: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  ng.  ** the valu
7280: 65 20 73 65 74 73 20 61 20 73 70 65 63 69 66 69  e sets a specifi
7290: 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 62  c directory to b
72a0: 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f  e used for tempo
72b0: 72 61 72 79 20 66 69 6c 65 73 2e 0a 20 20 2a 2a  rary files..  **
72c0: 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75   Setting to a nu
72d0: 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74  ll string revert
72e0: 73 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  s to the default
72f0: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
7300: 74 6f 72 79 20 73 65 61 72 63 68 2e 0a 20 20 2a  tory search..  *
7310: 2a 20 49 66 20 74 65 6d 70 6f 72 61 72 79 20 64  * If temporary d
7320: 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e  irectory is chan
7330: 67 65 64 2c 20 74 68 65 6e 20 69 6e 76 61 6c 69  ged, then invali
7340: 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 2e  dateTempStorage.
7350: 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73  .  **.  */.  cas
7360: 65 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53  e PragTyp_TEMP_S
7370: 54 4f 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20  TORE_DIRECTORY: 
7380: 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  {.    if( !zRigh
7390: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
73a0: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 73  nSingleText(v, s
73b0: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
73c0: 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73  ctory);.    }els
73d0: 65 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e{.#ifndef SQLIT
73e0: 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20  E_OMIT_WSD.     
73f0: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
7400: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
7410: 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
7420: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
7430: 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68 74  db->pVfs, zRight
7440: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
7450: 52 45 41 44 57 52 49 54 45 2c 20 26 72 65 73 29  READWRITE, &res)
7460: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
7470: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  !=SQLITE_OK || r
7480: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
7490: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
74a0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20  sg(pParse, "not 
74b0: 61 20 77 72 69 74 61 62 6c 65 20 64 69 72 65 63  a writable direc
74c0: 74 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20  tory");.        
74d0: 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75    goto pragma_ou
74e0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
74f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 53     }.      if( S
7500: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
7510: 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 53  ==0.       || (S
7520: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
7530: 3d 3d 31 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f  ==1 && db->temp_
7540: 73 74 6f 72 65 3c 3d 31 29 0a 20 20 20 20 20 20  store<=1).      
7550: 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d 50   || (SQLITE_TEMP
7560: 5f 53 54 4f 52 45 3d 3d 32 20 26 26 20 64 62 2d  _STORE==2 && db-
7570: 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 31 29 0a  >temp_store==1).
7580: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
7590: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
75a0: 74 6f 72 61 67 65 28 70 50 61 72 73 65 29 3b 0a  torage(pParse);.
75b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
75c0: 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69 74  lite3_free(sqlit
75d0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
75e0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  y);.      if( zR
75f0: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
7600: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f     sqlite3_temp_
7610: 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c 69  directory = sqli
7620: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
7630: 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , zRight);.     
7640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7650: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
7660: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20  ectory = 0;.    
7670: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
7680: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a 2f  LITE_OMIT_WSD */
7690: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
76a0: 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ;.  }..#if SQLIT
76b0: 45 5f 4f 53 5f 57 49 4e 0a 20 20 2f 2a 0a 20 20  E_OS_WIN.  /*.  
76c0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 64 61 74 61  **   PRAGMA data
76d0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
76e0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 64  .  **   PRAGMA d
76f0: 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  ata_store_direct
7700: 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74  ory = ""|"direct
7710: 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20  ory_name".  **. 
7720: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
7730: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
7740: 65 20 6f 66 20 74 68 65 20 64 61 74 61 5f 73 74  e of the data_st
7750: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c  ore_directory fl
7760: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7770: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7780: 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72  s a specific dir
7790: 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65  ectory to be use
77a0: 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  d for database f
77b0: 69 6c 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 77  iles that.  ** w
77c0: 65 72 65 20 73 70 65 63 69 66 69 65 64 20 77 69  ere specified wi
77d0: 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
77e0: 74 68 6e 61 6d 65 2e 20 20 53 65 74 74 69 6e 67  thname.  Setting
77f0: 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e   to a null strin
7800: 67 20 72 65 76 65 72 74 73 0a 20 20 2a 2a 20 74  g reverts.  ** t
7810: 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 61  o the default da
7820: 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  tabase directory
7830: 2c 20 77 68 69 63 68 20 66 6f 72 20 64 61 74 61  , which for data
7840: 62 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69  base files speci
7850: 66 69 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 61  fied with.  ** a
7860: 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 77   relative path w
7870: 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 62 65 20  ill probably be 
7880: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72  based on the cur
7890: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 66  rent directory f
78a0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63  or the.  ** proc
78b0: 65 73 73 2e 20 20 44 61 74 61 62 61 73 65 20 66  ess.  Database f
78c0: 69 6c 65 20 73 70 65 63 69 66 69 65 64 20 77 69  ile specified wi
78d0: 74 68 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  th an absolute p
78e0: 61 74 68 20 61 72 65 20 6e 6f 74 20 69 6d 70 61  ath are not impa
78f0: 63 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 69  cted.  ** by thi
7900: 73 20 73 65 74 74 69 6e 67 2c 20 72 65 67 61 72  s setting, regar
7910: 64 6c 65 73 73 20 6f 66 20 69 74 73 20 76 61 6c  dless of its val
7920: 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20  ue..  **.  */.  
7930: 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 41 54  case PragTyp_DAT
7940: 41 5f 53 54 4f 52 45 5f 44 49 52 45 43 54 4f 52  A_STORE_DIRECTOR
7950: 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52  Y: {.    if( !zR
7960: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65  ight ){.      re
7970: 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76  turnSingleText(v
7980: 2c 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  , sqlite3_data_d
7990: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d  irectory);.    }
79a0: 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51  else{.#ifndef SQ
79b0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
79c0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
79d0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ] ){.        int
79e0: 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
79f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
7a00: 73 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69  ss(db->pVfs, zRi
7a10: 67 68 74 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ght, SQLITE_ACCE
7a20: 53 53 5f 52 45 41 44 57 52 49 54 45 2c 20 26 72  SS_READWRITE, &r
7a30: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
7a40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
7a50: 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  | res==0 ){.    
7a60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7a70: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
7a80: 6f 74 20 61 20 77 72 69 74 61 62 6c 65 20 64 69  ot a writable di
7a90: 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20  rectory");.     
7aa0: 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61       goto pragma
7ab0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
7ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
7ad0: 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69 74  lite3_free(sqlit
7ae0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7af0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  y);.      if( zR
7b00: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
7b10: 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
7b20: 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c 69  directory = sqli
7b30: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
7b40: 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , zRight);.     
7b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7b60: 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
7b70: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20  ectory = 0;.    
7b80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
7b90: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a 2f  LITE_OMIT_WSD */
7ba0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
7bb0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
7bc0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7bd0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
7be0: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
7bf0: 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70   [schema.]lock_p
7c00: 72 6f 78 79 5f 66 69 6c 65 0a 20 20 2a 2a 20 20  roxy_file.  **  
7c10: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
7c20: 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
7c30: 20 3d 20 22 3a 61 75 74 6f 3a 22 7c 22 6c 6f 63   = ":auto:"|"loc
7c40: 6b 5f 66 69 6c 65 5f 70 61 74 68 22 0a 20 20 2a  k_file_path".  *
7c50: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72  *.  ** Return or
7c60: 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   set the value o
7c70: 66 20 74 68 65 20 6c 6f 63 6b 5f 70 72 6f 78 79  f the lock_proxy
7c80: 5f 66 69 6c 65 20 66 6c 61 67 2e 20 20 43 68 61  _file flag.  Cha
7c90: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76  nging.  ** the v
7ca0: 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63  alue sets a spec
7cb0: 69 66 69 63 20 66 69 6c 65 20 74 6f 20 62 65 20  ific file to be 
7cc0: 75 73 65 64 20 66 6f 72 20 64 61 74 61 62 61 73  used for databas
7cd0: 65 20 61 63 63 65 73 73 20 6c 6f 63 6b 73 2e 0a  e access locks..
7ce0: 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65    **.  */.  case
7cf0: 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 50 52   PragTyp_LOCK_PR
7d00: 4f 58 59 5f 46 49 4c 45 3a 20 7b 0a 20 20 20 20  OXY_FILE: {.    
7d10: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
7d20: 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67       Pager *pPag
7d30: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
7d40: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
7d50: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 72  ;.      char *pr
7d60: 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 20 3d 20  oxy_file_path = 
7d70: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 73 71 6c 69  NULL;.      sqli
7d80: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20  te3_file *pFile 
7d90: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
7da0: 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  le(pPager);.    
7db0: 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
7dc0: 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65  ontrolHint(pFile
7dd0: 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
7de0: 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20  KPROXYFILE, .   
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 20 20 20 20 20 20 20 26 70 72 6f 78 79 5f 66          &proxy_f
7e10: 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20 20 20  ile_path);.     
7e20: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
7e30: 74 28 76 2c 20 70 72 6f 78 79 5f 66 69 6c 65 5f  t(v, proxy_file_
7e40: 70 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65  path);.    }else
7e50: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
7e60: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
7e70: 74 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70  treePager(pDb->p
7e80: 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Bt);.      sqlit
7e90: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d  e3_file *pFile =
7ea0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
7eb0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
7ec0: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
7ed0: 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b  if( zRight[0] ){
7ee0: 0a 20 20 20 20 20 20 20 20 72 65 73 3d 73 71 6c  .        res=sql
7ef0: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
7f00: 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  l(pFile, SQLITE_
7f10: 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
7f20: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
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 7a 52 69 67 68 74 29           zRight)
7f50: 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
7f60: 0a 20 20 20 20 20 20 20 20 72 65 73 3d 73 71 6c  .        res=sql
7f70: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
7f80: 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  l(pFile, SQLITE_
7f90: 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
7fa0: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
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 4e 55 4c 4c 29 3b 0a           NULL);.
7fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7fe0: 28 20 72 65 73 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( res!=SQLITE_OK
7ff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8000: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8010: 73 65 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73  se, "failed to s
8020: 65 74 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69  et lock proxy fi
8030: 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  le");.        go
8040: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
8050: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8060: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
8070: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
8080: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
8090: 45 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 0a  E */      .    .
80a0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
80b0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63  MA [schema.]sync
80c0: 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 20 50  hronous.  **   P
80d0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73  RAGMA [schema.]s
80e0: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 7c 4f  ynchronous=OFF|O
80f0: 4e 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 7c 45 58  N|NORMAL|FULL|EX
8100: 54 52 41 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  TRA.  **.  ** Re
8110: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
8120: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  local value of t
8130: 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66  he synchronous f
8140: 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20  lag.  Changing. 
8150: 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76 61   ** the local va
8160: 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b  lue does not mak
8170: 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
8180: 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20 74   disk file and t
8190: 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
81a0: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65  value will be re
81b0: 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74 20  stored the next 
81c0: 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
81d0: 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65 64  e is.  ** opened
81e0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
81f0: 61 67 54 79 70 5f 53 59 4e 43 48 52 4f 4e 4f 55  agTyp_SYNCHRONOU
8200: 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52  S: {.    if( !zR
8210: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65  ight ){.      re
8220: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
8230: 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
8240: 65 6c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  el-1);.    }else
8250: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d  {.      if( !db-
8260: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
8270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
8280: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
8290: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 61 66              "Saf
82a0: 65 74 79 20 6c 65 76 65 6c 20 6d 61 79 20 6e 6f  ety level may no
82b0: 74 20 62 65 20 63 68 61 6e 67 65 64 20 69 6e 73  t be changed ins
82c0: 69 64 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ide a transactio
82d0: 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n");.      }else
82e0: 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20   if( iDb!=1 ){. 
82f0: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 76 65         int iLeve
8300: 6c 20 3d 20 28 67 65 74 53 61 66 65 74 79 4c 65  l = (getSafetyLe
8310: 76 65 6c 28 7a 52 69 67 68 74 2c 30 2c 31 29 2b  vel(zRight,0,1)+
8320: 31 29 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  1) & PAGER_SYNCH
8330: 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 20  RONOUS_MASK;.   
8340: 20 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3d       if( iLevel=
8350: 3d 30 20 29 20 69 4c 65 76 65 6c 20 3d 20 31 3b  =0 ) iLevel = 1;
8360: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61  .        pDb->sa
8370: 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 69 4c 65  fety_level = iLe
8380: 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 70 44 62  vel;.        pDb
8390: 2d 3e 62 53 79 6e 63 53 65 74 20 3d 20 31 3b 0a  ->bSyncSet = 1;.
83a0: 20 20 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61          setAllPa
83b0: 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20  gerFlags(db);.  
83c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
83d0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
83e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
83f0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a  _PAGER_PRAGMAS *
8400: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
8410: 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47  E_OMIT_FLAG_PRAG
8420: 4d 41 53 0a 20 20 63 61 73 65 20 50 72 61 67 54  MAS.  case PragT
8430: 79 70 5f 46 4c 41 47 3a 20 7b 0a 20 20 20 20 69  yp_FLAG: {.    i
8440: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( zRight==0 ){.
8450: 20 20 20 20 20 20 73 65 74 50 72 61 67 6d 61 52        setPragmaR
8460: 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  esultColumnNames
8470: 28 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20  (v, pPragma);.  
8480: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
8490: 49 6e 74 28 76 2c 20 28 64 62 2d 3e 66 6c 61 67  Int(v, (db->flag
84a0: 73 20 26 20 70 50 72 61 67 6d 61 2d 3e 69 41 72  s & pPragma->iAr
84b0: 67 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  g)!=0 );.    }el
84c0: 73 65 7b 0a 20 20 20 20 20 20 75 36 34 20 6d 61  se{.      u64 ma
84d0: 73 6b 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41  sk = pPragma->iA
84e0: 72 67 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  rg;    /* Mask o
84f0: 66 20 62 69 74 73 20 74 6f 20 73 65 74 20 6f 72  f bits to set or
8500: 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 20 20 20   clear. */.     
8510: 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
8520: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
8530: 20 20 2f 2a 20 46 6f 72 65 69 67 6e 20 6b 65 79    /* Foreign key
8540: 20 73 75 70 70 6f 72 74 20 6d 61 79 20 6e 6f 74   support may not
8550: 20 62 65 20 65 6e 61 62 6c 65 64 20 6f 72 20 64   be enabled or d
8560: 69 73 61 62 6c 65 64 20 77 68 69 6c 65 20 6e 6f  isabled while no
8570: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
8580: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65  auto-commit mode
8590: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61  .  */.        ma
85a0: 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 46  sk &= ~(SQLITE_F
85b0: 6f 72 65 69 67 6e 4b 65 79 73 29 3b 0a 20 20 20  oreignKeys);.   
85c0: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
85d0: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
85e0: 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 64 62  ION.      if( db
85f0: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
8600: 3d 3d 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a  ==UAUTH_User ){.
8610: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
8620: 74 20 61 6c 6c 6f 77 20 6e 6f 6e 2d 61 64 6d 69  t allow non-admi
8630: 6e 20 75 73 65 72 73 20 74 6f 20 6d 6f 64 69 66  n users to modif
8640: 79 20 74 68 65 20 73 63 68 65 6d 61 20 61 72 62  y the schema arb
8650: 69 74 72 61 72 69 6c 79 20 2a 2f 0a 20 20 20 20  itrarily */.    
8660: 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53 51      mask &= ~(SQ
8670: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
8680: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
8690: 66 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  f..      if( sql
86a0: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
86b0: 52 69 67 68 74 2c 20 30 29 20 29 7b 0a 20 20 20  Right, 0) ){.   
86c0: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
86d0: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 65  = mask;.      }e
86e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  lse{.        db-
86f0: 3e 66 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  >flags &= ~mask;
8700: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 61 73  .        if( mas
8710: 6b 3d 3d 53 51 4c 49 54 45 5f 44 65 66 65 72 46  k==SQLITE_DeferF
8720: 4b 73 20 29 20 64 62 2d 3e 6e 44 65 66 65 72 72  Ks ) db->nDeferr
8730: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
8740: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
8750: 20 4d 61 6e 79 20 6f 66 20 74 68 65 20 66 6c 61   Many of the fla
8760: 67 2d 70 72 61 67 6d 61 73 20 6d 6f 64 69 66 79  g-pragmas modify
8770: 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
8780: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 0a  ted by the SQL .
8790: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
87a0: 72 20 28 65 67 2e 20 63 6f 75 6e 74 5f 63 68 61  r (eg. count_cha
87b0: 6e 67 65 73 29 2e 20 53 6f 20 61 64 64 20 61 6e  nges). So add an
87c0: 20 6f 70 63 6f 64 65 20 74 6f 20 65 78 70 69 72   opcode to expir
87d0: 65 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 63  e all.      ** c
87e0: 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73 74 61 74  ompiled SQL stat
87f0: 65 6d 65 6e 74 73 20 61 66 74 65 72 20 6d 6f 64  ements after mod
8800: 69 66 79 69 6e 67 20 61 20 70 72 61 67 6d 61 20  ifying a pragma 
8810: 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  value..      */.
8820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8830: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78  eAddOp0(v, OP_Ex
8840: 70 69 72 65 29 3b 0a 20 20 20 20 20 20 73 65 74  pire);.      set
8850: 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 64 62  AllPagerFlags(db
8860: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
8870: 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ak;.  }.#endif /
8880: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  * SQLITE_OMIT_FL
8890: 41 47 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23  AG_PRAGMAS */..#
88a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
88b0: 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d 41  IT_SCHEMA_PRAGMA
88c0: 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  S.  /*.  **   PR
88d0: 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28  AGMA table_info(
88e0: 3c 74 61 62 6c 65 3e 29 0a 20 20 2a 2a 0a 20 20  <table>).  **.  
88f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6e 67  ** Return a sing
8900: 6c 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20  le row for each 
8910: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6e 61  column of the na
8920: 6d 65 64 20 74 61 62 6c 65 2e 20 54 68 65 20 63  med table. The c
8930: 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74  olumns of.  ** t
8940: 68 65 20 72 65 74 75 72 6e 65 64 20 64 61 74 61  he returned data
8950: 20 73 65 74 20 61 72 65 3a 0a 20 20 2a 2a 0a 20   set are:.  **. 
8960: 20 2a 2a 20 63 69 64 3a 20 20 20 20 20 20 20 20   ** cid:        
8970: 43 6f 6c 75 6d 6e 20 69 64 20 28 6e 75 6d 62 65  Column id (numbe
8980: 72 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  red from left to
8990: 20 72 69 67 68 74 2c 20 73 74 61 72 74 69 6e 67   right, starting
89a0: 20 61 74 20 30 29 0a 20 20 2a 2a 20 6e 61 6d 65   at 0).  ** name
89b0: 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e  :       Column n
89c0: 61 6d 65 0a 20 20 2a 2a 20 74 79 70 65 3a 20 20  ame.  ** type:  
89d0: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 64 65 63 6c       Column decl
89e0: 61 72 61 74 69 6f 6e 20 74 79 70 65 2e 0a 20 20  aration type..  
89f0: 2a 2a 20 6e 6f 74 6e 75 6c 6c 3a 20 20 20 20 54  ** notnull:    T
8a00: 72 75 65 20 69 66 20 27 4e 4f 54 20 4e 55 4c 4c  rue if 'NOT NULL
8a10: 27 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6c  ' is part of col
8a20: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
8a30: 20 20 2a 2a 20 64 66 6c 74 5f 76 61 6c 75 65 3a    ** dflt_value:
8a40: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
8a50: 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ue for the colum
8a60: 6e 2c 20 69 66 20 61 6e 79 2e 0a 20 20 2a 2a 20  n, if any..  ** 
8a70: 70 6b 3a 20 20 20 20 20 20 20 20 20 4e 6f 6e 2d  pk:         Non-
8a80: 7a 65 72 6f 20 66 6f 72 20 50 4b 20 66 69 65 6c  zero for PK fiel
8a90: 64 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ds..  */.  case 
8aa0: 50 72 61 67 54 79 70 5f 54 41 42 4c 45 5f 49 4e  PragTyp_TABLE_IN
8ab0: 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29  FO: if( zRight )
8ac0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
8ad0: 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  b;.    pTab = sq
8ae0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
8af0: 28 70 50 61 72 73 65 2c 20 4c 4f 43 41 54 45 5f  (pParse, LOCATE_
8b00: 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c 20 7a  NOERR, zRight, z
8b10: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Db);.    if( pTa
8b20: 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  b ){.      int i
8b30: 54 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53  TabDb = sqlite3S
8b40: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
8b50: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
8b60: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b  .      int i, k;
8b70: 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64 64  .      int nHidd
8b80: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43 6f  en = 0;.      Co
8b90: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  lumn *pCol;.    
8ba0: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
8bb0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
8bc0: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
8bd0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
8be0: 3d 20 37 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 7;.      sqlit
8bf0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
8c00: 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61 62 44  ma(pParse, iTabD
8c10: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
8c20: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
8c30: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
8c40: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
8c50: 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  , pCol=pTab->aCo
8c60: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
8c70: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
8c80: 20 20 20 20 20 20 20 69 6e 74 20 69 73 48 69 64         int isHid
8c90: 64 65 6e 20 3d 20 49 73 48 69 64 64 65 6e 43 6f  den = IsHiddenCo
8ca0: 6c 75 6d 6e 28 70 43 6f 6c 29 3b 0a 20 20 20 20  lumn(pCol);.    
8cb0: 20 20 20 20 69 66 28 20 69 73 48 69 64 64 65 6e      if( isHidden
8cc0: 20 26 26 20 70 50 72 61 67 6d 61 2d 3e 69 41 72   && pPragma->iAr
8cd0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
8ce0: 20 20 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20    nHidden++;.   
8cf0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8d00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8d10: 20 20 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f     if( (pCol->co
8d20: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
8d30: 5f 50 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a  _PRIMKEY)==0 ){.
8d40: 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b            k = 0;
8d50: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
8d60: 66 28 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20  f( pPk==0 ){.   
8d70: 20 20 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20         k = 1;.  
8d80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8d90: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20         for(k=1; 
8da0: 6b 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26  k<=pTab->nCol &&
8db0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b   pPk->aiColumn[k
8dc0: 2d 31 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20  -1]!=i; k++){}. 
8dd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8de0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70   assert( pCol->p
8df0: 44 66 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d  Dflt==0 || pCol-
8e00: 3e 70 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  >pDflt->op==TK_S
8e10: 50 41 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  PAN );.        s
8e20: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
8e30: 6f 61 64 28 76 2c 20 31 2c 20 70 50 72 61 67 6d  oad(v, 1, pPragm
8e40: 61 2d 3e 69 41 72 67 20 3f 20 22 69 73 73 69 73  a->iArg ? "issis
8e50: 69 69 22 20 3a 20 22 69 73 73 69 73 69 22 2c 0a  ii" : "issisi",.
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
8e70: 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20 20 20  -nHidden,.      
8e80: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a           pCol->z
8e90: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
8ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75       sqlite3Colu
8eb0: 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c  mnType(pCol,""),
8ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ed0: 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20  pCol->notNull ? 
8ee0: 31 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  1 : 0,.         
8ef0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c        pCol->pDfl
8f00: 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d  t ? pCol->pDflt-
8f10: 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c 0a 20  >u.zToken : 0,. 
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 2c                k,
8f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8f40: 69 73 48 69 64 64 65 6e 29 3b 0a 20 20 20 20 20  isHidden);.     
8f50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
8f60: 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66 20 53 51  reak;..#ifdef SQ
8f70: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 63 61 73  LITE_DEBUG.  cas
8f80: 65 20 50 72 61 67 54 79 70 5f 53 54 41 54 53 3a  e PragTyp_STATS:
8f90: 20 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49   {.    Index *pI
8fa0: 64 78 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d  dx;.    HashElem
8fb0: 20 2a 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   *i;.    pParse-
8fc0: 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20 73  >nMem = 5;.    s
8fd0: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
8fe0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
8ff0: 44 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73  Db);.    for(i=s
9000: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9010: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
9020: 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  lHash); i; i=sql
9030: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
9040: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
9050: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
9060: 61 74 61 28 69 29 3b 0a 20 20 20 20 20 20 73 71  ata(i);.      sq
9070: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9080: 61 64 28 76 2c 20 31 2c 20 22 73 73 69 69 69 22  ad(v, 1, "ssiii"
9090: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
90a0: 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
90b0: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
90c0: 20 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f     pTab->szTabRo
90d0: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
90e0: 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 2c 0a  ab->nRowLogEst,.
90f0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
9100: 3e 74 61 62 46 6c 61 67 73 29 3b 0a 20 20 20 20  >tabFlags);.    
9110: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
9120: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
9130: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
9140: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9150: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9160: 2c 20 32 2c 20 22 73 69 69 69 58 22 2c 0a 20 20  , 2, "siiiX",.  
9170: 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 7a           pIdx->z
9180: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
9190: 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 2c   pIdx->szIdxRow,
91a0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78  .           pIdx
91b0: 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
91c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64  ,.           pId
91d0: 78 2d 3e 68 61 73 53 74 61 74 31 29 3b 0a 20 20  x->hasStat1);.  
91e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
91f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
9200: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 35 29 3b 0a  sultRow, 1, 5);.
9210: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9220: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
9230: 66 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  f..  case PragTy
9240: 70 5f 49 4e 44 45 58 5f 49 4e 46 4f 3a 20 69 66  p_INDEX_INFO: if
9250: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
9260: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
9270: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
9280: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
9290: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 52  FindIndex(db, zR
92a0: 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ight, zDb);.    
92b0: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
92c0: 20 20 69 6e 74 20 69 49 64 78 44 62 20 3d 20 73    int iIdxDb = s
92d0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
92e0: 64 65 78 28 64 62 2c 20 70 49 64 78 2d 3e 70 53  dex(db, pIdx->pS
92f0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 69 6e  chema);.      in
9300: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d  t i;.      int m
9310: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  x;.      if( pPr
9320: 61 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20  agma->iArg ){.  
9330: 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
9340: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77  index_xinfo (new
9350: 65 72 20 76 65 72 73 69 6f 6e 20 77 69 74 68 20  er version with 
9360: 6d 6f 72 65 20 72 6f 77 73 20 61 6e 64 20 63 6f  more rows and co
9370: 6c 75 6d 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20  lumns) */.      
9380: 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f    mx = pIdx->nCo
9390: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 50  lumn;.        pP
93a0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a  arse->nMem = 6;.
93b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
93c0: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69       /* PRAGMA i
93d0: 6e 64 65 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63  ndex_info (legac
93e0: 79 20 76 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20  y version) */.  
93f0: 20 20 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d        mx = pIdx-
9400: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
9410: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
9420: 20 33 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   3;.      }.    
9430: 20 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70    pTab = pIdx->p
9440: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c  Table;.      sql
9450: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
9460: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 49 64  hema(pParse, iId
9470: 78 44 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65  xDb);.      asse
9480: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  rt( pParse->nMem
9490: 3c 3d 70 50 72 61 67 6d 61 2d 3e 6e 50 72 61 67  <=pPragma->nPrag
94a0: 43 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 66  CName );.      f
94b0: 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 3b 20 69 2b  or(i=0; i<mx; i+
94c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20  +){.        i16 
94d0: 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43  cnum = pIdx->aiC
94e0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
94f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9500: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 69  tiLoad(v, 1, "ii
9510: 73 58 22 2c 20 69 2c 20 63 6e 75 6d 2c 0a 20 20  sX", i, cnum,.  
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 20 20 20 20 20 20 20 20 20 63 6e 75 6d 3c             cnum<
9540: 30 20 3f 20 30 20 3a 20 70 54 61 62 2d 3e 61 43  0 ? 0 : pTab->aC
9550: 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 29 3b  ol[cnum].zName);
9560: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
9570: 61 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20  agma->iArg ){.  
9580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9590: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
95a0: 34 2c 20 22 69 73 69 58 22 2c 0a 20 20 20 20 20  4, "isiX",.     
95b0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 6f         pIdx->aSo
95c0: 72 74 4f 72 64 65 72 5b 69 5d 2c 0a 20 20 20 20  rtOrder[i],.    
95d0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
95e0: 43 6f 6c 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20  Coll[i],.       
95f0: 20 20 20 20 20 69 3c 70 49 64 78 2d 3e 6e 4b 65       i<pIdx->nKe
9600: 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  yCol);.        }
9610: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9620: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9630: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 70  _ResultRow, 1, p
9640: 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
9650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9660: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65    break;..  case
9670: 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f 4c   PragTyp_INDEX_L
9680: 49 53 54 3a 20 69 66 28 20 7a 52 69 67 68 74 20  IST: if( zRight 
9690: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
96a0: 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  dx;.    Table *p
96b0: 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  Tab;.    int i;.
96c0: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
96d0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
96e0: 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20  zRight, zDb);.  
96f0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
9700: 20 20 20 20 69 6e 74 20 69 54 61 62 44 62 20 3d      int iTabDb =
9710: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
9720: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
9730: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
9740: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35  pParse->nMem = 5
9750: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
9760: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
9770: 70 50 61 72 73 65 2c 20 69 54 61 62 44 62 29 3b  pParse, iTabDb);
9780: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
9790: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 69 3d  pTab->pIndex, i=
97a0: 30 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  0; pIdx; pIdx=pI
97b0: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
97c0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
97d0: 68 61 72 20 2a 61 7a 4f 72 69 67 69 6e 5b 5d 20  har *azOrigin[] 
97e0: 3d 20 7b 20 22 63 22 2c 20 22 75 22 2c 20 22 70  = { "c", "u", "p
97f0: 6b 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 73 71  k" };.        sq
9800: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9810: 61 64 28 76 2c 20 31 2c 20 22 69 73 69 73 69 22  ad(v, 1, "isisi"
9820: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 69 2c 0a  ,.           i,.
9830: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
9840: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
9850: 20 20 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78     IsUniqueIndex
9860: 28 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20  (pIdx),.        
9870: 20 20 20 61 7a 4f 72 69 67 69 6e 5b 70 49 64 78     azOrigin[pIdx
9880: 2d 3e 69 64 78 54 79 70 65 5d 2c 0a 20 20 20 20  ->idxType],.    
9890: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 70 50 61         pIdx->pPa
98a0: 72 74 49 64 78 57 68 65 72 65 21 3d 30 29 3b 0a  rtIdxWhere!=0);.
98b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
98c0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61  }.  break;..  ca
98d0: 73 65 20 50 72 61 67 54 79 70 5f 44 41 54 41 42  se PragTyp_DATAB
98e0: 41 53 45 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20  ASE_LIST: {.    
98f0: 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72 73  int i;.    pPars
9900: 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20  e->nMem = 3;.   
9910: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
9920: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
9930: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
9940: 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  pBt==0 ) continu
9950: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
9960: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53   db->aDb[i].zDbS
9970: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20  Name!=0 );.     
9980: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
9990: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 73  iLoad(v, 1, "iss
99a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 69 2c 0a 20  ",.         i,. 
99b0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
99c0: 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 0a 20 20 20  i].zDbSName,.   
99d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
99e0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
99f0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a  ->aDb[i].pBt));.
9a00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9a10: 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  k;..  case PragT
9a20: 79 70 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4c 49 53  yp_COLLATION_LIS
9a30: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  T: {.    int i =
9a40: 20 30 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d   0;.    HashElem
9a50: 20 2a 70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   *p;.    pParse-
9a60: 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66  >nMem = 2;.    f
9a70: 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46  or(p=sqliteHashF
9a80: 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  irst(&db->aCollS
9a90: 65 71 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  eq); p; p=sqlite
9aa0: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
9ab0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9ac0: 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29  ll = (CollSeq *)
9ad0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
9ae0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9af0: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9b00: 20 31 2c 20 22 69 73 22 2c 20 69 2b 2b 2c 20 70   1, "is", i++, p
9b10: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
9b20: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9b30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9b40: 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52  INTROSPECTION_PR
9b50: 41 47 4d 41 53 0a 20 20 63 61 73 65 20 50 72 61  AGMAS.  case Pra
9b60: 67 54 79 70 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49  gTyp_FUNCTION_LI
9b70: 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ST: {.    int i;
9b80: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a  .    HashElem *j
9b90: 3b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  ;.    FuncDef *p
9ba0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
9bb0: 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28  em = 2;.    for(
9bc0: 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 46 55  i=0; i<SQLITE_FU
9bd0: 4e 43 5f 48 41 53 48 5f 53 5a 3b 20 69 2b 2b 29  NC_HASH_SZ; i++)
9be0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71  {.      for(p=sq
9bf0: 6c 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63  lite3BuiltinFunc
9c00: 74 69 6f 6e 73 2e 61 5b 69 5d 3b 20 70 3b 20 70  tions.a[i]; p; p
9c10: 3d 70 2d 3e 75 2e 70 48 61 73 68 20 29 7b 0a 20  =p->u.pHash ){. 
9c20: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 75         if( p->fu
9c30: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
9c40: 5f 46 55 4e 43 5f 49 4e 54 45 52 4e 41 4c 20 29  _FUNC_INTERNAL )
9c50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9c60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9c70: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
9c80: 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 31 29  i", p->zName, 1)
9c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9ca0: 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65      for(j=sqlite
9cb0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9cc0: 46 75 6e 63 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69  Func); j; j=sqli
9cd0: 74 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a  teHashNext(j)){.
9ce0: 20 20 20 20 20 20 70 20 3d 20 28 46 75 6e 63 44        p = (FuncD
9cf0: 65 66 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  ef*)sqliteHashDa
9d00: 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ta(j);.      sql
9d10: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9d20: 64 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d  d(v, 1, "si", p-
9d30: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
9d40: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
9d50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9d60: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
9d70: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9d80: 4d 4f 44 55 4c 45 5f 4c 49 53 54 3a 20 7b 0a 20  MODULE_LIST: {. 
9d90: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a     HashElem *j;.
9da0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
9db0: 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 1;.    for(j=
9dc0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
9dd0: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 6a  &db->aModule); j
9de0: 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; j=sqliteHashNe
9df0: 78 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 4d 6f  xt(j)){.      Mo
9e00: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
9e10: 64 75 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  dule*)sqliteHash
9e20: 44 61 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 69  Data(j);.      i
9e30: 66 28 20 70 4d 6f 64 2d 3e 62 44 69 73 61 62 6c  f( pMod->bDisabl
9e40: 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ed ) continue;. 
9e50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9e60: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
9e70: 22 73 22 2c 20 70 4d 6f 64 2d 3e 7a 4e 61 6d 65  "s", pMod->zName
9e80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  );.    }.  }.  b
9e90: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  reak;.#endif /* 
9ea0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9eb0: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 63  UALTABLE */..  c
9ec0: 61 73 65 20 50 72 61 67 54 79 70 5f 50 52 41 47  ase PragTyp_PRAG
9ed0: 4d 41 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69  MA_LIST: {.    i
9ee0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
9ef0: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
9f00: 50 72 61 67 6d 61 4e 61 6d 65 29 3b 20 69 2b 2b  PragmaName); i++
9f10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9f20: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9f30: 20 31 2c 20 22 73 22 2c 20 61 50 72 61 67 6d 61   1, "s", aPragma
9f40: 4e 61 6d 65 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Name[i].zName);.
9f50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9f60: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
9f70: 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f  ITE_INTROSPECTIO
9f80: 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 65  N_PRAGMAS */..#e
9f90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9fa0: 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d  MIT_SCHEMA_PRAGM
9fb0: 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  AS */..#ifndef S
9fc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
9fd0: 47 4e 5f 4b 45 59 0a 20 20 63 61 73 65 20 50 72  GN_KEY.  case Pr
9fe0: 61 67 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45  agTyp_FOREIGN_KE
9ff0: 59 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52 69 67  Y_LIST: if( zRig
a000: 68 74 20 29 7b 0a 20 20 20 20 46 4b 65 79 20 2a  ht ){.    FKey *
a010: 70 46 4b 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  pFK;.    Table *
a020: 70 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d  pTab;.    pTab =
a030: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
a040: 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  e(db, zRight, zD
a050: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
a060: 20 29 7b 0a 20 20 20 20 20 20 70 46 4b 20 3d 20   ){.      pFK = 
a070: 70 54 61 62 2d 3e 70 46 4b 65 79 3b 0a 20 20 20  pTab->pFKey;.   
a080: 20 20 20 69 66 28 20 70 46 4b 20 29 7b 0a 20 20     if( pFK ){.  
a090: 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 44 62        int iTabDb
a0a0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
a0b0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
a0c0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
a0d0: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a      int i = 0; .
a0e0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
a0f0: 6e 4d 65 6d 20 3d 20 38 3b 0a 20 20 20 20 20 20  nMem = 8;.      
a100: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
a110: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
a120: 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20 20  , iTabDb);.     
a130: 20 20 20 77 68 69 6c 65 28 70 46 4b 29 7b 0a 20     while(pFK){. 
a140: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
a150: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
a160: 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20  0; j<pFK->nCol; 
a170: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
a180: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
a190: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 69  tiLoad(v, 1, "ii
a1a0: 73 73 73 73 73 73 22 2c 0a 20 20 20 20 20 20 20  ssssss",.       
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 2c 0a 20              i,. 
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20    j,.           
a1e0: 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 7a 54 6f          pFK->zTo
a1f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a200: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
a210: 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72  pFK->aCol[j].iFr
a220: 6f 6d 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  om].zName,.     
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
a240: 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c  K->aCol[j].zCol,
a250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a260: 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70      actionName(p
a270: 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 29 2c  FK->aAction[1]),
a280: 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 2a    /* ON UPDATE *
a290: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
a2a0: 20 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28       actionName(
a2b0: 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29  pFK->aAction[0])
a2c0: 2c 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20  ,  /* ON DELETE 
a2d0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
a2e0: 20 20 20 20 20 20 22 4e 4f 4e 45 22 29 3b 0a 20        "NONE");. 
a2f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a300: 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20       ++i;.      
a310: 20 20 20 20 70 46 4b 20 3d 20 70 46 4b 2d 3e 70      pFK = pFK->p
a320: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 20 20  NextFrom;.      
a330: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a340: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
a350: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
a360: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
a370: 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23  REIGN_KEY) */..#
a380: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a390: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 23  IT_FOREIGN_KEY.#
a3a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a3b0: 49 54 5f 54 52 49 47 47 45 52 0a 20 20 63 61 73  IT_TRIGGER.  cas
a3c0: 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45 49 47  e PragTyp_FOREIG
a3d0: 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a 20 7b 0a 20  N_KEY_CHECK: {. 
a3e0: 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 20 20 20     FKey *pFK;   
a3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66            /* A f
a400: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
a410: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 54 61 62  raint */.    Tab
a420: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
a430: 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 74 61 62      /* Child tab
a440: 6c 65 20 63 6f 6e 74 61 69 6e 20 22 52 45 46 45  le contain "REFE
a450: 52 45 4e 43 45 53 22 20 6b 65 79 77 6f 72 64 20  RENCES" keyword 
a460: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 50  */.    Table *pP
a470: 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
a480: 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 74 68   Parent table th
a490: 61 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20  at child points 
a4a0: 74 6f 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  to */.    Index 
a4b0: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
a4c0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 74 68 65   /* Index in the
a4d0: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f   parent table */
a4e0: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a500: 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 6f  oop counter:  Fo
a510: 72 65 69 67 6e 20 6b 65 79 20 6e 75 6d 62 65 72  reign key number
a520: 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20   for pTab */.   
a530: 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
a540: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
a550: 63 6f 75 6e 74 65 72 3a 20 20 46 69 65 6c 64 20  counter:  Field 
a560: 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  of the foreign k
a570: 65 79 20 2a 2f 0a 20 20 20 20 48 61 73 68 45 6c  ey */.    HashEl
a580: 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
a590: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
a5a0: 3a 20 20 4e 65 78 74 20 74 61 62 6c 65 20 69 6e  :  Next table in
a5b0: 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69   schema */.    i
a5c0: 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20 20 20  nt x;           
a5d0: 20 20 20 20 20 20 2f 2a 20 72 65 73 75 6c 74 20        /* result 
a5e0: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
a5f0: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
a600: 20 20 20 20 20 20 20 2f 2a 20 33 20 72 65 67 69         /* 3 regi
a610: 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20  sters to hold a 
a620: 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
a630: 20 20 69 6e 74 20 72 65 67 4b 65 79 3b 20 20 20    int regKey;   
a640: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
a650: 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6b 65 79  ster to hold key
a660: 20 66 6f 72 20 63 68 65 63 6b 69 6e 67 20 74 68   for checking th
a670: 65 20 46 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  e FK */.    int 
a680: 72 65 67 52 6f 77 3b 20 20 20 20 20 20 20 20 20  regRow;         
a690: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
a6a0: 74 6f 20 68 6f 6c 64 20 61 20 72 6f 77 20 66 72  to hold a row fr
a6b0: 6f 6d 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 69  om pTab */.    i
a6c0: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
a6d0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
a6e0: 61 20 6c 6f 6f 70 20 63 68 65 63 6b 69 6e 67 20  a loop checking 
a6f0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 2a 2f 0a  foreign keys */.
a700: 20 20 20 20 69 6e 74 20 61 64 64 72 4f 6b 3b 20      int addrOk; 
a710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
a720: 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 6b  mp here if the k
a730: 65 79 20 69 73 20 4f 4b 20 2a 2f 0a 20 20 20 20  ey is OK */.    
a740: 69 6e 74 20 2a 61 69 43 6f 6c 73 3b 20 20 20 20  int *aiCols;    
a750: 20 20 20 20 20 20 20 2f 2a 20 63 68 69 6c 64 20         /* child 
a760: 74 6f 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e  to parent column
a770: 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 0a 20 20 20   mapping */..   
a780: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 50 61   regResult = pPa
a790: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
a7a0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
a7b0: 20 34 3b 0a 20 20 20 20 72 65 67 4b 65 79 20 3d   4;.    regKey =
a7c0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
a7d0: 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 2b 2b  .    regRow = ++
a7e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
a7f0: 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68    k = sqliteHash
a800: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
a810: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db].pSchema->tbl
a820: 48 61 73 68 29 3b 0a 20 20 20 20 77 68 69 6c 65  Hash);.    while
a830: 28 20 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ( k ){.      int
a840: 20 69 54 61 62 44 62 3b 0a 20 20 20 20 20 20 69   iTabDb;.      i
a850: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
a860: 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69       pTab = sqli
a870: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
a880: 50 61 72 73 65 2c 20 30 2c 20 7a 52 69 67 68 74  Parse, 0, zRight
a890: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , zDb);.        
a8a0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  k = 0;.      }el
a8b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  se{.        pTab
a8c0: 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
a8d0: 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
a8e0: 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65        k = sqlite
a8f0: 48 61 73 68 4e 65 78 74 28 6b 29 3b 0a 20 20 20  HashNext(k);.   
a900: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a910: 54 61 62 3d 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  Tab==0 || pTab->
a920: 70 46 4b 65 79 3d 3d 30 20 29 20 63 6f 6e 74 69  pFKey==0 ) conti
a930: 6e 75 65 3b 0a 20 20 20 20 20 20 69 54 61 62 44  nue;.      iTabD
a940: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
a950: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
a960: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
a970: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
a980: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
a990: 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20  e, iTabDb);.    
a9a0: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
a9b0: 63 6b 28 70 50 61 72 73 65 2c 20 69 54 61 62 44  ck(pParse, iTabD
a9c0: 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
a9d0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
a9e0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
a9f0: 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50 61 72  nCol+regRow>pPar
aa00: 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73  se->nMem ) pPars
aa10: 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62 2d 3e  e->nMem = pTab->
aa20: 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b 0a 20  nCol + regRow;. 
aa30: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
aa40: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
aa50: 20 69 54 61 62 44 62 2c 20 70 54 61 62 2c 20 4f   iTabDb, pTab, O
aa60: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
aa70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
aa80: 61 64 53 74 72 69 6e 67 28 76 2c 20 72 65 67 52  adString(v, regR
aa90: 65 73 75 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e 61  esult, pTab->zNa
aaa0: 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  me);.      for(i
aab0: 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46  =1, pFK=pTab->pF
aac0: 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70  Key; pFK; i++, p
aad0: 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f  FK=pFK->pNextFro
aae0: 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72  m){.        pPar
aaf0: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ent = sqlite3Fin
ab00: 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e  dTable(db, pFK->
ab10: 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20  zTo, zDb);.     
ab20: 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d     if( pParent==
ab30: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
ab40: 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a        pIdx = 0;.
ab50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
ab60: 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
ab70: 20 69 54 61 62 44 62 2c 20 70 50 61 72 65 6e 74   iTabDb, pParent
ab80: 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 50 61 72 65  ->tnum, 0, pPare
ab90: 6e 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  nt->zName);.    
aba0: 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 46      x = sqlite3F
abb0: 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50 61  kLocateIndex(pPa
abc0: 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 46  rse, pParent, pF
abd0: 4b 2c 20 26 70 49 64 78 2c 20 30 29 3b 0a 20 20  K, &pIdx, 0);.  
abe0: 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29        if( x==0 )
abf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
ac00: 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx==0 ){.     
ac10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
ac20: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
ac30: 69 2c 20 69 54 61 62 44 62 2c 20 70 50 61 72 65  i, iTabDb, pPare
ac40: 6e 74 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  nt, OP_OpenRead)
ac50: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
ac60: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
ac70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ac80: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
ac90: 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20   i, pIdx->tnum, 
aca0: 69 54 61 62 44 62 29 3b 0a 20 20 20 20 20 20 20  iTabDb);.       
acb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
acc0: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
acd0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
ace0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
acf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ad00: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   k = 0;.        
ad10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
ad20: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
ad30: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
ad40: 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 46 4b 3d 3d  >nErr>0 || pFK==
ad50: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
ad60: 46 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  FK ) break;.    
ad70: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
ad80: 61 62 3c 69 20 29 20 70 50 61 72 73 65 2d 3e 6e  ab<i ) pParse->n
ad90: 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20 61  Tab = i;.      a
ada0: 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
adb0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
adc0: 5f 52 65 77 69 6e 64 2c 20 30 29 3b 20 56 64 62  _Rewind, 0); Vdb
add0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
ade0: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46 4b      for(i=1, pFK
adf0: 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70 46  =pTab->pFKey; pF
ae00: 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d  K; i++, pFK=pFK-
ae10: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
ae20: 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73       pParent = s
ae30: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
ae40: 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44  db, pFK->zTo, zD
ae50: 62 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  b);.        pIdx
ae60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 69   = 0;.        ai
ae70: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cols = 0;.      
ae80: 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b    if( pParent ){
ae90: 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73  .          x = s
aea0: 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e  qlite3FkLocateIn
aeb0: 64 65 78 28 70 50 61 72 73 65 2c 20 70 50 61 72  dex(pParse, pPar
aec0: 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64 78 2c  ent, pFK, &pIdx,
aed0: 20 26 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20   &aiCols);.     
aee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3d 3d       assert( x==
aef0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  0 );.        }. 
af00: 20 20 20 20 20 20 20 61 64 64 72 4f 6b 20 3d 20         addrOk = 
af10: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
af20: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20  abel(pParse);.. 
af30: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
af40: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 61 64 20  te code to read 
af50: 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 76 61  the child key va
af60: 6c 75 65 73 20 69 6e 74 6f 20 72 65 67 69 73 74  lues into regist
af70: 65 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ers.        ** r
af80: 65 67 52 6f 77 2e 2e 72 65 67 52 6f 77 2b 6e 2e  egRow..regRow+n.
af90: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 63   If any of the c
afa0: 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 73 20  hild key values 
afb0: 61 72 65 20 4e 55 4c 4c 2c 20 74 68 69 73 20 0a  are NULL, this .
afc0: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 63          ** row c
afd0: 61 6e 6e 6f 74 20 63 61 75 73 65 20 61 6e 20 46  annot cause an F
afe0: 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e 20 4a 75 6d  K violation. Jum
aff0: 70 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61 64  p directly to ad
b000: 64 72 4f 6b 20 69 6e 20 0a 20 20 20 20 20 20 20  drOk in .       
b010: 20 2a 2a 20 74 68 69 73 20 63 61 73 65 2e 20 2a   ** this case. *
b020: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  /.        for(j=
b030: 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20  0; j<pFK->nCol; 
b040: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
b050: 69 6e 74 20 69 43 6f 6c 20 3d 20 61 69 43 6f 6c  int iCol = aiCol
b060: 73 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d 20 3a 20  s ? aiCols[j] : 
b070: 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72  pFK->aCol[j].iFr
b080: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  om;.          sq
b090: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
b0a0: 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
b0b0: 20 70 54 61 62 2c 20 30 2c 20 69 43 6f 6c 2c 20   pTab, 0, iCol, 
b0c0: 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20 20 20 20  regRow+j);.     
b0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b0e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
b0f0: 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a 2c 20 61  ull, regRow+j, a
b100: 64 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f 76 65  ddrOk); VdbeCove
b110: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
b120: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   }..        /* G
b130: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
b140: 71 75 65 72 79 20 74 68 65 20 70 61 72 65 6e 74  query the parent
b150: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 6d 61 74   index for a mat
b160: 63 68 69 6e 67 20 70 61 72 65 6e 74 0a 20 20 20  ching parent.   
b170: 20 20 20 20 20 2a 2a 20 6b 65 79 2e 20 49 66 20       ** key. If 
b180: 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
b190: 2c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 4f 6b  , jump to addrOk
b1a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
b1b0: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20   pIdx ){.       
b1c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b1d0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
b1e0: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 70  ecord, regRow, p
b1f0: 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65 79  FK->nCol, regKey
b200: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b210: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
b220: 6e 69 74 79 53 74 72 28 64 62 2c 70 49 64 78 29  nityStr(db,pIdx)
b230: 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a 20 20  , pFK->nCol);.  
b240: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b250: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
b260: 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c 20 61 64 64  OP_Found, i, add
b270: 72 4f 6b 2c 20 72 65 67 4b 65 79 2c 20 30 29 3b  rOk, regKey, 0);
b280: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
b290: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b2a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
b2b0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  arent ){.       
b2c0: 20 20 20 69 6e 74 20 6a 6d 70 20 3d 20 73 71 6c     int jmp = sql
b2d0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
b2e0: 64 64 72 28 76 29 2b 32 3b 0a 20 20 20 20 20 20  ddr(v)+2;.      
b2f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b300: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
b310: 52 6f 77 69 64 2c 20 69 2c 20 6a 6d 70 2c 20 72  Rowid, i, jmp, r
b320: 65 67 52 6f 77 29 3b 20 56 64 62 65 43 6f 76 65  egRow); VdbeCove
b330: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
b340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
b350: 74 6f 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20  to(v, addrOk);. 
b360: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
b370: 20 70 46 4b 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 3b   pFK->nCol==1 );
b380: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
b390: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
b3a0: 63 6f 64 65 20 74 6f 20 72 65 70 6f 72 74 20 61  code to report a
b3b0: 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 20 74  n FK violation t
b3c0: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f  o the caller. */
b3d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73  .        if( Has
b3e0: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
b3f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b400: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b410: 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 52 65  _Rowid, 0, regRe
b420: 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  sult+1);.       
b430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b450: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
b460: 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b  0, regResult+1);
b470: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
b490: 6c 74 69 4c 6f 61 64 28 76 2c 20 72 65 67 52 65  ltiLoad(v, regRe
b4a0: 73 75 6c 74 2b 32 2c 20 22 73 69 58 22 2c 20 70  sult+2, "siX", p
b4b0: 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29 3b 0a 20  FK->zTo, i-1);. 
b4c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b4d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
b4e0: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73  esultRow, regRes
b4f0: 75 6c 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ult, 4);.       
b500: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
b510: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
b520: 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Ok);.        sql
b530: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
b540: 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 7d 0a  iCols);.      }.
b550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b560: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
b570: 78 74 2c 20 30 2c 20 61 64 64 72 54 6f 70 2b 31  xt, 0, addrTop+1
b580: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
b590: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
b5a0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b5b0: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 7d   addrTop);.    }
b5c0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
b5d0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
b5e0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
b5f0: 47 47 45 52 29 20 2a 2f 0a 23 65 6e 64 69 66 20  GGER) */.#endif 
b600: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
b610: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
b620: 4b 45 59 29 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  KEY) */..  /* Re
b630: 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b 45  install the LIKE
b640: 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69   and GLOB functi
b650: 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61 6e  ons.  The varian
b660: 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20 75  t of LIKE.  ** u
b670: 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73 65  sed will be case
b680: 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e 6f   sensitive or no
b690: 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  t depending on t
b6a0: 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 63  he RHS..  */.  c
b6b0: 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 53 45  ase PragTyp_CASE
b6c0: 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 3a  _SENSITIVE_LIKE:
b6d0: 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
b6e0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
b6f0: 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75  e3RegisterLikeFu
b700: 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c 69  nctions(db, sqli
b710: 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
b720: 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d  ight, 0));.    }
b730: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23  .  }.  break;..#
b740: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49 4e  ifndef SQLITE_IN
b750: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52  TEGRITY_CHECK_ER
b760: 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65  ROR_MAX.# define
b770: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54   SQLITE_INTEGRIT
b780: 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41  Y_CHECK_ERROR_MA
b790: 58 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69  X 100.#endif..#i
b7a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b7b0: 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
b7c0: 4b 0a 20 20 2f 2a 20 20 20 20 50 52 41 47 4d 41  K.  /*    PRAGMA
b7d0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
b7e0: 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20  .  **    PRAGMA 
b7f0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28  integrity_check(
b800: 4e 29 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d  N).  **    PRAGM
b810: 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20  A quick_check.  
b820: 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75 69  **    PRAGMA qui
b830: 63 6b 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a  ck_check(N).  **
b840: 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 65  .  ** Verify the
b850: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
b860: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
b870: 0a 20 20 2a 2a 20 54 68 65 20 22 71 75 69 63 6b  .  ** The "quick
b880: 5f 63 68 65 63 6b 22 20 69 73 20 72 65 64 75 63  _check" is reduc
b890: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  ed version of . 
b8a0: 20 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f 63 68   ** integrity_ch
b8b0: 65 63 6b 20 64 65 73 69 67 6e 65 64 20 74 6f 20  eck designed to 
b8c0: 64 65 74 65 63 74 20 6d 6f 73 74 20 64 61 74 61  detect most data
b8d0: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 0a  base corruption.
b8e0: 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 74 68 65    ** without the
b8f0: 20 6f 76 65 72 68 65 61 64 20 6f 66 20 63 72 6f   overhead of cro
b900: 73 73 2d 63 68 65 63 6b 69 6e 67 20 69 6e 64 65  ss-checking inde
b910: 78 65 73 2e 20 20 51 75 69 63 6b 5f 63 68 65 63  xes.  Quick_chec
b920: 6b 0a 20 20 2a 2a 20 69 73 20 6c 69 6e 65 61 72  k.  ** is linear
b930: 20 74 69 6d 65 20 77 68 65 72 65 61 73 65 20 69   time wherease i
b940: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 69  ntegrity_check i
b950: 73 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a 2f  s O(NlogN)..  */
b960: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
b970: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 3a  INTEGRITY_CHECK:
b980: 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c   {.    int i, j,
b990: 20 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a 0a 20   addr, mxErr;.. 
b9a0: 20 20 20 69 6e 74 20 69 73 51 75 69 63 6b 20 3d     int isQuick =
b9b0: 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72   (sqlite3Tolower
b9c0: 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71 27 29  (zLeft[0])=='q')
b9d0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
b9e0: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20   PRAGMA command 
b9f0: 77 61 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  was of the form 
ba00: 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69 6e 74  "PRAGMA <db>.int
ba10: 65 67 72 69 74 79 5f 63 68 65 63 6b 22 2c 0a 20  egrity_check",. 
ba20: 20 20 20 2a 2a 20 74 68 65 6e 20 69 44 62 20 69     ** then iDb i
ba30: 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
ba40: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
ba50: 73 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  se identified by
ba60: 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e   <db>..    ** In
ba70: 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
ba80: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 64 61 74  integrity of dat
ba90: 61 62 61 73 65 20 69 44 62 20 6f 6e 6c 79 20 69  abase iDb only i
baa0: 73 20 76 65 72 69 66 69 65 64 20 62 79 0a 20 20  s verified by.  
bab0: 20 20 2a 2a 20 74 68 65 20 56 44 42 45 20 63 72    ** the VDBE cr
bac0: 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20 20 20  eated below..   
bad0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72   **.    ** Other
bae0: 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6d  wise, if the com
baf0: 6d 61 6e 64 20 77 61 73 20 73 69 6d 70 6c 79 20  mand was simply 
bb00: 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  "PRAGMA integrit
bb10: 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20 20 20  y_check" (or.   
bb20: 20 2a 2a 20 22 50 52 41 47 4d 41 20 71 75 69 63   ** "PRAGMA quic
bb30: 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68 65 6e 20  k_check"), then 
bb40: 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 30 2e  iDb is set to 0.
bb50: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
bb60: 65 74 20 69 44 62 0a 20 20 20 20 2a 2a 20 74 6f  et iDb.    ** to
bb70: 20 2d 31 20 68 65 72 65 2c 20 74 6f 20 69 6e 64   -1 here, to ind
bb80: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 56  icate that the V
bb90: 44 42 45 20 73 68 6f 75 6c 64 20 76 65 72 69 66  DBE should verif
bba0: 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 0a  y the integrity.
bbb0: 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 61 74      ** of all at
bbc0: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
bbd0: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
bbe0: 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20  ( iDb>=0 );.    
bbf0: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 7c  assert( iDb==0 |
bc00: 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20 20 20  | pId2->z );.   
bc10: 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d 30 20   if( pId2->z==0 
bc20: 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20 20 20  ) iDb = -1;..   
bc30: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
bc40: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
bc50: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
bc60: 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a  Mem = 6;..    /*
bc70: 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
bc80: 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a   error count */.
bc90: 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49      mxErr = SQLI
bca0: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
bcb0: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20  CK_ERROR_MAX;.  
bcc0: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
bcd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
bce0: 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 6d  Int32(zRight, &m
bcf0: 78 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28  xErr);.      if(
bd00: 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20 20   mxErr<=0 ){.   
bd10: 20 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c       mxErr = SQL
bd20: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
bd30: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20  ECK_ERROR_MAX;. 
bd40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
bd50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bd60: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
bd70: 2c 20 6d 78 45 72 72 2d 31 2c 20 31 29 3b 20 2f  , mxErr-1, 1); /
bd80: 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20 65  * reg[1] holds e
bd90: 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a 20  rrors left */.. 
bda0: 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65     /* Do an inte
bdb0: 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6e 20 65  grity check on e
bdc0: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
bdd0: 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  e */.    for(i=0
bde0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
bdf0: 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c 65  ){.      HashEle
be00: 6d 20 2a 78 3b 20 20 20 20 20 2f 2a 20 46 6f 72  m *x;     /* For
be10: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
be20: 62 6c 65 73 20 69 6e 20 74 68 65 20 73 63 68 65  bles in the sche
be30: 6d 61 20 2a 2f 0a 20 20 20 20 20 20 48 61 73 68  ma */.      Hash
be40: 20 2a 70 54 62 6c 73 3b 20 20 20 20 20 2f 2a 20   *pTbls;     /* 
be50: 53 65 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  Set of all table
be60: 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  s in the schema 
be70: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 52  */.      int *aR
be80: 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 72  oot;      /* Arr
be90: 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 20  ay of root page 
bea0: 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20 62  numbers of all b
beb0: 74 72 65 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  trees */.      i
bec0: 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20  nt cnt = 0;     
bed0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
bee0: 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20  ries in aRoot[] 
bef0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 49  */.      int mxI
bf00: 64 78 20 3d 20 30 3b 20 20 20 2f 2a 20 4d 61 78  dx = 0;   /* Max
bf10: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
bf20: 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 79 20 74  ndexes for any t
bf30: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69  able */..      i
bf40: 66 28 20 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  f( OMIT_TEMPDB &
bf50: 26 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75  & i==1 ) continu
bf60: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62  e;.      if( iDb
bf70: 3e 3d 30 20 26 26 20 69 21 3d 69 44 62 20 29 20  >=0 && i!=iDb ) 
bf80: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
bf90: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
bfa0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
bfb0: 20 69 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44   i);..      /* D
bfc0: 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63  o an integrity c
bfd0: 68 65 63 6b 20 6f 66 20 74 68 65 20 42 2d 54 72  heck of the B-Tr
bfe0: 65 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  ee.      **.    
bff0: 20 20 2a 2a 20 42 65 67 69 6e 20 62 79 20 66 69    ** Begin by fi
c000: 6e 64 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 70  nding the root p
c010: 61 67 65 73 20 6e 75 6d 62 65 72 73 0a 20 20 20  ages numbers.   
c020: 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61     ** for all ta
c030: 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
c040: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
c050: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c060: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c070: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
c080: 64 62 2c 20 69 2c 20 30 29 20 29 3b 0a 20 20 20  db, i, 0) );.   
c090: 20 20 20 70 54 62 6c 73 20 3d 20 26 64 62 2d 3e     pTbls = &db->
c0a0: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 2d 3e  aDb[i].pSchema->
c0b0: 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 20 20 66  tblHash;.      f
c0c0: 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69  or(cnt=0, x=sqli
c0d0: 74 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c  teHashFirst(pTbl
c0e0: 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48  s); x; x=sqliteH
c0f0: 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20  ashNext(x)){.   
c100: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
c110: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
c120: 61 28 78 29 3b 20 20 2f 2a 20 43 75 72 72 65 6e  a(x);  /* Curren
c130: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  t table */.     
c140: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c160: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
c170: 20 6f 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   on pTab */.    
c180: 20 20 20 20 69 6e 74 20 6e 49 64 78 3b 20 20 20      int nIdx;   
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c1b0: 6f 66 20 69 6e 64 65 78 65 73 20 6f 6e 20 70 54  of indexes on pT
c1c0: 61 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ab */.        if
c1d0: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
c1e0: 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20   ) cnt++;.      
c1f0: 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49    for(nIdx=0, pI
c200: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
c210: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
c220: 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29  ->pNext, nIdx++)
c230: 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20 20  { cnt++; }.     
c240: 20 20 20 69 66 28 20 6e 49 64 78 3e 6d 78 49 64     if( nIdx>mxId
c250: 78 20 29 20 6d 78 49 64 78 20 3d 20 6e 49 64 78  x ) mxIdx = nIdx
c260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c270: 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 44  aRoot = sqlite3D
c280: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c290: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 63 6e   sizeof(int)*(cn
c2a0: 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28  t+1));.      if(
c2b0: 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72 65 61   aRoot==0 ) brea
c2c0: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74  k;.      for(cnt
c2d0: 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68  =0, x=sqliteHash
c2e0: 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b  First(pTbls); x;
c2f0: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   x=sqliteHashNex
c300: 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(x)){.        T
c310: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
c320: 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a  iteHashData(x);.
c330: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
c340: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Idx;.        if(
c350: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
c360: 29 20 61 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20 3d  ) aRoot[++cnt] =
c370: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pTab->tnum;.   
c380: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
c390: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
c3a0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
c3b0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  xt){.          a
c3c0: 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20 3d 20 70 49  Root[++cnt] = pI
c3d0: 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
c3e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
c3f0: 20 20 61 52 6f 6f 74 5b 30 5d 20 3d 20 63 6e 74    aRoot[0] = cnt
c400: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  ;..      /* Make
c410: 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
c420: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   number of regis
c430: 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  ters have been a
c440: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20  llocated */.    
c450: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
c460: 20 4d 41 58 28 20 70 50 61 72 73 65 2d 3e 6e 4d   MAX( pParse->nM
c470: 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b 0a 20  em, 8+mxIdx );. 
c480: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
c490: 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
c4a0: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
c4b0: 20 44 6f 20 74 68 65 20 62 2d 74 72 65 65 20 69   Do the b-tree i
c4c0: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 73 20  ntegrity checks 
c4d0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
c4e0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
c4f0: 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 32 2c  _IntegrityCk, 2,
c500: 20 63 6e 74 2c 20 31 2c 20 28 63 68 61 72 2a 29   cnt, 1, (char*)
c510: 61 52 6f 6f 74 2c 50 34 5f 49 4e 54 41 52 52 41  aRoot,P4_INTARRA
c520: 59 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Y);.      sqlite
c530: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
c540: 20 28 75 38 29 69 29 3b 0a 20 20 20 20 20 20 61   (u8)i);.      a
c550: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c560: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
c570: 4e 75 6c 6c 2c 20 32 29 3b 20 56 64 62 65 43 6f  Null, 2); VdbeCo
c580: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
c590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c5a0: 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
c5b0: 2c 20 30 2c 20 33 2c 20 30 2c 0a 20 20 20 20 20  , 0, 3, 0,.     
c5c0: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
c5d0: 74 66 28 64 62 2c 20 22 2a 2a 2a 20 69 6e 20 64  tf(db, "*** in d
c5e0: 61 74 61 62 61 73 65 20 25 73 20 2a 2a 2a 5c 6e  atabase %s ***\n
c5f0: 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44  ", db->aDb[i].zD
c600: 62 53 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  bSName),.       
c610: 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20    P4_DYNAMIC);. 
c620: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c630: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
c640: 63 61 74 2c 20 32 2c 20 33 2c 20 33 29 3b 0a 20  cat, 2, 3, 3);. 
c650: 20 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68       integrityCh
c660: 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b  eckResultRow(v);
c670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c680: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c690: 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  dr);..      /* M
c6a0: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
c6b0: 20 69 6e 64 69 63 65 73 20 61 72 65 20 63 6f 6e   indices are con
c6c0: 73 74 72 75 63 74 65 64 20 63 6f 72 72 65 63 74  structed correct
c6d0: 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
c6e0: 20 20 20 66 6f 72 28 78 3d 73 71 6c 69 74 65 48     for(x=sqliteH
c6f0: 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b  ashFirst(pTbls);
c700: 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68   x; x=sqliteHash
c710: 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20  Next(x)){.      
c720: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c730: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78  sqliteHashData(x
c740: 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  );.        Index
c750: 20 2a 70 49 64 78 2c 20 2a 70 50 6b 3b 0a 20 20   *pIdx, *pPk;.  
c760: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 72        Index *pPr
c770: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
c780: 20 69 6e 74 20 6c 6f 6f 70 54 6f 70 3b 0a 20 20   int loopTop;.  
c790: 20 20 20 20 20 20 69 6e 74 20 69 44 61 74 61 43        int iDataC
c7a0: 75 72 2c 20 69 49 64 78 43 75 72 3b 0a 20 20 20  ur, iIdxCur;.   
c7b0: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2d 31       int r1 = -1
c7c0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
c7d0: 54 61 62 2d 3e 74 6e 75 6d 3c 31 20 29 20 63 6f  Tab->tnum<1 ) co
c7e0: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 53 6b 69 70  ntinue;  /* Skip
c7f0: 20 56 49 45 57 73 20 6f 72 20 56 49 52 54 55 41   VIEWs or VIRTUA
c800: 4c 20 54 41 42 4c 45 73 20 2a 2f 0a 20 20 20 20  L TABLEs */.    
c810: 20 20 20 20 70 50 6b 20 3d 20 48 61 73 52 6f 77      pPk = HasRow
c820: 69 64 28 70 54 61 62 29 20 3f 20 30 20 3a 20 73  id(pTab) ? 0 : s
c830: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
c840: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
c850: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
c860: 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28  TableAndIndices(
c870: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4f 50  pParse, pTab, OP
c880: 5f 4f 70 65 6e 52 65 61 64 2c 20 30 2c 0a 20 20  _OpenRead, 0,.  
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 31 2c 20 30 2c 20 26 69 44 61 74 61 43 75 72   1, 0, &iDataCur
c8c0: 2c 20 26 69 49 64 78 43 75 72 29 3b 0a 20 20 20  , &iIdxCur);.   
c8d0: 20 20 20 20 20 2f 2a 20 72 65 67 5b 37 5d 20 63       /* reg[7] c
c8e0: 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65 72  ounts the number
c8f0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
c900: 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  he table..      
c910: 20 20 2a 2a 20 72 65 67 5b 38 2b 69 5d 20 63 6f    ** reg[8+i] co
c920: 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20  unts the number 
c930: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
c940: 65 20 69 2d 74 68 20 69 6e 64 65 78 20 0a 20 20  e i-th index .  
c950: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c960: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c970: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
c980: 2c 20 30 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  , 0, 7);.       
c990: 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70   for(j=0, pIdx=p
c9a0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
c9b0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
c9c0: 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ext, j++){.     
c9d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c9e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
c9f0: 65 67 65 72 2c 20 30 2c 20 38 2b 6a 29 3b 20 2f  eger, 0, 8+j); /
ca00: 2a 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  * index entries 
ca10: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
ca20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
ca30: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ert( pParse->nMe
ca40: 6d 3e 3d 38 2b 6a 20 29 3b 0a 20 20 20 20 20 20  m>=8+j );.      
ca50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ca60: 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28  3NoTempsInRange(
ca70: 70 50 61 72 73 65 2c 31 2c 37 2b 6a 29 20 29 3b  pParse,1,7+j) );
ca80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ca90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
caa0: 5f 52 65 77 69 6e 64 2c 20 69 44 61 74 61 43 75  _Rewind, iDataCu
cab0: 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  r, 0); VdbeCover
cac0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
cad0: 6c 6f 6f 70 54 6f 70 20 3d 20 73 71 6c 69 74 65  loopTop = sqlite
cae0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
caf0: 50 5f 41 64 64 49 6d 6d 2c 20 37 2c 20 31 29 3b  P_AddImm, 7, 1);
cb00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
cb10: 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  Quick ){.       
cb20: 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65     /* Sanity che
cb30: 63 6b 20 6f 6e 20 72 65 63 6f 72 64 20 68 65 61  ck on record hea
cb40: 64 65 72 20 64 65 63 6f 64 69 6e 67 20 2a 2f 0a  der decoding */.
cb50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cb60: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
cb70: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 44 61 74 61 43  P_Column, iDataC
cb80: 75 72 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  ur, pTab->nCol-1
cb90: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
cba0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
cbb0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
cbc0: 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
cbd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 56    }.        /* V
cbe0: 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 4e  erify that all N
cbf0: 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
cc00: 72 65 61 6c 6c 79 20 61 72 65 20 4e 4f 54 20 4e  really are NOT N
cc10: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ULL */.        f
cc20: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
cc30: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
cc40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
cc50: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
cc60: 6a 6d 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  jmp2;.          
cc70: 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( j==pTab->iPK
cc80: 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ey ) continue;. 
cc90: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61           if( pTa
cca0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75  b->aCol[j].notNu
ccb0: 6c 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ll==0 ) continue
ccc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ccd0: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
cce0: 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
ccf0: 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 6a  Tab, iDataCur, j
cd00: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
cd10: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
cd20: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
cd30: 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
cd40: 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74      jmp2 = sqlit
cd50: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
cd60: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 33 29 3b 20  OP_NotNull, 3); 
cd70: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
cd80: 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 20  .          zErr 
cd90: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
cda0: 28 64 62 2c 20 22 4e 55 4c 4c 20 76 61 6c 75 65  (db, "NULL value
cdb0: 20 69 6e 20 25 73 2e 25 73 22 2c 20 70 54 61 62   in %s.%s", pTab
cdc0: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cde0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
cdf0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
ce00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ce10: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
ce20: 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c  tring8, 0, 3, 0,
ce30: 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49   zErr, P4_DYNAMI
ce40: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  C);.          in
ce50: 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75  tegrityCheckResu
ce60: 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20  ltRow(v);.      
ce70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
ce80: 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29  umpHere(v, jmp2)
ce90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cea0: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 43 48      /* Verify CH
ceb0: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
cec0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
ced0: 54 61 62 2d 3e 70 43 68 65 63 6b 20 26 26 20 28  Tab->pCheck && (
cee0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
cef0: 54 45 5f 49 67 6e 6f 72 65 43 68 65 63 6b 73 29  TE_IgnoreChecks)
cf00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
cf10: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 65 63   ExprList *pChec
cf20: 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  k = sqlite3ExprL
cf30: 69 73 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  istDup(db, pTab-
cf40: 3e 70 43 68 65 63 6b 2c 20 30 29 3b 0a 20 20 20  >pCheck, 0);.   
cf50: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
cf60: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
cf70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
cf80: 74 20 61 64 64 72 43 6b 46 61 75 6c 74 20 3d 20  t addrCkFault = 
cf90: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
cfa0: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
cfb0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64            int ad
cfc0: 64 72 43 6b 4f 6b 20 3d 20 73 71 6c 69 74 65 33  drCkOk = sqlite3
cfd0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
cfe0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
cff0: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20     char *zErr;. 
d000: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
d010: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  ;.            pP
d020: 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
d030: 20 69 44 61 74 61 43 75 72 20 2b 20 31 3b 0a 20   iDataCur + 1;. 
d040: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
d050: 3d 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72 2d 31  =pCheck->nExpr-1
d060: 3b 20 6b 3e 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20  ; k>0; k--){.   
d070: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d080: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
d090: 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b  arse, pCheck->a[
d0a0: 6b 5d 2e 70 45 78 70 72 2c 20 61 64 64 72 43 6b  k].pExpr, addrCk
d0b0: 46 61 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20  Fault, 0);.     
d0c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d0e0: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
d0f0: 43 68 65 63 6b 2d 3e 61 5b 30 5d 2e 70 45 78 70  Check->a[0].pExp
d100: 72 2c 20 61 64 64 72 43 6b 4f 6b 2c 20 0a 20 20  r, addrCkOk, .  
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
d120: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
d130: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d140: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d150: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 46  Label(v, addrCkF
d160: 61 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ault);.         
d170: 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
d180: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
d190: 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69       zErr = sqli
d1a0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
d1b0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
d1c0: 20 66 61 69 6c 65 64 20 69 6e 20 25 73 22 2c 0a   failed in %s",.
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
d1f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d200: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
d210: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c  P_String8, 0, 3,
d220: 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e   0, zErr, P4_DYN
d230: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  AMIC);.         
d240: 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63     integrityChec
d250: 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20  kResultRow(v);. 
d260: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d270: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d280: 65 6c 28 76 2c 20 61 64 64 72 43 6b 4f 6b 29 3b  el(v, addrCkOk);
d290: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d2a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d2b0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
d2c0: 20 70 43 68 65 63 6b 29 3b 0a 20 20 20 20 20 20   pCheck);.      
d2d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
d2e0: 21 69 73 51 75 69 63 6b 20 29 7b 20 2f 2a 20 4f  !isQuick ){ /* O
d2f0: 6d 69 74 20 74 68 65 20 72 65 6d 61 69 6e 69 6e  mit the remainin
d300: 67 20 74 65 73 74 73 20 66 6f 72 20 71 75 69 63  g tests for quic
d310: 6b 5f 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20  k_check */.     
d320: 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65       /* Validate
d330: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 66   index entries f
d340: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
d350: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ow */.          
d360: 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54  for(j=0, pIdx=pT
d370: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
d380: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
d390: 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, j++){.      
d3a0: 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 2c 20        int jmp2, 
d3b0: 6a 6d 70 33 2c 20 6a 6d 70 34 2c 20 6a 6d 70 35  jmp3, jmp4, jmp5
d3c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
d3d0: 74 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c 69 74  t ckUniq = sqlit
d3e0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d3f0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d400: 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49       if( pPk==pI
d410: 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  dx ) continue;. 
d420: 20 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20             r1 = 
d430: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
d440: 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
d450: 70 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20  pIdx, iDataCur, 
d460: 30 2c 20 30 2c 20 26 6a 6d 70 33 2c 0a 20 20 20  0, 0, &jmp3,.   
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20 72 31        pPrior, r1
d4a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
d4b0: 50 72 69 6f 72 20 3d 20 70 49 64 78 3b 0a 20 20  Prior = pIdx;.  
d4c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d4d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d4e0: 50 5f 41 64 64 49 6d 6d 2c 20 38 2b 6a 2c 20 31  P_AddImm, 8+j, 1
d4f0: 29 3b 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20 65  );/* increment e
d500: 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20  ntry count */.  
d510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72            /* Ver
d520: 69 66 79 20 74 68 61 74 20 61 6e 20 69 6e 64 65  ify that an inde
d530: 78 20 65 6e 74 72 79 20 65 78 69 73 74 73 20 66  x entry exists f
d540: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
d550: 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 20 20  able row */.    
d560: 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20 73          jmp2 = s
d570: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
d580: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
d590: 20 69 49 64 78 43 75 72 2b 6a 2c 20 63 6b 55 6e   iIdxCur+j, ckUn
d5a0: 69 71 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20  iq, r1,.        
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 20  pIdx->nColumn); 
d5e0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d5f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d600: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
d610: 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77 20 22 29  ng(v, 3, "row ")
d620: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d630: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d640: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 37 2c  v, OP_Concat, 7,
d650: 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20   3, 3);.        
d660: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
d670: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20  oadString(v, 4, 
d680: 22 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 69  " missing from i
d690: 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20  ndex ");.       
d6a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d6b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
d6c0: 63 61 74 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20  cat, 4, 3, 3);. 
d6d0: 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 35 20             jmp5 
d6e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61  = sqlite3VdbeLoa
d6f0: 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 70 49  dString(v, 4, pI
d700: 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
d710: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d720: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d730: 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33 29  Concat, 4, 3, 3)
d740: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ;.            jm
d750: 70 34 20 3d 20 69 6e 74 65 67 72 69 74 79 43 68  p4 = integrityCh
d760: 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b  eckResultRow(v);
d770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d780: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
d790: 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20  (v, jmp2);.     
d7a0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e         /* For UN
d7b0: 49 51 55 45 20 69 6e 64 65 78 65 73 2c 20 76 65  IQUE indexes, ve
d7c0: 72 69 66 79 20 74 68 61 74 20 6f 6e 6c 79 20 6f  rify that only o
d7d0: 6e 65 20 65 6e 74 72 79 20 65 78 69 73 74 73 20  ne entry exists 
d7e0: 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 20  with the.       
d7f0: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
d800: 6b 65 79 2e 20 20 54 68 65 20 65 6e 74 72 79 20  key.  The entry 
d810: 69 73 20 75 6e 69 71 75 65 20 69 66 20 28 31 29  is unique if (1)
d820: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 4e   any column is N
d830: 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ULL.            
d840: 2a 2a 20 6f 72 20 28 32 29 20 74 68 65 20 6e 65  ** or (2) the ne
d850: 78 74 20 65 6e 74 72 79 20 68 61 73 20 61 20 64  xt entry has a d
d860: 69 66 66 65 72 65 6e 74 20 6b 65 79 20 2a 2f 0a  ifferent key */.
d870: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
d880: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
d890: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dx) ){.         
d8a0: 20 20 20 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20       int uniqOk 
d8b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d8c0: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d8e0: 74 20 6a 6d 70 36 3b 0a 20 20 20 20 20 20 20 20  t jmp6;.        
d8f0: 20 20 20 20 20 20 69 6e 74 20 6b 6b 3b 0a 20 20        int kk;.  
d900: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
d910: 6b 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78 2d 3e 6e  kk=0; kk<pIdx->n
d920: 4b 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20  KeyCol; kk++){. 
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
d940: 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt iCol = pIdx->
d950: 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20  aiColumn[kk];.  
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
d970: 73 65 72 74 28 20 69 43 6f 6c 21 3d 58 4e 5f 52  sert( iCol!=XN_R
d980: 4f 57 49 44 20 26 26 20 69 43 6f 6c 3c 70 54 61  OWID && iCol<pTa
d990: 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
d9a0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
d9b0: 43 6f 6c 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e  Col>=0 && pTab->
d9c0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
d9d0: 6c 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ll ) continue;. 
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
d9f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
da00: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
da10: 31 2b 6b 6b 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20  1+kk, uniqOk);. 
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
da30: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d                jm
da60: 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p6 = sqlite3Vdbe
da70: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 65 78  AddOp1(v, OP_Nex
da80: 74 2c 20 69 49 64 78 43 75 72 2b 6a 29 3b 20 56  t, iIdxCur+j); V
da90: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
dab0: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
dac0: 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20   uniqOk);.      
dad0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dae0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
daf0: 6d 70 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mp6);.          
db00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
db10: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
db20: 64 78 47 54 2c 20 69 49 64 78 43 75 72 2b 6a 2c  dxGT, iIdxCur+j,
db30: 20 75 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20 20 20   uniqOk, r1,.   
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db60: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20  pIdx->nKeyCol); 
db70: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
db80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
db90: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
dba0: 72 69 6e 67 28 76 2c 20 33 2c 20 22 6e 6f 6e 2d  ring(v, 3, "non-
dbb0: 75 6e 69 71 75 65 20 65 6e 74 72 79 20 69 6e 20  unique entry in 
dbc0: 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20  index ");.      
dbd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dbe0: 64 62 65 47 6f 74 6f 28 76 2c 20 6a 6d 70 35 29  dbeGoto(v, jmp5)
dbf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
dc00: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
dc10: 76 65 4c 61 62 65 6c 28 76 2c 20 75 6e 69 71 4f  veLabel(v, uniqO
dc20: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
dc30: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
dc40: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
dc50: 65 28 76 2c 20 6a 6d 70 34 29 3b 0a 20 20 20 20  e(v, jmp4);.    
dc60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
dc70: 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62  esolvePartIdxLab
dc80: 65 6c 28 70 50 61 72 73 65 2c 20 6a 6d 70 33 29  el(pParse, jmp3)
dc90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
dca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dcb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dcc0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 44  2(v, OP_Next, iD
dcd0: 61 74 61 43 75 72 2c 20 6c 6f 6f 70 54 6f 70 29  ataCur, loopTop)
dce0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
dcf0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
dd00: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
dd10: 2c 20 6c 6f 6f 70 54 6f 70 2d 31 29 3b 0a 23 69  , loopTop-1);.#i
dd20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
dd30: 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20  T_BTREECOUNT.   
dd40: 20 20 20 20 20 69 66 28 20 21 69 73 51 75 69 63       if( !isQuic
dd50: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  k ){.          s
dd60: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
dd70: 72 69 6e 67 28 76 2c 20 32 2c 20 22 77 72 6f 6e  ring(v, 2, "wron
dd80: 67 20 23 20 6f 66 20 65 6e 74 72 69 65 73 20 69  g # of entries i
dd90: 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20  n index ");.    
dda0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
ddb0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
ddc0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
ddd0: 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a  x->pNext, j++){.
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
ddf0: 70 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74  pPk==pIdx ) cont
de00: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
de10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
de20: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
de30: 20 69 49 64 78 43 75 72 2b 6a 2c 20 33 29 3b 0a   iIdxCur+j, 3);.
de40: 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
de50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
de60: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 38  dOp3(v, OP_Eq, 8
de70: 2b 6a 2c 20 30 2c 20 33 29 3b 20 56 64 62 65 43  +j, 0, 3); VdbeC
de80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
de90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dea0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
deb0: 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  QLITE_NOTNULL);.
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ded0: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
dee0: 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e  g(v, 4, pIdx->zN
def0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
df00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
df10: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
df20: 2c 20 34 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20  , 4, 2, 3);.    
df30: 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74          integrit
df40: 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28  yCheckResultRow(
df50: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
df60: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
df70: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
df80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df90: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
dfa0: 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
dfb0: 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7d 20  OUNT */.      } 
dfc0: 0a 20 20 20 20 7d 0a 20 20 20 20 7b 0a 20 20 20  .    }.    {.   
dfd0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
dfe0: 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f  int iLn = VDBE_O
dff0: 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b  FFSET_LINENO(2);
e000: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
e010: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 65  nst VdbeOpList e
e020: 6e 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  ndCode[] = {.   
e030: 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d       { OP_AddImm
e040: 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ,      1, 0,    
e050: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20      0},    /* 0 
e060: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
e070: 49 66 4e 6f 74 5a 65 72 6f 2c 20 20 20 31 2c 20  IfNotZero,   1, 
e080: 34 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  4,        0},   
e090: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 20   /* 1 */.       
e0a0: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20   { OP_String8,  
e0b0: 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20     0, 3,        
e0c0: 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20  0},    /* 2 */. 
e0d0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75         { OP_Resu
e0e0: 6c 74 52 6f 77 2c 20 20 20 33 2c 20 31 2c 20 20  ltRow,   3, 1,  
e0f0: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
e100: 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  3 */.        { O
e110: 50 5f 48 61 6c 74 2c 20 20 20 20 20 20 20 20 30  P_Halt,        0
e120: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
e130: 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20     /* 4 */.     
e140: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c     { OP_String8,
e150: 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20       0, 3,      
e160: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 35 20 2a 2f    0},    /* 5 */
e170: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  .        { OP_Go
e180: 74 6f 2c 20 20 20 20 20 20 20 20 30 2c 20 33 2c  to,        0, 3,
e190: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
e1a0: 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a  * 6 */.      };.
e1b0: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f        VdbeOp *aO
e1c0: 70 3b 0a 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  p;..      aOp = 
e1d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e1e0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
e1f0: 65 28 65 6e 64 43 6f 64 65 29 2c 20 65 6e 64 43  e(endCode), endC
e200: 6f 64 65 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20  ode, iLn);.     
e210: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20   if( aOp ){.    
e220: 20 20 20 20 61 4f 70 5b 30 5d 2e 70 32 20 3d 20      aOp[0].p2 = 
e230: 31 2d 6d 78 45 72 72 3b 0a 20 20 20 20 20 20 20  1-mxErr;.       
e240: 20 61 4f 70 5b 32 5d 2e 70 34 74 79 70 65 20 3d   aOp[2].p4type =
e250: 20 50 34 5f 53 54 41 54 49 43 3b 0a 20 20 20 20   P4_STATIC;.    
e260: 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 2e 7a 20      aOp[2].p4.z 
e270: 3d 20 22 6f 6b 22 3b 0a 20 20 20 20 20 20 20 20  = "ok";.        
e280: 61 4f 70 5b 35 5d 2e 70 34 74 79 70 65 20 3d 20  aOp[5].p4type = 
e290: 50 34 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 20  P4_STATIC;.     
e2a0: 20 20 20 61 4f 70 5b 35 5d 2e 70 34 2e 7a 20 3d     aOp[5].p4.z =
e2b0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 45   (char*)sqlite3E
e2c0: 72 72 53 74 72 28 53 51 4c 49 54 45 5f 43 4f 52  rrStr(SQLITE_COR
e2d0: 52 55 50 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  RUPT);.      }. 
e2e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e2f0: 43 68 61 6e 67 65 50 33 28 76 2c 20 30 2c 20 73  ChangeP3(v, 0, s
e300: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
e310: 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20  tAddr(v)-2);.   
e320: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
e330: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e340: 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
e350: 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
e360: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
e370: 46 31 36 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  F16.  /*.  **   
e380: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 0a  PRAGMA encoding.
e390: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e    **   PRAGMA en
e3a0: 63 6f 64 69 6e 67 20 3d 20 22 75 74 66 2d 38 22  coding = "utf-8"
e3b0: 7c 22 75 74 66 2d 31 36 22 7c 22 75 74 66 2d 31  |"utf-16"|"utf-1
e3c0: 36 6c 65 22 7c 22 75 74 66 2d 31 36 62 65 22 0a  6le"|"utf-16be".
e3d0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 69 74 73    **.  ** In its
e3e0: 20 66 69 72 73 74 20 66 6f 72 6d 2c 20 74 68 69   first form, thi
e3f0: 73 20 70 72 61 67 6d 61 20 72 65 74 75 72 6e 73  s pragma returns
e400: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66   the encoding of
e410: 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 64   the main.  ** d
e420: 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
e430: 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
e440: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 69 74 20  initialized, it 
e450: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6e  is initialized n
e460: 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ow..  **.  ** Th
e470: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 6f 66  e second form of
e480: 20 74 68 69 73 20 70 72 61 67 6d 61 20 69 73 20   this pragma is 
e490: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6d  a no-op if the m
e4a0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
e4b0: 65 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61  e.  ** has not a
e4c0: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 69 74  lready been init
e4d0: 69 61 6c 69 7a 65 64 2e 20 49 6e 20 74 68 69 73  ialized. In this
e4e0: 20 63 61 73 65 20 69 74 20 73 65 74 73 20 74 68   case it sets th
e4f0: 65 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 65  e default.  ** e
e500: 6e 63 6f 64 69 6e 67 20 74 68 61 74 20 77 69 6c  ncoding that wil
e510: 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  l be used for th
e520: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
e530: 66 69 6c 65 20 69 66 20 61 20 6e 65 77 20 66 69  file if a new fi
e540: 6c 65 0a 20 20 2a 2a 20 69 73 20 63 72 65 61 74  le.  ** is creat
e550: 65 64 2e 20 49 66 20 61 6e 20 65 78 69 73 74 69  ed. If an existi
e560: 6e 67 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  ng main database
e570: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c   file is opened,
e580: 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 64   then the.  ** d
e590: 65 66 61 75 6c 74 20 74 65 78 74 20 65 6e 63 6f  efault text enco
e5a0: 64 69 6e 67 20 66 6f 72 20 74 68 65 20 65 78 69  ding for the exi
e5b0: 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 69  sting database i
e5c0: 73 20 75 73 65 64 2e 0a 20 20 2a 2a 20 0a 20 20  s used..  ** .  
e5d0: 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 20  ** In all cases 
e5e0: 6e 65 77 20 64 61 74 61 62 61 73 65 73 20 63 72  new databases cr
e5f0: 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
e600: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 20 61  ATTACH command a
e610: 72 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  re.  ** created 
e620: 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  to use the same 
e630: 64 65 66 61 75 6c 74 20 74 65 78 74 20 65 6e 63  default text enc
e640: 6f 64 69 6e 67 20 61 73 20 74 68 65 20 6d 61 69  oding as the mai
e650: 6e 20 64 61 74 61 62 61 73 65 2e 20 49 66 0a 20  n database. If. 
e660: 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74   ** the main dat
e670: 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 62 65  abase has not be
e680: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  en initialized a
e690: 6e 64 2f 6f 72 20 63 72 65 61 74 65 64 20 77 68  nd/or created wh
e6a0: 65 6e 20 41 54 54 41 43 48 0a 20 20 2a 2a 20 69  en ATTACH.  ** i
e6b0: 73 20 65 78 65 63 75 74 65 64 2c 20 74 68 69 73  s executed, this
e6c0: 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
e6d0: 74 68 65 20 41 54 54 41 43 48 20 6f 70 65 72 61  the ATTACH opera
e6e0: 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion..  **.  ** 
e6f0: 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f  In the second fo
e700: 72 6d 20 74 68 69 73 20 70 72 61 67 6d 61 20 73  rm this pragma s
e710: 65 74 73 20 74 68 65 20 74 65 78 74 20 65 6e 63  ets the text enc
e720: 6f 64 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64  oding to be used
e730: 20 69 6e 0a 20 20 2a 2a 20 6e 65 77 20 64 61 74   in.  ** new dat
e740: 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61  abase files crea
e750: 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
e760: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
e770: 49 74 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20  It is only.  ** 
e780: 75 73 65 66 75 6c 20 69 66 20 69 6e 76 6f 6b 65  useful if invoke
e790: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  d immediately af
e7a0: 74 65 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ter the main dat
e7b0: 61 62 61 73 65 20 69 0a 20 20 2a 2f 0a 20 20 63  abase i.  */.  c
e7c0: 61 73 65 20 50 72 61 67 54 79 70 5f 45 4e 43 4f  ase PragTyp_ENCO
e7d0: 44 49 4e 47 3a 20 7b 0a 20 20 20 20 73 74 61 74  DING: {.    stat
e7e0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
e7f0: 45 6e 63 4e 61 6d 65 20 7b 0a 20 20 20 20 20 20  EncName {.      
e800: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
e810: 20 20 20 75 38 20 65 6e 63 3b 0a 20 20 20 20 7d     u8 enc;.    }
e820: 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b 0a   encnames[] = {.
e830: 20 20 20 20 20 20 7b 20 22 55 54 46 38 22 2c 20        { "UTF8", 
e840: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
e850: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
e860: 7b 20 22 55 54 46 2d 38 22 2c 20 20 20 20 53 51  { "UTF-8",    SQ
e870: 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20 20 20  LITE_UTF8       
e880: 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20   },  /* Must be 
e890: 65 6c 65 6d 65 6e 74 20 5b 31 5d 20 2a 2f 0a 20  element [1] */. 
e8a0: 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 6c 65       { "UTF-16le
e8b0: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
e8c0: 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73  E     },  /* Mus
e8d0: 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 32 5d  t be element [2]
e8e0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46   */.      { "UTF
e8f0: 2d 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f 55  -16be", SQLITE_U
e900: 54 46 31 36 42 45 20 20 20 20 20 7d 2c 20 20 2f  TF16BE     },  /
e910: 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e  * Must be elemen
e920: 74 20 5b 33 5d 20 2a 2f 0a 20 20 20 20 20 20 7b  t [3] */.      {
e930: 20 22 55 54 46 31 36 6c 65 22 2c 20 20 53 51 4c   "UTF16le",  SQL
e940: 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20  ITE_UTF16LE     
e950: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31  },.      { "UTF1
e960: 36 62 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54  6be",  SQLITE_UT
e970: 46 31 36 42 45 20 20 20 20 20 7d 2c 0a 20 20 20  F16BE     },.   
e980: 20 20 20 7b 20 22 55 54 46 2d 31 36 22 2c 20 20     { "UTF-16",  
e990: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
e9a0: 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45      }, /* SQLITE
e9b0: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a  _UTF16NATIVE */.
e9c0: 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 22 2c        { "UTF16",
e9d0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
e9e0: 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c         }, /* SQL
e9f0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
ea00: 2a 2f 0a 20 20 20 20 20 20 7b 20 30 2c 20 30 20  */.      { 0, 0 
ea10: 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 6f 6e  }.    };.    con
ea20: 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d  st struct EncNam
ea30: 65 20 2a 70 45 6e 63 3b 0a 20 20 20 20 69 66 28  e *pEnc;.    if(
ea40: 20 21 7a 52 69 67 68 74 20 29 7b 20 20 20 20 2f   !zRight ){    /
ea50: 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69  * "PRAGMA encodi
ea60: 6e 67 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ng" */.      if(
ea70: 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
ea80: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
ea90: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
eaa0: 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e      assert( encn
eab0: 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 38  ames[SQLITE_UTF8
eac0: 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ].enc==SQLITE_UT
ead0: 46 38 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  F8 );.      asse
eae0: 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c  rt( encnames[SQL
eaf0: 49 54 45 5f 55 54 46 31 36 4c 45 5d 2e 65 6e 63  ITE_UTF16LE].enc
eb00: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
eb10: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
eb20: 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54  ( encnames[SQLIT
eb30: 45 5f 55 54 46 31 36 42 45 5d 2e 65 6e 63 3d 3d  E_UTF16BE].enc==
eb40: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
eb50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
eb60: 6e 67 6c 65 54 65 78 74 28 76 2c 20 65 6e 63 6e  ngleText(v, encn
eb70: 61 6d 65 73 5b 45 4e 43 28 70 50 61 72 73 65 2d  ames[ENC(pParse-
eb80: 3e 64 62 29 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >db)].zName);.  
eb90: 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebb0: 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64  /* "PRAGMA encod
ebc0: 69 6e 67 20 3d 20 58 58 58 22 20 2a 2f 0a 20 20  ing = XXX" */.  
ebd0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 63 68 61 6e      /* Only chan
ebe0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
ebf0: 73 71 6c 69 74 65 2e 65 6e 63 20 69 66 20 74 68  sqlite.enc if th
ec00: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
ec10: 65 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  e is not.      *
ec20: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49  * initialized. I
ec30: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
ec40: 61 73 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ase exists, the 
ec50: 6e 65 77 20 73 71 6c 69 74 65 2e 65 6e 63 20 76  new sqlite.enc v
ec60: 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 77 69  alue.      ** wi
ec70: 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
ec80: 6e 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  n when the schem
ec90: 61 20 69 73 20 6e 65 78 74 20 6c 6f 61 64 65 64  a is next loaded
eca0: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
ecb0: 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
ecc0: 79 20 65 78 69 73 74 73 2c 20 69 74 20 77 69 6c  y exists, it wil
ecd0: 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f 20  l be created to 
ece0: 75 73 65 20 74 68 65 20 6e 65 77 20 65 6e 63 6f  use the new enco
ecf0: 64 69 6e 67 20 76 61 6c 75 65 2e 0a 20 20 20 20  ding value..    
ed00: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 0a    */.      if( .
ed10: 20 20 20 20 20 20 20 20 21 28 44 62 48 61 73 50          !(DbHasP
ed20: 72 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20 44  roperty(db, 0, D
ed30: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 29  B_SchemaLoaded))
ed40: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 44 62 48   || .        DbH
ed50: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 30  asProperty(db, 0
ed60: 2c 20 44 42 5f 45 6d 70 74 79 29 20 0a 20 20 20  , DB_Empty) .   
ed70: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f     ){.        fo
ed80: 72 28 70 45 6e 63 3d 26 65 6e 63 6e 61 6d 65 73  r(pEnc=&encnames
ed90: 5b 30 5d 3b 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65  [0]; pEnc->zName
eda0: 3b 20 70 45 6e 63 2b 2b 29 7b 0a 20 20 20 20 20  ; pEnc++){.     
edb0: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
edc0: 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68  te3StrICmp(zRigh
edd0: 74 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 29 20  t, pEnc->zName) 
ede0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
edf0: 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 20 3d 20  CHEMA_ENC(db) = 
ee00: 45 4e 43 28 64 62 29 20 3d 0a 20 20 20 20 20 20  ENC(db) =.      
ee10: 20 20 20 20 20 20 20 20 20 20 70 45 6e 63 2d 3e            pEnc->
ee20: 65 6e 63 20 3f 20 70 45 6e 63 2d 3e 65 6e 63 20  enc ? pEnc->enc 
ee30: 3a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  : SQLITE_UTF16NA
ee40: 54 49 56 45 3b 0a 20 20 20 20 20 20 20 20 20 20  TIVE;.          
ee50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
ee60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
ee70: 20 20 20 20 20 20 20 69 66 28 20 21 70 45 6e 63         if( !pEnc
ee80: 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ->zName ){.     
ee90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
eea0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
eeb0: 73 75 70 70 6f 72 74 65 64 20 65 6e 63 6f 64 69  supported encodi
eec0: 6e 67 3a 20 25 73 22 2c 20 7a 52 69 67 68 74 29  ng: %s", zRight)
eed0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
eee0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
eef0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
ef00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
ef10: 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  16 */..#ifndef S
ef20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
ef30: 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41  A_VERSION_PRAGMA
ef40: 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  S.  /*.  **   PR
ef50: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63  AGMA [schema.]sc
ef60: 68 65 6d 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a  hema_version.  *
ef70: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
ef80: 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69  ma.]schema_versi
ef90: 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20  on = <integer>. 
efa0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
efb0: 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f  A [schema.]user_
efc0: 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50  version.  **   P
efd0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75  RAGMA [schema.]u
efe0: 73 65 72 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69  ser_version = <i
eff0: 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a  nteger>.  **.  *
f000: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
f010: 6d 61 2e 5d 66 72 65 65 6c 69 73 74 5f 63 6f 75  ma.]freelist_cou
f020: 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50  nt.  **.  **   P
f030: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64  RAGMA [schema.]d
f040: 61 74 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a  ata_version.  **
f050: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
f060: 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74  schema.]applicat
f070: 69 6f 6e 5f 69 64 0a 20 20 2a 2a 20 20 20 50 52  ion_id.  **   PR
f080: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70  AGMA [schema.]ap
f090: 70 6c 69 63 61 74 69 6f 6e 5f 69 64 20 3d 20 3c  plication_id = <
f0a0: 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20  integer>.  **.  
f0b0: 2a 2a 20 54 68 65 20 70 72 61 67 6d 61 27 73 20  ** The pragma's 
f0c0: 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 61  schema_version a
f0d0: 6e 64 20 75 73 65 72 5f 76 65 72 73 69 6f 6e 20  nd user_version 
f0e0: 61 72 65 20 75 73 65 64 20 74 6f 20 73 65 74 20  are used to set 
f0f0: 6f 72 20 67 65 74 0a 20 20 2a 2a 20 74 68 65 20  or get.  ** the 
f100: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 63 68  value of the sch
f110: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20  ema-version and 
f120: 75 73 65 72 2d 76 65 72 73 69 6f 6e 2c 20 72 65  user-version, re
f130: 73 70 65 63 74 69 76 65 6c 79 2e 20 42 6f 74 68  spectively. Both
f140: 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
f150: 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20 74 68 65  -version and the
f160: 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 61 72   user-version ar
f170: 65 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20  e 32-bit signed 
f180: 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 73 74  integers.  ** st
f190: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
f1a0: 62 61 73 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  base header..  *
f1b0: 2a 0a 20 20 2a 2a 20 54 68 65 20 73 63 68 65 6d  *.  ** The schem
f1c0: 61 2d 63 6f 6f 6b 69 65 20 69 73 20 75 73 75 61  a-cookie is usua
f1d0: 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  lly only manipul
f1e0: 61 74 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  ated internally 
f1f0: 62 79 20 53 51 4c 69 74 65 2e 20 49 74 0a 20 20  by SQLite. It.  
f200: 2a 2a 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ** is incremente
f210: 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
f220: 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73  ever the databas
f230: 65 20 73 63 68 65 6d 61 20 69 73 20 6d 6f 64 69  e schema is modi
f240: 66 69 65 64 20 28 62 79 0a 20 20 2a 2a 20 63 72  fied (by.  ** cr
f250: 65 61 74 69 6e 67 20 6f 72 20 64 72 6f 70 70 69  eating or droppi
f260: 6e 67 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  ng a table or in
f270: 64 65 78 29 2e 20 54 68 65 20 73 63 68 65 6d 61  dex). The schema
f280: 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73 65 64   version is used
f290: 20 62 79 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20   by.  ** SQLite 
f2a0: 65 61 63 68 20 74 69 6d 65 20 61 20 71 75 65 72  each time a quer
f2b0: 79 20 69 73 20 65 78 65 63 75 74 65 64 20 74 6f  y is executed to
f2c0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
f2d0: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 0a   internal cache.
f2e0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 68 65    ** of the sche
f2f0: 6d 61 20 75 73 65 64 20 77 68 65 6e 20 63 6f 6d  ma used when com
f300: 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 71  piling the SQL q
f310: 75 65 72 79 20 6d 61 74 63 68 65 73 20 74 68 65  uery matches the
f320: 20 73 63 68 65 6d 61 20 6f 66 0a 20 20 2a 2a 20   schema of.  ** 
f330: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 67 61  the database aga
f340: 69 6e 73 74 20 77 68 69 63 68 20 74 68 65 20 63  inst which the c
f350: 6f 6d 70 69 6c 65 64 20 71 75 65 72 79 20 69 73  ompiled query is
f360: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
f370: 65 64 2e 0a 20 20 2a 2a 20 53 75 62 76 65 72 74  ed..  ** Subvert
f380: 69 6e 67 20 74 68 69 73 20 6d 65 63 68 61 6e 69  ing this mechani
f390: 73 6d 20 62 79 20 75 73 69 6e 67 20 22 50 52 41  sm by using "PRA
f3a0: 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69  GMA schema_versi
f3b0: 6f 6e 22 20 74 6f 20 6d 6f 64 69 66 79 0a 20 20  on" to modify.  
f3c0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65  ** the schema-ve
f3d0: 72 73 69 6f 6e 20 69 73 20 70 6f 74 65 6e 74 69  rsion is potenti
f3e0: 61 6c 6c 79 20 64 61 6e 67 65 72 6f 75 73 20 61  ally dangerous a
f3f0: 6e 64 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 70  nd may lead to p
f400: 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 63 72 61 73  rogram.  ** cras
f410: 68 65 73 20 6f 72 20 64 61 74 61 62 61 73 65 20  hes or database 
f420: 63 6f 72 72 75 70 74 69 6f 6e 2e 20 55 73 65 20  corruption. Use 
f430: 77 69 74 68 20 63 61 75 74 69 6f 6e 21 0a 20 20  with caution!.  
f440: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 75 73 65 72  **.  ** The user
f450: 2d 76 65 72 73 69 6f 6e 20 69 73 20 6e 6f 74 20  -version is not 
f460: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
f470: 62 79 20 53 51 4c 69 74 65 2e 20 49 74 20 6d 61  by SQLite. It ma
f480: 79 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a  y be used by.  *
f490: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 66  * applications f
f4a0: 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 2e 0a  or any purpose..
f4b0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
f4c0: 54 79 70 5f 48 45 41 44 45 52 5f 56 41 4c 55 45  Typ_HEADER_VALUE
f4d0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f  : {.    int iCoo
f4e0: 6b 69 65 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69  kie = pPragma->i
f4f0: 41 72 67 3b 20 20 2f 2a 20 57 68 69 63 68 20 63  Arg;  /* Which c
f500: 6f 6f 6b 69 65 20 74 6f 20 72 65 61 64 20 6f 72  ookie to read or
f510: 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 73 71   write */.    sq
f520: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
f530: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
f540: 69 66 28 20 7a 52 69 67 68 74 20 26 26 20 28 70  if( zRight && (p
f550: 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67  Pragma->mPragFlg
f560: 20 26 20 50 72 61 67 46 6c 67 5f 52 65 61 64 4f   & PragFlg_ReadO
f570: 6e 6c 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nly)==0 ){.     
f580: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 70   /* Write the sp
f590: 65 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76  ecified cookie v
f5a0: 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74  alue */.      st
f5b0: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
f5c0: 70 4c 69 73 74 20 73 65 74 43 6f 6f 6b 69 65 5b  pList setCookie[
f5d0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
f5e0: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
f5f0: 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20     0,  1,  0},  
f600: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
f610: 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65    { OP_SetCookie
f620: 2c 20 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30  ,      0,  0,  0
f630: 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  },    /* 1 */.  
f640: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62      };.      Vdb
f650: 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20  eOp *aOp;.      
f660: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
f670: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
f680: 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  d(v, ArraySize(s
f690: 65 74 43 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20  etCookie));.    
f6a0: 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    aOp = sqlite3V
f6b0: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
f6c0: 41 72 72 61 79 53 69 7a 65 28 73 65 74 43 6f 6f  ArraySize(setCoo
f6d0: 6b 69 65 29 2c 20 73 65 74 43 6f 6f 6b 69 65 2c  kie), setCookie,
f6e0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f   0);.      if( O
f6f0: 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53  NLY_IF_REALLOC_S
f700: 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20  TRESS(aOp==0) ) 
f710: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70  break;.      aOp
f720: 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20  [0].p1 = iDb;.  
f730: 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20      aOp[1].p1 = 
f740: 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  iDb;.      aOp[1
f750: 5d 2e 70 32 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a  ].p2 = iCookie;.
f760: 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20        aOp[1].p3 
f770: 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  = sqlite3Atoi(zR
f780: 69 67 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ight);.    }else
f790: 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20  {.      /* Read 
f7a0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f  the specified co
f7b0: 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  okie value */.  
f7c0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
f7d0: 20 56 64 62 65 4f 70 4c 69 73 74 20 72 65 61 64   VdbeOpList read
f7e0: 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20  Cookie[] = {.   
f7f0: 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61       { OP_Transa
f800: 63 74 69 6f 6e 2c 20 20 20 20 20 30 2c 20 20 30  ction,     0,  0
f810: 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a  ,  0},    /* 0 *
f820: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52  /.        { OP_R
f830: 65 61 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20  eadCookie,      
f840: 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f  0,  1,  0},    /
f850: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 1 */.        {
f860: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20   OP_ResultRow,  
f870: 20 20 20 20 20 31 2c 20 20 31 2c 20 20 30 7d 0a       1,  1,  0}.
f880: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 56        };.      V
f890: 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20  dbeOp *aOp;.    
f8a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72    sqlite3VdbeVer
f8b0: 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69  ifyNoMallocRequi
f8c0: 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65  red(v, ArraySize
f8d0: 28 72 65 61 64 43 6f 6f 6b 69 65 29 29 3b 0a 20  (readCookie));. 
f8e0: 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74       aOp = sqlit
f8f0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
f900: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 72 65 61  v, ArraySize(rea
f910: 64 43 6f 6f 6b 69 65 29 2c 72 65 61 64 43 6f 6f  dCookie),readCoo
f920: 6b 69 65 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  kie,0);.      if
f930: 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f  ( ONLY_IF_REALLO
f940: 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29  C_STRESS(aOp==0)
f950: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
f960: 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[0].p1 = iDb;
f970: 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31  .      aOp[1].p1
f980: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
f990: 70 5b 31 5d 2e 70 33 20 3d 20 69 43 6f 6f 6b 69  p[1].p3 = iCooki
f9a0: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
f9b0: 56 64 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b  VdbeReusable(v);
f9c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
f9d0: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ak;.#endif /* SQ
f9e0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41  LITE_OMIT_SCHEMA
f9f0: 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53  _VERSION_PRAGMAS
fa00: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
fa10: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45  ITE_OMIT_COMPILE
fa20: 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 20 20 2f  OPTION_DIAGS.  /
fa30: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
fa40: 63 6f 6d 70 69 6c 65 5f 6f 70 74 69 6f 6e 73 0a  compile_options.
fa50: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
fa60: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
fa70: 6c 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  l compile-time o
fa80: 70 74 69 6f 6e 73 20 75 73 65 64 20 69 6e 20 74  ptions used in t
fa90: 68 69 73 20 62 75 69 6c 64 2c 0a 20 20 2a 2a 20  his build,.  ** 
faa0: 6f 6e 65 20 6f 70 74 69 6f 6e 20 70 65 72 20 72  one option per r
fab0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ow..  */.  case 
fac0: 50 72 61 67 54 79 70 5f 43 4f 4d 50 49 4c 45 5f  PragTyp_COMPILE_
fad0: 4f 50 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 69  OPTIONS: {.    i
fae0: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 63 6f  nt i = 0;.    co
faf0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a  nst char *zOpt;.
fb00: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
fb10: 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 1;.    while(
fb20: 20 28 7a 4f 70 74 20 3d 20 73 71 6c 69 74 65 33   (zOpt = sqlite3
fb30: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67  _compileoption_g
fb40: 65 74 28 69 2b 2b 29 29 21 3d 30 20 29 7b 0a 20  et(i++))!=0 ){. 
fb50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fb60: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c  LoadString(v, 1,
fb70: 20 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 73 71   zOpt);.      sq
fb80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fb90: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
fba0: 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
fbb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75    sqlite3VdbeReu
fbc0: 73 61 62 6c 65 28 76 29 3b 0a 20 20 7d 0a 20 20  sable(v);.  }.  
fbd0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
fbe0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
fbf0: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
fc00: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
fc10: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f  ITE_OMIT_WAL.  /
fc20: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
fc30: 5b 73 63 68 65 6d 61 2e 5d 77 61 6c 5f 63 68 65  [schema.]wal_che
fc40: 63 6b 70 6f 69 6e 74 20 3d 20 70 61 73 73 69 76  ckpoint = passiv
fc50: 65 7c 66 75 6c 6c 7c 72 65 73 74 61 72 74 7c 74  e|full|restart|t
fc60: 72 75 6e 63 61 74 65 0a 20 20 2a 2a 0a 20 20 2a  runcate.  **.  *
fc70: 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 74 68 65  * Checkpoint the
fc80: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
fc90: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 57    case PragTyp_W
fca0: 41 4c 5f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b  AL_CHECKPOINT: {
fcb0: 0a 20 20 20 20 69 6e 74 20 69 42 74 20 3d 20 28  .    int iBt = (
fcc0: 70 49 64 32 2d 3e 7a 3f 69 44 62 3a 53 51 4c 49  pId2->z?iDb:SQLI
fcd0: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 29  TE_MAX_ATTACHED)
fce0: 3b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65 20  ;.    int eMode 
fcf0: 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  = SQLITE_CHECKPO
fd00: 49 4e 54 5f 50 41 53 53 49 56 45 3b 0a 20 20 20  INT_PASSIVE;.   
fd10: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
fd20: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
fd30: 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  StrICmp(zRight, 
fd40: 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  "full")==0 ){.  
fd50: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51        eMode = SQ
fd60: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
fd70: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  FULL;.      }els
fd80: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
fd90: 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 72 65  ICmp(zRight, "re
fda0: 73 74 61 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20  start")==0 ){.  
fdb0: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51        eMode = SQ
fdc0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
fdd0: 52 45 53 54 41 52 54 3b 0a 20 20 20 20 20 20 7d  RESTART;.      }
fde0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
fdf0: 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  StrICmp(zRight, 
fe00: 22 74 72 75 6e 63 61 74 65 22 29 3d 3d 30 20 29  "truncate")==0 )
fe10: 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
fe20: 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  = SQLITE_CHECKPO
fe30: 49 4e 54 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20  INT_TRUNCATE;.  
fe40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fe50: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33  pParse->nMem = 3
fe60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fe70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 68  eAddOp3(v, OP_Ch
fe80: 65 63 6b 70 6f 69 6e 74 2c 20 69 42 74 2c 20 65  eckpoint, iBt, e
fe90: 4d 6f 64 65 2c 20 31 29 3b 0a 20 20 20 20 73 71  Mode, 1);.    sq
fea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
feb0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
fec0: 20 31 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 62 72   1, 3);.  }.  br
fed0: 65 61 6b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  eak;..  /*.  ** 
fee0: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74    PRAGMA wal_aut
fef0: 6f 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 2a 2a  ocheckpoint.  **
ff00: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75     PRAGMA wal_au
ff10: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 4e  tocheckpoint = N
ff20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69  .  **.  ** Confi
ff30: 67 75 72 65 20 61 20 64 61 74 61 62 61 73 65 20  gure a database 
ff40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 75  connection to au
ff50: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63  tomatically chec
ff60: 6b 70 6f 69 6e 74 20 61 20 64 61 74 61 62 61 73  kpoint a databas
ff70: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 63 63  e.  ** after acc
ff80: 75 6d 75 6c 61 74 69 6e 67 20 4e 20 66 72 61 6d  umulating N fram
ff90: 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 2e 20 4f  es in the log. O
ffa0: 72 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20  r query for the 
ffb0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 0a 20 20  current value.  
ffc0: 2a 2a 20 6f 66 20 4e 2e 0a 20 20 2a 2f 0a 20 20  ** of N..  */.  
ffd0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 57 41 4c  case PragTyp_WAL
ffe0: 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 3a  _AUTOCHECKPOINT:
fff0: 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
10000 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
10010 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
10020 70 6f 69 6e 74 28 64 62 2c 20 73 71 6c 69 74 65  point(db, sqlite
10030 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a  3Atoi(zRight));.
10040 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
10050 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 0a 20 20  SingleInt(v, .  
10060 20 20 20 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c       db->xWalCal
10070 6c 62 61 63 6b 3d 3d 73 71 6c 69 74 65 33 57 61  lback==sqlite3Wa
10080 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 20 3f 20 0a  lDefaultHook ? .
10090 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
100a0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 64 62 2d  E_PTR_TO_INT(db-
100b0 3e 70 57 61 6c 41 72 67 29 20 3a 20 30 29 3b 0a  >pWalArg) : 0);.
100c0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
100d0 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  dif..  /*.  **  
100e0 50 52 41 47 4d 41 20 73 68 72 69 6e 6b 5f 6d 65  PRAGMA shrink_me
100f0 6d 6f 72 79 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  mory.  **.  ** I
10100 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
10110 3a 20 52 2d 32 33 34 34 35 2d 34 36 31 30 39 20  : R-23445-46109 
10120 54 68 69 73 20 70 72 61 67 6d 61 20 63 61 75 73  This pragma caus
10130 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
10140 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20    ** connection 
10150 6f 6e 20 77 68 69 63 68 20 69 74 20 69 73 20 69  on which it is i
10160 6e 76 6f 6b 65 64 20 74 6f 20 66 72 65 65 20 75  nvoked to free u
10170 70 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  p as much memory
10180 20 61 73 20 69 74 0a 20 20 2a 2a 20 63 61 6e 2c   as it.  ** can,
10190 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
101a0 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
101b0 65 6d 6f 72 79 28 29 2e 0a 20 20 2a 2f 0a 20 20  emory()..  */.  
101c0 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 48 52  case PragTyp_SHR
101d0 49 4e 4b 5f 4d 45 4d 4f 52 59 3a 20 7b 0a 20 20  INK_MEMORY: {.  
101e0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c    sqlite3_db_rel
101f0 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b  ease_memory(db);
10200 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
10210 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
10220 4d 41 20 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a  MA optimize.  **
10230 20 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a    PRAGMA optimiz
10240 65 28 4d 41 53 4b 29 0a 20 20 2a 2a 20 20 50 52  e(MASK).  **  PR
10250 41 47 4d 41 20 73 63 68 65 6d 61 2e 6f 70 74 69  AGMA schema.opti
10260 6d 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d  mize.  **  PRAGM
10270 41 20 73 63 68 65 6d 61 2e 6f 70 74 69 6d 69 7a  A schema.optimiz
10280 65 28 4d 41 53 4b 29 0a 20 20 2a 2a 0a 20 20 2a  e(MASK).  **.  *
10290 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 74  * Attempt to opt
102a0 69 6d 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  imize the databa
102b0 73 65 2e 20 20 41 6c 6c 20 73 63 68 65 6d 61 73  se.  All schemas
102c0 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 69   are optimized i
102d0 6e 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  n the first.  **
102e0 20 74 77 6f 20 66 6f 72 6d 73 2c 20 61 6e 64 20   two forms, and 
102f0 6f 6e 6c 79 20 74 68 65 20 73 70 65 63 69 66 69  only the specifi
10300 65 64 20 73 63 68 65 6d 61 20 69 73 20 6f 70 74  ed schema is opt
10310 69 6d 69 7a 65 64 20 69 6e 20 74 68 65 20 6c 61  imized in the la
10320 74 74 65 72 20 74 77 6f 2e 0a 20 20 2a 2a 0a 20  tter two..  **. 
10330 20 2a 2a 20 54 68 65 20 64 65 74 61 69 6c 73 20   ** The details 
10340 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  of optimizations
10350 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
10360 69 73 20 70 72 61 67 6d 61 20 61 72 65 20 65 78  is pragma are ex
10370 70 65 63 74 65 64 0a 20 20 2a 2a 20 74 6f 20 63  pected.  ** to c
10380 68 61 6e 67 65 20 61 6e 64 20 69 6d 70 72 6f 76  hange and improv
10390 65 20 6f 76 65 72 20 74 69 6d 65 2e 20 20 41 70  e over time.  Ap
103a0 70 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c  plications shoul
103b0 64 20 61 6e 74 69 63 69 70 61 74 65 20 74 68 61  d anticipate tha
103c0 74 0a 20 20 2a 2a 20 74 68 69 73 20 70 72 61 67  t.  ** this prag
103d0 6d 61 20 77 69 6c 6c 20 70 65 72 66 6f 72 6d 20  ma will perform 
103e0 6e 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  new optimization
103f0 73 20 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65  s in future rele
10400 61 73 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ases..  **.  ** 
10410 54 68 65 20 6f 70 74 69 6f 6e 61 6c 20 61 72 67  The optional arg
10420 75 6d 65 6e 74 20 69 73 20 61 20 62 69 74 6d 61  ument is a bitma
10430 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69  sk of optimizati
10440 6f 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d 3a 0a  ons to perform:.
10450 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30    **.  **    0x0
10460 30 30 31 20 20 20 20 44 65 62 75 67 67 69 6e 67  001    Debugging
10470 20 6d 6f 64 65 2e 20 20 44 6f 20 6e 6f 74 20 61   mode.  Do not a
10480 63 74 75 61 6c 6c 79 20 70 65 72 66 6f 72 6d 20  ctually perform 
10490 61 6e 79 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  any optimization
104a0 73 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  s.  **          
104b0 20 20 20 20 62 75 74 20 69 6e 73 74 65 61 64 20      but instead 
104c0 72 65 74 75 72 6e 20 6f 6e 65 20 6c 69 6e 65 20  return one line 
104d0 6f 66 20 74 65 78 74 20 66 6f 72 20 65 61 63 68  of text for each
104e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
104f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10500 74 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65 20  that would have 
10510 62 65 65 6e 20 64 6f 6e 65 2e 20 20 4f 66 66 20  been done.  Off 
10520 62 79 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2a  by default..  **
10530 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 32 20  .  **    0x0002 
10540 20 20 20 52 75 6e 20 41 4e 41 4c 59 5a 45 20 6f     Run ANALYZE o
10550 6e 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69  n tables that mi
10560 67 68 74 20 62 65 6e 65 66 69 74 2e 20 20 4f 6e  ght benefit.  On
10570 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a   by default..  *
10580 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  *              S
10590 65 65 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64  ee below for add
105a0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
105b0 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ion..  **.  **  
105c0 20 20 30 78 30 30 30 34 20 20 20 20 28 4e 6f 74    0x0004    (Not
105d0 20 79 65 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   yet implemented
105e0 29 20 52 65 63 6f 72 64 20 75 73 61 67 65 20 61  ) Record usage a
105f0 6e 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 0a  nd performance .
10600 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
10610 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72    information fr
10620 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  om the current s
10630 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ession in the.  
10640 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10650 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 6f  database file so
10660 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
10670 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 22 6f   available to "o
10680 70 74 69 6d 69 7a 65 22 0a 20 20 2a 2a 20 20 20  ptimize".  **   
10690 20 20 20 20 20 20 20 20 20 20 20 70 72 61 67 6d             pragm
106a0 61 73 20 72 75 6e 20 62 79 20 66 75 74 75 72 65  as run by future
106b0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
106c0 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
106d0 20 20 20 20 30 78 30 30 30 38 20 20 20 20 28 4e      0x0008    (N
106e0 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d 65 6e 74  ot yet implement
106f0 65 64 29 20 43 72 65 61 74 65 20 69 6e 64 65 78  ed) Create index
10700 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 68 61  es that might ha
10710 76 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  ve.  **         
10720 20 20 20 20 20 62 65 65 6e 20 68 65 6c 70 66 75       been helpfu
10730 6c 20 74 6f 20 72 65 63 65 6e 74 20 71 75 65 72  l to recent quer
10740 69 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ies.  **.  ** Th
10750 65 20 64 65 66 61 75 6c 74 20 4d 41 53 4b 20 69  e default MASK i
10760 73 20 61 6e 64 20 61 6c 77 61 79 73 20 73 68 61  s and always sha
10770 6c 6c 20 62 65 20 30 78 66 66 66 65 2e 20 20 30  ll be 0xfffe.  0
10780 78 66 66 66 65 20 6d 65 61 6e 73 20 70 65 72 66  xfffe means perf
10790 6f 72 6d 20 61 6c 6c 0a 20 20 2a 2a 20 6f 66 20  orm all.  ** of 
107a0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
107b0 73 20 6c 69 73 74 65 64 20 61 62 6f 76 65 20 65  s listed above e
107c0 78 63 65 70 74 20 44 65 62 75 67 20 4d 6f 64 65  xcept Debug Mode
107d0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6e 65 77 0a  , including new.
107e0 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f    ** optimizatio
107f0 6e 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 74  ns that have not
10800 20 79 65 74 20 62 65 65 6e 20 69 6e 76 65 6e 74   yet been invent
10810 65 64 2e 20 20 49 66 20 6e 65 77 20 6f 70 74 69  ed.  If new opti
10820 6d 69 7a 61 74 69 6f 6e 73 20 61 72 65 0a 20 20  mizations are.  
10830 2a 2a 20 65 76 65 72 20 61 64 64 65 64 20 74 68  ** ever added th
10840 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 66 66  at should be off
10850 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68 6f   by default, tho
10860 73 65 20 6f 66 66 2d 62 79 2d 64 65 66 61 75 6c  se off-by-defaul
10870 74 20 0a 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61  t .  ** optimiza
10880 74 69 6f 6e 73 20 77 69 6c 6c 20 68 61 76 65 20  tions will have 
10890 62 69 74 6d 61 73 6b 73 20 6f 66 20 30 78 31 30  bitmasks of 0x10
108a0 30 30 30 20 6f 72 20 6c 61 72 67 65 72 2e 0a 20  000 or larger.. 
108b0 20 2a 2a 0a 20 20 2a 2a 20 44 45 54 45 52 4d 49   **.  ** DETERMI
108c0 4e 41 54 49 4f 4e 20 4f 46 20 57 48 45 4e 20 54  NATION OF WHEN T
108d0 4f 20 52 55 4e 20 41 4e 41 4c 59 5a 45 0a 20 20  O RUN ANALYZE.  
108e0 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 63  **.  ** In the c
108f0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
10900 61 74 69 6f 6e 2c 20 61 20 74 61 62 6c 65 20 69  ation, a table i
10910 73 20 61 6e 61 6c 79 7a 65 64 20 69 66 20 6f 6e  s analyzed if on
10920 6c 79 20 69 66 20 61 6c 6c 20 6f 66 0a 20 20 2a  ly if all of.  *
10930 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
10940 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20  are true:.  **. 
10950 20 2a 2a 20 28 31 29 20 4d 41 53 4b 20 62 69 74   ** (1) MASK bit
10960 20 30 78 30 32 20 69 73 20 73 65 74 2e 0a 20 20   0x02 is set..  
10970 2a 2a 0a 20 20 2a 2a 20 28 32 29 20 54 68 65 20  **.  ** (2) The 
10980 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 75 73  query planner us
10990 65 64 20 73 71 6c 69 74 65 5f 73 74 61 74 31 2d  ed sqlite_stat1-
109a0 73 74 79 6c 65 20 73 74 61 74 69 73 74 69 63 73  style statistics
109b0 20 66 6f 72 20 6f 6e 65 20 6f 72 0a 20 20 2a 2a   for one or.  **
109c0 20 20 20 20 20 6d 6f 72 65 20 69 6e 64 65 78 65       more indexe
109d0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
109e0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 64 75 72  t some point dur
109f0 69 6e 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65  ing the lifetime
10a00 20 6f 66 0a 20 20 2a 2a 20 20 20 20 20 74 68 65   of.  **     the
10a10 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74   current connect
10a20 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28  ion..  **.  ** (
10a30 33 29 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  3) One or more i
10a40 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20 74 61  ndexes of the ta
10a50 62 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ble are currentl
10a60 79 20 75 6e 61 6e 61 6c 79 7a 65 64 20 4f 52 0a  y unanalyzed OR.
10a70 20 20 2a 2a 20 20 20 20 20 74 68 65 20 6e 75 6d    **     the num
10a80 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
10a90 68 65 20 74 61 62 6c 65 20 68 61 73 20 69 6e 63  he table has inc
10aa0 72 65 61 73 65 64 20 62 79 20 32 35 20 74 69 6d  reased by 25 tim
10ab0 65 73 20 6f 72 20 6d 6f 72 65 0a 20 20 2a 2a 20  es or more.  ** 
10ac0 20 20 20 20 73 69 6e 63 65 20 74 68 65 20 6c 61      since the la
10ad0 73 74 20 74 69 6d 65 20 41 4e 41 4c 59 5a 45 20  st time ANALYZE 
10ae0 77 61 73 20 72 75 6e 2e 0a 20 20 2a 2a 0a 20 20  was run..  **.  
10af0 2a 2a 20 54 68 65 20 72 75 6c 65 73 20 66 6f 72  ** The rules for
10b00 20 77 68 65 6e 20 74 61 62 6c 65 73 20 61 72 65   when tables are
10b10 20 61 6e 61 6c 79 7a 65 64 20 61 72 65 20 6c 69   analyzed are li
10b20 6b 65 6c 79 20 74 6f 20 63 68 61 6e 67 65 20 69  kely to change i
10b30 6e 0a 20 20 2a 2a 20 66 75 74 75 72 65 20 72 65  n.  ** future re
10b40 6c 65 61 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 63  leases..  */.  c
10b50 61 73 65 20 50 72 61 67 54 79 70 5f 4f 50 54 49  ase PragTyp_OPTI
10b60 4d 49 5a 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20  MIZE: {.    int 
10b70 69 44 62 4c 61 73 74 3b 20 20 20 20 20 20 20 20  iDbLast;        
10b80 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 65 72 6d 69     /* Loop termi
10b90 6e 61 74 69 6f 6e 20 70 6f 69 6e 74 20 66 6f 72  nation point for
10ba0 20 74 68 65 20 73 63 68 65 6d 61 20 6c 6f 6f 70   the schema loop
10bb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 61 62   */.    int iTab
10bc0 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Cur;           /
10bd0 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 61 20 74  * Cursor for a t
10be0 61 62 6c 65 20 77 68 6f 73 65 20 73 69 7a 65 20  able whose size 
10bf0 6e 65 65 64 73 20 63 68 65 63 6b 69 6e 67 20 2a  needs checking *
10c00 2f 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a  /.    HashElem *
10c10 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k;           /* 
10c20 4c 6f 6f 70 20 6f 76 65 72 20 74 61 62 6c 65 73  Loop over tables
10c30 20 6f 66 20 61 20 73 63 68 65 6d 61 20 2a 2f 0a   of a schema */.
10c40 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68      Schema *pSch
10c50 65 6d 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ema;       /* Th
10c60 65 20 63 75 72 72 65 6e 74 20 73 63 68 65 6d 61  e current schema
10c70 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
10c80 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Tab;           /
10c90 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
10ca0 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 49   schema */.    I
10cb0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
10cc0 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
10cd0 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  x of the table *
10ce0 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 73 7a 54  /.    LogEst szT
10cf0 68 72 65 73 68 6f 6c 64 3b 20 20 20 20 2f 2a 20  hreshold;    /* 
10d00 53 69 7a 65 20 74 68 72 65 73 68 6f 6c 64 20 61  Size threshold a
10d10 62 6f 76 65 20 77 68 69 63 68 20 72 65 61 6e 61  bove which reana
10d20 6c 79 73 69 73 20 69 73 20 6e 65 65 64 64 20 2a  lysis is needd *
10d30 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 75 62  /.    char *zSub
10d40 53 71 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Sql;         /* 
10d50 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  SQL statement fo
10d60 72 20 74 68 65 20 4f 50 5f 53 71 6c 45 78 65 63  r the OP_SqlExec
10d70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 75   opcode */.    u
10d80 33 32 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  32 opMask;      
10d90 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
10da0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 70   operations to p
10db0 65 72 66 6f 72 6d 20 2a 2f 0a 0a 20 20 20 20 69  erform */..    i
10dc0 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
10dd0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 28 75 33 32     opMask = (u32
10de0 29 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69  )sqlite3Atoi(zRi
10df0 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ght);.      if( 
10e00 28 6f 70 4d 61 73 6b 20 26 20 30 78 30 32 29 3d  (opMask & 0x02)=
10e10 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
10e20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 70 4d  }else{.      opM
10e30 61 73 6b 20 3d 20 30 78 66 66 66 65 3b 0a 20 20  ask = 0xfffe;.  
10e40 20 20 7d 0a 20 20 20 20 69 54 61 62 43 75 72 20    }.    iTabCur 
10e50 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
10e60 3b 0a 20 20 20 20 66 6f 72 28 69 44 62 4c 61 73  ;.    for(iDbLas
10e70 74 20 3d 20 7a 44 62 3f 69 44 62 3a 64 62 2d 3e  t = zDb?iDb:db->
10e80 6e 44 62 2d 31 3b 20 69 44 62 3c 3d 69 44 62 4c  nDb-1; iDb<=iDbL
10e90 61 73 74 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20  ast; iDb++){.   
10ea0 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 20     if( iDb==1 ) 
10eb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
10ec0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
10ed0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
10ee0 69 44 62 29 3b 0a 20 20 20 20 20 20 70 53 63 68  iDb);.      pSch
10ef0 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
10f00 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  b].pSchema;.    
10f10 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
10f20 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
10f30 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b 20 6b  ->tblHash); k; k
10f40 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
10f50 6b 29 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  k)){.        pTa
10f60 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
10f70 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 0a  teHashData(k);..
10f80 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 61          /* If ta
10f90 62 6c 65 20 70 54 61 62 20 68 61 73 20 6e 6f 74  ble pTab has not
10fa0 20 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20   been used in a 
10fb0 77 61 79 20 74 68 61 74 20 77 6f 75 6c 64 20 62  way that would b
10fc0 65 6e 65 66 69 74 20 66 72 6f 6d 0a 20 20 20 20  enefit from.    
10fd0 20 20 20 20 2a 2a 20 68 61 76 69 6e 67 20 61 6e      ** having an
10fe0 61 6c 79 73 69 73 20 73 74 61 74 69 73 74 69 63  alysis statistic
10ff0 73 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  s during the cur
11000 72 65 6e 74 20 73 65 73 73 69 6f 6e 2c 20 74 68  rent session, th
11010 65 6e 20 73 6b 69 70 20 69 74 2e 0a 20 20 20 20  en skip it..    
11020 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 73 6f      ** This also
11030 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
11040 6f 66 20 73 6b 69 70 70 69 6e 67 20 76 69 72 74  of skipping virt
11050 75 61 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 76  ual tables and v
11060 69 65 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  iews */.        
11070 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
11080 61 67 73 20 26 20 54 46 5f 53 74 61 74 73 55 73  ags & TF_StatsUs
11090 65 64 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ed)==0 ) continu
110a0 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  e;..        /* R
110b0 65 61 6e 61 6c 79 7a 65 20 69 66 20 74 68 65 20  eanalyze if the 
110c0 74 61 62 6c 65 20 69 73 20 32 35 20 74 69 6d 65  table is 25 time
110d0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
110e0 65 20 6c 61 73 74 20 61 6e 61 6c 79 73 69 73 20  e last analysis 
110f0 2a 2f 0a 20 20 20 20 20 20 20 20 73 7a 54 68 72  */.        szThr
11100 65 73 68 6f 6c 64 20 3d 20 70 54 61 62 2d 3e 6e  eshold = pTab->n
11110 52 6f 77 4c 6f 67 45 73 74 20 2b 20 34 36 3b 20  RowLogEst + 46; 
11120 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4c  assert( sqlite3L
11130 6f 67 45 73 74 28 32 35 29 3d 3d 34 36 20 29 3b  ogEst(25)==46 );
11140 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
11150 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
11160 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
11170 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
11180 20 20 20 69 66 28 20 21 70 49 64 78 2d 3e 68 61     if( !pIdx->ha
11190 73 53 74 61 74 31 20 29 7b 0a 20 20 20 20 20 20  sStat1 ){.      
111a0 20 20 20 20 20 20 73 7a 54 68 72 65 73 68 6f 6c        szThreshol
111b0 64 20 3d 20 30 3b 20 2f 2a 20 41 6c 77 61 79 73  d = 0; /* Always
111c0 20 61 6e 61 6c 79 7a 65 20 69 66 20 61 6e 79 20   analyze if any 
111d0 69 6e 64 65 78 20 6c 61 63 6b 73 20 73 74 61 74  index lacks stat
111e0 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 20 20  istics */.      
111f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11210 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
11220 7a 54 68 72 65 73 68 6f 6c 64 20 29 7b 0a 20 20  zThreshold ){.  
11230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
11240 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
11250 20 69 54 61 62 43 75 72 2c 20 69 44 62 2c 20 70   iTabCur, iDb, p
11260 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
11270 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
11280 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11290 2c 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 2c 20  , OP_IfSmaller, 
112a0 69 54 61 62 43 75 72 2c 20 0a 20 20 20 20 20 20  iTabCur, .      
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
112d0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2b 28  rrentAddr(v)+2+(
112e0 6f 70 4d 61 73 6b 26 31 29 2c 20 73 7a 54 68 72  opMask&1), szThr
112f0 65 73 68 6f 6c 64 29 3b 0a 20 20 20 20 20 20 20  eshold);.       
11300 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
11310 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  v);.        }.  
11320 20 20 20 20 20 20 7a 53 75 62 53 71 6c 20 3d 20        zSubSql = 
11330 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
11340 62 2c 20 22 41 4e 41 4c 59 5a 45 20 5c 22 25 77  b, "ANALYZE \"%w
11350 5c 22 2e 5c 22 25 77 5c 22 22 2c 0a 20 20 20 20  \".\"%w\"",.    
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
11380 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
11390 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  me, pTab->zName)
113a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 70  ;.        if( op
113b0 4d 61 73 6b 20 26 20 30 78 30 31 20 29 7b 0a 20  Mask & 0x01 ){. 
113c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
113d0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
113e0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
113f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11400 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
11410 74 72 69 6e 67 38 2c 20 30 2c 20 72 31 2c 20 30  tring8, 0, r1, 0
11420 2c 20 7a 53 75 62 53 71 6c 2c 20 50 34 5f 44 59  , zSubSql, P4_DY
11430 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
11440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11450 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
11460 52 6f 77 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  Row, r1, 1);.   
11470 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11480 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11490 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 71  eAddOp4(v, OP_Sq
114a0 6c 45 78 65 63 2c 20 30 2c 20 30 2c 20 30 2c 20  lExec, 0, 0, 0, 
114b0 7a 53 75 62 53 71 6c 2c 20 50 34 5f 44 59 4e 41  zSubSql, P4_DYNA
114c0 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  MIC);.        }.
114d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
114e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
114f0 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op0(v, OP_Expire
11500 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
11510 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  }..  /*.  **   P
11520 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f  RAGMA busy_timeo
11530 75 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  ut.  **   PRAGMA
11540 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 3d 20   busy_timeout = 
11550 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 61 6c 6c  N.  **.  ** Call
11560 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
11570 6d 65 6f 75 74 28 64 62 2c 20 4e 29 2e 20 20 52  meout(db, N).  R
11580 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
11590 74 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 0a  t timeout value.
115a0 20 20 2a 2a 20 69 66 20 6f 6e 65 20 69 73 20 73    ** if one is s
115b0 65 74 2e 20 20 49 66 20 6e 6f 20 62 75 73 79 20  et.  If no busy 
115c0 68 61 6e 64 6c 65 72 20 6f 72 20 61 20 64 69 66  handler or a dif
115d0 66 65 72 65 6e 74 20 62 75 73 79 20 68 61 6e 64  ferent busy hand
115e0 6c 65 72 20 69 73 20 73 65 74 0a 20 20 2a 2a 20  ler is set.  ** 
115f0 74 68 65 6e 20 30 20 69 73 20 72 65 74 75 72 6e  then 0 is return
11600 65 64 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65  ed.  Setting the
11610 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 74 6f   busy_timeout to
11620 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 0a 20   0 or negative. 
11630 20 2a 2a 20 64 69 73 61 62 6c 65 73 20 74 68 65   ** disables the
11640 20 74 69 6d 65 6f 75 74 2e 0a 20 20 2a 2f 0a 20   timeout..  */. 
11650 20 2f 2a 63 61 73 65 20 50 72 61 67 54 79 70 5f   /*case PragTyp_
11660 42 55 53 59 5f 54 49 4d 45 4f 55 54 2a 2f 20 64  BUSY_TIMEOUT*/ d
11670 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 61 73  efault: {.    as
11680 73 65 72 74 28 20 70 50 72 61 67 6d 61 2d 3e 65  sert( pPragma->e
11690 50 72 61 67 54 79 70 3d 3d 50 72 61 67 54 79 70  PragTyp==PragTyp
116a0 5f 42 55 53 59 5f 54 49 4d 45 4f 55 54 20 29 3b  _BUSY_TIMEOUT );
116b0 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
116c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
116d0 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62  _busy_timeout(db
116e0 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  , sqlite3Atoi(zR
116f0 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ight));.    }.  
11700 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
11710 74 28 76 2c 20 64 62 2d 3e 62 75 73 79 54 69 6d  t(v, db->busyTim
11720 65 6f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b  eout);.    break
11730 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
11740 20 20 20 50 52 41 47 4d 41 20 73 6f 66 74 5f 68     PRAGMA soft_h
11750 65 61 70 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20  eap_limit.  **  
11760 20 50 52 41 47 4d 41 20 73 6f 66 74 5f 68 65 61   PRAGMA soft_hea
11770 70 5f 6c 69 6d 69 74 20 3d 20 4e 0a 20 20 2a 2a  p_limit = N.  **
11780 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
11790 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 36 33 34 33  TION-OF: R-26343
117a0 2d 34 35 39 33 30 20 54 68 69 73 20 70 72 61 67  -45930 This prag
117b0 6d 61 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 20  ma invokes the. 
117c0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66 74   ** sqlite3_soft
117d0 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 29 20  _heap_limit64() 
117e0 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 20 74  interface with t
117f0 68 65 20 61 72 67 75 6d 65 6e 74 20 4e 2c 20 69  he argument N, i
11800 66 20 4e 20 69 73 0a 20 20 2a 2a 20 73 70 65 63  f N is.  ** spec
11810 69 66 69 65 64 20 61 6e 64 20 69 73 20 61 20 6e  ified and is a n
11820 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
11830 67 65 72 2e 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d  ger..  ** IMPLEM
11840 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36  ENTATION-OF: R-6
11850 34 34 35 31 2d 30 37 31 36 33 20 54 68 65 20 73  4451-07163 The s
11860 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 70  oft_heap_limit p
11870 72 61 67 6d 61 20 61 6c 77 61 79 73 0a 20 20 2a  ragma always.  *
11880 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61  * returns the sa
11890 6d 65 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  me integer that 
118a0 77 6f 75 6c 64 20 62 65 20 72 65 74 75 72 6e 65  would be returne
118b0 64 20 62 79 20 74 68 65 0a 20 20 2a 2a 20 73 71  d by the.  ** sq
118c0 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
118d0 6c 69 6d 69 74 36 34 28 2d 31 29 20 43 2d 6c 61  limit64(-1) C-la
118e0 6e 67 75 61 67 65 20 66 75 6e 63 74 69 6f 6e 2e  nguage function.
118f0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
11900 67 54 79 70 5f 53 4f 46 54 5f 48 45 41 50 5f 4c  gTyp_SOFT_HEAP_L
11910 49 4d 49 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69  IMIT: {.    sqli
11920 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20  te3_int64 N;.   
11930 20 69 66 28 20 7a 52 69 67 68 74 20 26 26 20 73   if( zRight && s
11940 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
11950 49 36 34 28 7a 52 69 67 68 74 2c 20 26 4e 29 3d  I64(zRight, &N)=
11960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11970 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74      sqlite3_soft
11980 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29  _heap_limit64(N)
11990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
119a0 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73  rnSingleInt(v, s
119b0 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
119c0 5f 6c 69 6d 69 74 36 34 28 2d 31 29 29 3b 0a 20  _limit64(-1));. 
119d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
119e0 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
119f0 41 20 74 68 72 65 61 64 73 0a 20 20 2a 2a 20 20  A threads.  **  
11a00 20 50 52 41 47 4d 41 20 74 68 72 65 61 64 73 20   PRAGMA threads 
11a10 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  = N.  **.  ** Co
11a20 6e 66 69 67 75 72 65 20 74 68 65 20 6d 61 78 69  nfigure the maxi
11a30 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f  mum number of wo
11a40 72 6b 65 72 20 74 68 72 65 61 64 73 2e 20 20 52  rker threads.  R
11a50 65 74 75 72 6e 20 74 68 65 20 6e 65 77 0a 20 20  eturn the new.  
11a60 2a 2a 20 6d 61 78 69 6d 75 6d 2c 20 77 68 69 63  ** maximum, whic
11a70 68 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20  h might be less 
11a80 74 68 61 6e 20 72 65 71 75 65 73 74 65 64 2e 0a  than requested..
11a90 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
11aa0 54 79 70 5f 54 48 52 45 41 44 53 3a 20 7b 0a 20  Typ_THREADS: {. 
11ab0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
11ac0 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67   N;.    if( zRig
11ad0 68 74 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  ht.     && sqlit
11ae0 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
11af0 7a 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c  zRight, &N)==SQL
11b00 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20 4e  ITE_OK.     && N
11b10 3e 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  >=0.    ){.     
11b20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64   sqlite3_limit(d
11b30 62 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  b, SQLITE_LIMIT_
11b40 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 20  WORKER_THREADS, 
11b50 28 69 6e 74 29 28 4e 26 30 78 37 66 66 66 66 66  (int)(N&0x7fffff
11b60 66 66 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ff));.    }.    
11b70 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
11b80 76 2c 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  v, sqlite3_limit
11b90 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49  (db, SQLITE_LIMI
11ba0 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
11bb0 2c 20 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61  , -1));.    brea
11bc0 6b 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65 66 69  k;.  }..#if defi
11bd0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
11be0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
11bf0 49 54 45 5f 54 45 53 54 29 0a 20 20 2f 2a 0a 20  ITE_TEST).  /*. 
11c00 20 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63   ** Report the c
11c10 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
11c20 66 69 6c 65 20 6c 6f 67 73 20 66 6f 72 20 61 6c  file logs for al
11c30 6c 20 64 61 74 61 62 61 73 65 73 0a 20 20 2a 2f  l databases.  */
11c40 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
11c50 4c 4f 43 4b 5f 53 54 41 54 55 53 3a 20 7b 0a 20  LOCK_STATUS: {. 
11c60 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
11c70 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 4c 6f  char *const azLo
11c80 63 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20  ckName[] = {.   
11c90 20 20 20 22 75 6e 6c 6f 63 6b 65 64 22 2c 20 22     "unlocked", "
11ca0 73 68 61 72 65 64 22 2c 20 22 72 65 73 65 72 76  shared", "reserv
11cb0 65 64 22 2c 20 22 70 65 6e 64 69 6e 67 22 2c 20  ed", "pending", 
11cc0 22 65 78 63 6c 75 73 69 76 65 22 0a 20 20 20 20  "exclusive".    
11cd0 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  };.    int i;.  
11ce0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
11cf0 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   2;.    for(i=0;
11d00 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
11d10 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
11d20 42 74 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  Bt;.      const 
11d30 63 68 61 72 20 2a 7a 53 74 61 74 65 20 3d 20 22  char *zState = "
11d40 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 20 20  unknown";.      
11d50 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28  int j;.      if(
11d60 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53   db->aDb[i].zDbS
11d70 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Name==0 ) contin
11d80 75 65 3b 0a 20 20 20 20 20 20 70 42 74 20 3d 20  ue;.      pBt = 
11d90 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
11da0 20 20 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30        if( pBt==0
11db0 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65   || sqlite3Btree
11dc0 50 61 67 65 72 28 70 42 74 29 3d 3d 30 20 29 7b  Pager(pBt)==0 ){
11dd0 0a 20 20 20 20 20 20 20 20 7a 53 74 61 74 65 20  .        zState 
11de0 3d 20 22 63 6c 6f 73 65 64 22 3b 0a 20 20 20 20  = "closed";.    
11df0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
11e00 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
11e10 28 64 62 2c 20 69 20 3f 20 64 62 2d 3e 61 44 62  (db, i ? db->aDb
11e20 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 30  [i].zDbSName : 0
11e30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46          SQLITE_F
11e60 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20  CNTL_LOCKSTATE, 
11e70 26 6a 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  &j)==SQLITE_OK )
11e80 7b 0a 20 20 20 20 20 20 20 20 20 7a 53 74 61 74  {.         zStat
11e90 65 20 3d 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 6a  e = azLockName[j
11ea0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
11eb0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
11ec0 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 73 22  iLoad(v, 1, "ss"
11ed0 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62  , db->aDb[i].zDb
11ee0 53 4e 61 6d 65 2c 20 7a 53 74 61 74 65 29 3b 0a  SName, zState);.
11ef0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
11f00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
11f10 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
11f20 4f 44 45 43 0a 20 20 2f 2a 20 50 72 61 67 6d 61  ODEC.  /* Pragma
11f30 20 20 20 20 20 20 20 20 69 41 72 67 0a 20 20 2a          iArg.  *
11f40 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 2d  * ----------   -
11f50 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 6b 65 79 20  -----.  **  key 
11f60 20 20 20 20 20 20 20 20 20 20 30 0a 20 20 2a 2a            0.  **
11f70 20 20 72 65 6b 65 79 20 20 20 20 20 20 20 20 20    rekey         
11f80 31 0a 20 20 2a 2a 20 20 68 65 78 6b 65 79 20 20  1.  **  hexkey  
11f90 20 20 20 20 20 20 32 0a 20 20 2a 2a 20 20 68 65        2.  **  he
11fa0 78 72 65 6b 65 79 20 20 20 20 20 20 33 0a 20 20  xrekey      3.  
11fb0 2a 2a 20 20 74 65 78 74 6b 65 79 20 20 20 20 20  **  textkey     
11fc0 20 20 34 0a 20 20 2a 2a 20 20 74 65 78 74 72 65    4.  **  textre
11fd0 6b 65 79 20 20 20 20 20 35 0a 20 20 2a 2f 0a 20  key     5.  */. 
11fe0 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4b 45   case PragTyp_KE
11ff0 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  Y: {.    if( zRi
12000 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ght ){.      int
12010 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41   n = pPragma->iA
12020 72 67 3c 34 20 3f 20 73 71 6c 69 74 65 33 53 74  rg<4 ? sqlite3St
12030 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 20 3a  rlen30(zRight) :
12040 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28   -1;.      if( (
12050 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20 26 20  pPragma->iArg & 
12060 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
12070 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28   sqlite3_key_v2(
12080 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c  db, zDb, zRight,
12090 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   n);.      }else
120a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
120b0 33 5f 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a  3_rekey_v2(db, z
120c0 44 62 2c 20 7a 52 69 67 68 74 2c 20 6e 29 3b 0a  Db, zRight, n);.
120d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
120e0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63    break;.  }.  c
120f0 61 73 65 20 50 72 61 67 54 79 70 5f 48 45 58 4b  ase PragTyp_HEXK
12100 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  EY: {.    if( zR
12110 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 75 38  ight ){.      u8
12120 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e   iByte;.      in
12130 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20  t i;.      char 
12140 7a 4b 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20  zKey[40];.      
12150 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30  for(i=0, iByte=0
12160 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29  ; i<sizeof(zKey)
12170 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49 73 78  *2 && sqlite3Isx
12180 64 69 67 69 74 28 7a 52 69 67 68 74 5b 69 5d 29  digit(zRight[i])
12190 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
121a0 69 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c  iByte = (iByte<<
121b0 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54  4) + sqlite3HexT
121c0 6f 49 6e 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b  oInt(zRight[i]);
121d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69 26  .        if( (i&
121e0 31 29 21 3d 30 20 29 20 7a 4b 65 79 5b 69 2f 32  1)!=0 ) zKey[i/2
121f0 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20  ] = iByte;.     
12200 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 50   }.      if( (pP
12210 72 61 67 6d 61 2d 3e 69 41 72 67 20 26 20 31 29  ragma->iArg & 1)
12220 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
12230 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62  qlite3_key_v2(db
12240 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32  , zDb, zKey, i/2
12250 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12260 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12270 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62  rekey_v2(db, zDb
12280 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20  , zKey, i/2);.  
12290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
122a0 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
122b0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
122c0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
122d0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
122e0 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 29 0a  E_ENABLE_CEROD).
122f0 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
12300 43 54 49 56 41 54 45 5f 45 58 54 45 4e 53 49 4f  CTIVATE_EXTENSIO
12310 4e 53 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29  NS: if( zRight )
12320 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
12330 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66  HAS_CODEC.    if
12340 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
12350 70 28 7a 52 69 67 68 74 2c 20 22 73 65 65 2d 22  p(zRight, "see-"
12360 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)==0 ){.     
12370 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74   sqlite3_activat
12380 65 5f 73 65 65 28 26 7a 52 69 67 68 74 5b 34 5d  e_see(&zRight[4]
12390 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
123a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
123b0 41 42 4c 45 5f 43 45 52 4f 44 0a 20 20 20 20 69  ABLE_CEROD.    i
123c0 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
123d0 6d 70 28 7a 52 69 67 68 74 2c 20 22 63 65 72 6f  mp(zRight, "cero
123e0 64 2d 22 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20  d-", 6)==0 ){.  
123f0 20 20 20 20 73 71 6c 69 74 65 33 5f 61 63 74 69      sqlite3_acti
12400 76 61 74 65 5f 63 65 72 6f 64 28 26 7a 52 69 67  vate_cerod(&zRig
12410 68 74 5b 36 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  ht[6]);.    }.#e
12420 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b  ndif.  }.  break
12430 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a  ;.#endif..  } /*
12440 20 45 6e 64 20 6f 66 20 74 68 65 20 50 52 41 47   End of the PRAG
12450 4d 41 20 73 77 69 74 63 68 20 2a 2f 0a 0a 20 20  MA switch */..  
12460 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
12470 20 62 6c 6f 63 6b 20 69 73 20 61 20 6e 6f 2d 6f   block is a no-o
12480 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f  p unless SQLITE_
12490 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
124a0 2e 20 49 74 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20  . Its only.  ** 
124b0 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20 65 78  purpose is to ex
124c0 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
124d0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 76 65 72  tatements to ver
124e0 69 66 79 20 74 68 61 74 20 69 66 20 74 68 65 0a  ify that if the.
124f0 20 20 2a 2a 20 50 72 61 67 46 6c 67 5f 4e 6f 43    ** PragFlg_NoC
12500 6f 6c 75 6d 6e 73 31 20 66 6c 61 67 20 69 73 20  olumns1 flag is 
12510 73 65 74 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  set and the call
12520 65 72 20 73 70 65 63 69 66 69 65 64 20 61 6e 20  er specified an 
12530 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f  argument.  ** to
12540 20 74 68 65 20 50 52 41 47 4d 41 2c 20 74 68 65   the PRAGMA, the
12550 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12560 68 61 73 20 6e 6f 74 20 61 64 64 65 64 20 61 6e  has not added an
12570 79 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 0a  y OP_ResultRow .
12580 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
12590 73 20 74 6f 20 74 68 65 20 56 4d 2e 20 20 2a 2f  s to the VM.  */
125a0 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d  .  if( (pPragma-
125b0 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
125c0 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 20  Flg_NoColumns1) 
125d0 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  && zRight ){.   
125e0 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
125f0 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28 76 29  fyNoResultRow(v)
12600 3b 0a 20 20 7d 0a 0a 70 72 61 67 6d 61 5f 6f 75  ;.  }..pragma_ou
12610 74 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  t:.  sqlite3DbFr
12620 65 65 28 64 62 2c 20 7a 4c 65 66 74 29 3b 0a 20  ee(db, zLeft);. 
12630 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12640 62 2c 20 7a 52 69 67 68 74 29 3b 0a 7d 0a 23 69  b, zRight);.}.#i
12650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12660 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
126c0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
126d0 6f 66 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  of an eponymous 
126e0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
126f0 61 74 20 72 75 6e 73 20 61 20 70 72 61 67 6d 61  at runs a pragma
12700 2e 0a 2a 2a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ..**.*/.typedef 
12710 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61  struct PragmaVta
12720 62 20 50 72 61 67 6d 61 56 74 61 62 3b 0a 74 79  b PragmaVtab;.ty
12730 70 65 64 65 66 20 73 74 72 75 63 74 20 50 72 61  pedef struct Pra
12740 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 50 72  gmaVtabCursor Pr
12750 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 3b 0a  agmaVtabCursor;.
12760 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61  struct PragmaVta
12770 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  b {.  sqlite3_vt
12780 61 62 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  ab base;        
12790 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20 20  /* Base class.  
127a0 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f  Must be first */
127b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
127d0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
127e0 6e 65 63 74 69 6f 6e 20 74 6f 20 77 68 69 63 68  nection to which
127f0 20 69 74 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20   it belongs */. 
12800 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d   const PragmaNam
12810 65 20 2a 70 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61  e *pName;  /* Na
12820 6d 65 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61  me of the pragma
12830 20 2a 2f 0a 20 20 75 38 20 6e 48 69 64 64 65 6e   */.  u8 nHidden
12840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12850 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68 69 64  /* Number of hid
12860 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  den columns */. 
12870 20 75 38 20 69 48 69 64 64 65 6e 3b 20 20 20 20   u8 iHidden;    
12880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12890 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
128a0 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a   hidden column *
128b0 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 50 72 61 67  /.};.struct Prag
128c0 6d 61 56 74 61 62 43 75 72 73 6f 72 20 7b 0a 20  maVtabCursor {. 
128d0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
128e0 72 73 6f 72 20 62 61 73 65 3b 20 2f 2a 20 42 61  rsor base; /* Ba
128f0 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20  se class.  Must 
12900 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71  be first */.  sq
12910 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 72 61  lite3_stmt *pPra
12920 67 6d 61 3b 20 20 20 20 2f 2a 20 54 68 65 20 70  gma;    /* The p
12930 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 20  ragma statement 
12940 74 6f 20 72 75 6e 20 2a 2f 0a 20 20 73 71 6c 69  to run */.  sqli
12950 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 3b  te_int64 iRowid;
12960 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
12970 20 72 6f 77 69 64 20 2a 2f 0a 20 20 63 68 61 72   rowid */.  char
12980 20 2a 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20 20   *azArg[2];     
12990 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
129a0 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 61  f the argument a
129b0 6e 64 20 73 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a  nd schema */.};.
129c0 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ./* .** Pragma v
129d0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
129e0 75 6c 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74  ule xConnect met
129f0 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
12a00 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e  nt pragmaVtabCon
12a10 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  nect(.  sqlite3 
12a20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75  *db,.  void *pAu
12a30 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63  x,.  int argc, c
12a40 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
12a50 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33  *argv,.  sqlite3
12a60 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a  _vtab **ppVtab,.
12a70 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
12a80 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61  {.  const Pragma
12a90 4e 61 6d 65 20 2a 70 50 72 61 67 6d 61 20 3d 20  Name *pPragma = 
12aa0 28 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d  (const PragmaNam
12ab0 65 2a 29 70 41 75 78 3b 0a 20 20 50 72 61 67 6d  e*)pAux;.  Pragm
12ac0 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 30 3b  aVtab *pTab = 0;
12ad0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
12ae0 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 53   i, j;.  char cS
12af0 65 70 20 3d 20 27 28 27 3b 0a 20 20 53 74 72 41  ep = '(';.  StrA
12b00 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72  ccum acc;.  char
12b10 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 0a 20 20 55   zBuf[200];..  U
12b20 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12b30 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  argc);.  UNUSED_
12b40 50 41 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b  PARAMETER(argv);
12b50 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
12b60 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c 20  umInit(&acc, 0, 
12b70 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75  zBuf, sizeof(zBu
12b80 66 29 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  f), 0);.  sqlite
12b90 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
12ba0 26 61 63 63 2c 20 22 43 52 45 41 54 45 20 54 41  &acc, "CREATE TA
12bb0 42 4c 45 20 78 22 29 3b 0a 20 20 66 6f 72 28 69  BLE x");.  for(i
12bc0 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d 3e 69  =0, j=pPragma->i
12bd0 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 70 50 72  PragCName; i<pPr
12be0 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65  agma->nPragCName
12bf0 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
12c00 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
12c10 65 6e 64 66 28 26 61 63 63 2c 20 22 25 63 5c 22  endf(&acc, "%c\"
12c20 25 73 5c 22 22 2c 20 63 53 65 70 2c 20 70 72 61  %s\"", cSep, pra
12c30 67 43 4e 61 6d 65 5b 6a 5d 29 3b 0a 20 20 20 20  gCName[j]);.    
12c40 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 7d 0a  cSep = ',';.  }.
12c50 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20    if( i==0 ){.  
12c60 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
12c70 70 65 6e 64 66 28 26 61 63 63 2c 20 22 28 5c 22  pendf(&acc, "(\"
12c80 25 73 5c 22 22 2c 20 70 50 72 61 67 6d 61 2d 3e  %s\"", pPragma->
12c90 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 2b 2b 3b  zName);.    i++;
12ca0 0a 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20  .  }.  j = 0;.  
12cb0 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72  if( pPragma->mPr
12cc0 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
12cd0 52 65 73 75 6c 74 31 20 29 7b 0a 20 20 20 20 73  Result1 ){.    s
12ce0 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
12cf0 64 61 6c 6c 28 26 61 63 63 2c 20 22 2c 61 72 67  dall(&acc, ",arg
12d00 20 48 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a   HIDDEN");.    j
12d10 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ++;.  }.  if( pP
12d20 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
12d30 26 20 28 50 72 61 67 46 6c 67 5f 53 63 68 65 6d  & (PragFlg_Schem
12d40 61 4f 70 74 7c 50 72 61 67 46 6c 67 5f 53 63 68  aOpt|PragFlg_Sch
12d50 65 6d 61 52 65 71 29 20 29 7b 0a 20 20 20 20 73  emaReq) ){.    s
12d60 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
12d70 64 61 6c 6c 28 26 61 63 63 2c 20 22 2c 73 63 68  dall(&acc, ",sch
12d80 65 6d 61 20 48 49 44 44 45 4e 22 29 3b 0a 20 20  ema HIDDEN");.  
12d90 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c    j++;.  }.  sql
12da0 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
12db0 26 61 63 63 2c 20 22 29 22 2c 20 31 29 3b 0a 20  &acc, ")", 1);. 
12dc0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
12dd0 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20  Finish(&acc);.  
12de0 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a  assert( strlen(z
12df0 42 75 66 29 20 3c 20 73 69 7a 65 6f 66 28 7a 42  Buf) < sizeof(zB
12e00 75 66 29 2d 31 20 29 3b 0a 20 20 72 63 20 3d 20  uf)-1 );.  rc = 
12e10 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
12e20 76 74 61 62 28 64 62 2c 20 7a 42 75 66 29 3b 0a  vtab(db, zBuf);.
12e30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12e40 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 20  _OK ){.    pTab 
12e50 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 73  = (PragmaVtab*)s
12e60 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
12e70 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29  zeof(PragmaVtab)
12e80 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
12e90 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
12ea0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12eb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12ec0 6d 65 6d 73 65 74 28 70 54 61 62 2c 20 30 2c 20  memset(pTab, 0, 
12ed0 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61  sizeof(PragmaVta
12ee0 62 29 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  b));.      pTab-
12ef0 3e 70 4e 61 6d 65 20 3d 20 70 50 72 61 67 6d 61  >pName = pPragma
12f00 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62  ;.      pTab->db
12f10 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 70 54 61   = db;.      pTa
12f20 62 2d 3e 69 48 69 64 64 65 6e 20 3d 20 69 3b 0a  b->iHidden = i;.
12f30 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 48 69 64        pTab->nHid
12f40 64 65 6e 20 3d 20 6a 3b 0a 20 20 20 20 7d 0a 20  den = j;.    }. 
12f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45   }else{.    *pzE
12f60 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
12f70 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
12f80 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
12f90 20 20 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d    }..  *ppVtab =
12fa0 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29   (sqlite3_vtab*)
12fb0 70 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 72  pTab;.  return r
12fc0 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61  c;.}../* .** Pra
12fd0 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
12fe0 65 20 6d 6f 64 75 6c 65 20 78 44 69 73 63 6f 6e  e module xDiscon
12ff0 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  nect method..*/.
13000 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
13010 61 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  aVtabDisconnect(
13020 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
13030 74 61 62 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  tab){.  PragmaVt
13040 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67  ab *pTab = (Prag
13050 6d 61 56 74 61 62 2a 29 70 56 74 61 62 3b 0a 20  maVtab*)pVtab;. 
13060 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
13070 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ab);.  return SQ
13080 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 46  LITE_OK;.}../* F
13090 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 65  igure out the be
130a0 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
130b0 74 6f 20 73 65 61 72 63 68 20 61 20 70 72 61 67  to search a prag
130c0 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
130d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
130e0 65 20 6e 6f 74 20 72 65 61 6c 6c 79 20 61 6e 79  e not really any
130f0 20 69 6e 64 65 78 20 63 68 6f 69 63 65 73 2e 20   index choices. 
13100 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   But we want to 
13110 65 6e 63 6f 75 72 61 67 65 20 74 68 65 0a 2a 2a  encourage the.**
13120 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 74   query planner t
13130 6f 20 67 69 76 65 20 3d 3d 20 63 6f 6e 73 74 72  o give == constr
13140 61 69 6e 74 73 20 6f 6e 20 61 73 20 6d 61 6e 79  aints on as many
13150 20 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65   hidden paramete
13160 72 73 20 61 73 0a 2a 2a 20 70 6f 73 73 69 62 6c  rs as.** possibl
13170 65 2c 20 61 6e 64 20 65 73 70 65 63 69 61 6c 6c  e, and especiall
13180 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 68  y on the first h
13190 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 2e  idden parameter.
131a0 20 20 53 6f 20 72 65 74 75 72 6e 20 61 0a 2a 2a    So return a.**
131b0 20 68 69 67 68 20 63 6f 73 74 20 69 66 20 68 69   high cost if hi
131c0 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20  dden parameters 
131d0 61 72 65 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65  are unconstraine
131e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
131f0 20 70 72 61 67 6d 61 56 74 61 62 42 65 73 74 49   pragmaVtabBestI
13200 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61  ndex(sqlite3_vta
13210 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f  b *tab, sqlite3_
13220 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
13230 49 6e 66 6f 29 7b 0a 20 20 50 72 61 67 6d 61 56  Info){.  PragmaV
13240 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61  tab *pTab = (Pra
13250 67 6d 61 56 74 61 62 2a 29 74 61 62 3b 0a 20 20  gmaVtab*)tab;.  
13260 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
13270 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
13280 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69  raint *pConstrai
13290 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  nt;.  int i, j;.
132a0 20 20 69 6e 74 20 73 65 65 6e 5b 32 5d 3b 0a 0a    int seen[2];..
132b0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
132c0 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
132d0 62 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 54 61  ble)1;.  if( pTa
132e0 62 2d 3e 6e 48 69 64 64 65 6e 3d 3d 30 20 29 7b  b->nHidden==0 ){
132f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13300 4b 3b 20 7d 0a 20 20 70 43 6f 6e 73 74 72 61 69  K; }.  pConstrai
13310 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  nt = pIdxInfo->a
13320 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 73 65  Constraint;.  se
13330 65 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 73 65 65  en[0] = 0;.  see
13340 6e 5b 31 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28  n[1] = 0;.  for(
13350 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
13360 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
13370 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b  +, pConstraint++
13380 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73  ){.    if( pCons
13390 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d  traint->usable==
133a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
133b0 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e    if( pConstrain
133c0 74 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e  t->op!=SQLITE_IN
133d0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
133e0 51 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  Q ) continue;.  
133f0 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e    if( pConstrain
13400 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3c 20 70 54 61  t->iColumn < pTa
13410 62 2d 3e 69 48 69 64 64 65 6e 20 29 20 63 6f 6e  b->iHidden ) con
13420 74 69 6e 75 65 3b 0a 20 20 20 20 6a 20 3d 20 70  tinue;.    j = p
13430 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
13440 75 6d 6e 20 2d 20 70 54 61 62 2d 3e 69 48 69 64  umn - pTab->iHid
13450 64 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  den;.    assert(
13460 20 6a 20 3c 20 32 20 29 3b 0a 20 20 20 20 73 65   j < 2 );.    se
13470 65 6e 5b 6a 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d  en[j] = i+1;.  }
13480 0a 20 20 69 66 28 20 73 65 65 6e 5b 30 5d 3d 3d  .  if( seen[0]==
13490 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66  0 ){.    pIdxInf
134a0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
134b0 20 3d 20 28 64 6f 75 62 6c 65 29 32 31 34 37 34   = (double)21474
134c0 38 33 36 34 37 3b 0a 20 20 20 20 70 49 64 78 49  83647;.    pIdxI
134d0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
134e0 77 73 20 3d 20 32 31 34 37 34 38 33 36 34 37 3b  ws = 2147483647;
134f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13500 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6a 20 3d  TE_OK;.  }.  j =
13510 20 73 65 65 6e 5b 30 5d 2d 31 3b 0a 20 20 70 49   seen[0]-1;.  pI
13520 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
13530 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76  intUsage[j].argv
13540 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 70 49 64  Index = 1;.  pId
13550 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
13560 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20  ntUsage[j].omit 
13570 3d 20 31 3b 0a 20 20 69 66 28 20 73 65 65 6e 5b  = 1;.  if( seen[
13580 31 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  1]==0 ) return S
13590 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 49 64 78  QLITE_OK;.  pIdx
135a0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
135b0 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 30  ost = (double)20
135c0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
135d0 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 30  timatedRows = 20
135e0 3b 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 31 5d 2d  ;.  j = seen[1]-
135f0 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  1;.  pIdxInfo->a
13600 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
13610 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 32  j].argvIndex = 2
13620 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
13630 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
13640 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 72 65  ].omit = 1;.  re
13650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13660 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20 61 20 6e  }../* Create a n
13670 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
13680 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  e pragma virtual
13690 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63   table */.static
136a0 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4f   int pragmaVtabO
136b0 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62  pen(sqlite3_vtab
136c0 20 2a 70 56 74 61 62 2c 20 73 71 6c 69 74 65 33   *pVtab, sqlite3
136d0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70  _vtab_cursor **p
136e0 70 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67  pCursor){.  Prag
136f0 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
13700 73 72 3b 0a 20 20 70 43 73 72 20 3d 20 28 50 72  sr;.  pCsr = (Pr
13710 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
13720 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
13730 69 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20  izeof(*pCsr));. 
13740 20 69 66 28 20 70 43 73 72 3d 3d 30 20 29 20 72   if( pCsr==0 ) r
13750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13760 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 73  EM;.  memset(pCs
13770 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61  r, 0, sizeof(Pra
13780 67 6d 61 56 74 61 62 43 75 72 73 6f 72 29 29 3b  gmaVtabCursor));
13790 0a 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56  .  pCsr->base.pV
137a0 74 61 62 20 3d 20 70 56 74 61 62 3b 0a 20 20 2a  tab = pVtab;.  *
137b0 70 70 43 75 72 73 6f 72 20 3d 20 26 70 43 73 72  ppCursor = &pCsr
137c0 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e  ->base;.  return
137d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
137e0 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6e 74  * Clear all cont
137f0 65 6e 74 20 66 72 6f 6d 20 70 72 61 67 6d 61 20  ent from pragma 
13800 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
13810 72 73 6f 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20  rsor. */.static 
13820 76 6f 69 64 20 70 72 61 67 6d 61 56 74 61 62 43  void pragmaVtabC
13830 75 72 73 6f 72 43 6c 65 61 72 28 50 72 61 67 6d  ursorClear(Pragm
13840 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13850 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  r){.  int i;.  s
13860 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
13870 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a  pCsr->pPragma);.
13880 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20    pCsr->pPragma 
13890 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
138a0 69 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72  i<ArraySize(pCsr
138b0 2d 3e 61 7a 41 72 67 29 3b 20 69 2b 2b 29 7b 0a  ->azArg); i++){.
138c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
138d0 28 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 29  (pCsr->azArg[i])
138e0 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72  ;.    pCsr->azAr
138f0 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  g[i] = 0;.  }.}.
13900 0a 2f 2a 20 43 6c 6f 73 65 20 61 20 70 72 61 67  ./* Close a prag
13910 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
13920 20 63 75 72 73 6f 72 20 2a 2f 0a 73 74 61 74 69   cursor */.stati
13930 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
13940 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74  Close(sqlite3_vt
13950 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
13960 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13970 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13980 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 63  gmaVtabCursor*)c
13990 75 72 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62  ur;.  pragmaVtab
139a0 43 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72  CursorClear(pCsr
139b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
139c0 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72  e(pCsr);.  retur
139d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
139e0 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 70  /* Advance the p
139f0 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
13a00 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  ble cursor to th
13a10 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 73 74  e next row */.st
13a20 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
13a30 74 61 62 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  tabNext(sqlite3_
13a40 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
13a50 61 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61  abCursor){.  Pra
13a60 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
13a70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
13a80 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
13a90 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  rsor;.  int rc =
13aa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
13ab0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
13ac0 78 52 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a  xRowid value */.
13ad0 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 2b 2b    pCsr->iRowid++
13ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
13af0 2d 3e 70 50 72 61 67 6d 61 20 29 3b 0a 20 20 69  ->pPragma );.  i
13b00 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73  f( SQLITE_ROW!=s
13b10 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72  qlite3_step(pCsr
13b20 2d 3e 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20  ->pPragma) ){.  
13b30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
13b40 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50  inalize(pCsr->pP
13b50 72 61 67 6d 61 29 3b 0a 20 20 20 20 70 43 73 72  ragma);.    pCsr
13b60 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20  ->pPragma = 0;. 
13b70 20 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72     pragmaVtabCur
13b80 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a  sorClear(pCsr);.
13b90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13ba0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d  .}../* .** Pragm
13bb0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
13bc0 6d 6f 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d  module xFilter m
13bd0 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
13be0 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 46   int pragmaVtabF
13bf0 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ilter(.  sqlite3
13c00 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
13c10 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e  tabCursor, .  in
13c20 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20  t idxNum, const 
13c30 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20  char *idxStr,.  
13c40 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
13c50 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
13c60 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
13c70 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
13c80 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
13c90 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50  pVtabCursor;.  P
13ca0 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
13cb0 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28  = (PragmaVtab*)(
13cc0 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
13cd0 61 62 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ab);.  int rc;. 
13ce0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 53 74 72   int i, j;.  Str
13cf0 41 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61  Accum acc;.  cha
13d00 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20 55 4e 55 53  r *zSql;..  UNUS
13d10 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 78  ED_PARAMETER(idx
13d20 4e 75 6d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Num);.  UNUSED_P
13d30 41 52 41 4d 45 54 45 52 28 69 64 78 53 74 72 29  ARAMETER(idxStr)
13d40 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 75  ;.  pragmaVtabCu
13d50 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b  rsorClear(pCsr);
13d60 0a 20 20 6a 20 3d 20 28 70 54 61 62 2d 3e 70 4e  .  j = (pTab->pN
13d70 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  ame->mPragFlg & 
13d80 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 29  PragFlg_Result1)
13d90 21 3d 30 20 3f 20 30 20 3a 20 31 3b 0a 20 20 66  !=0 ? 0 : 1;.  f
13da0 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
13db0 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 63  i++, j++){.    c
13dc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
13dd0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
13de0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13df0 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  xt(argv[i]);.   
13e00 20 61 73 73 65 72 74 28 20 6a 3c 41 72 72 61 79   assert( j<Array
13e10 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67  Size(pCsr->azArg
13e20 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
13e30 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d   pCsr->azArg[j]=
13e40 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  =0 );.    if( zT
13e50 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 73  ext ){.      pCs
13e60 72 2d 3e 61 7a 41 72 67 5b 6a 5d 20 3d 20 73 71  r->azArg[j] = sq
13e70 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
13e80 73 22 2c 20 7a 54 65 78 74 29 3b 0a 20 20 20 20  s", zText);.    
13e90 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72    if( pCsr->azAr
13ea0 67 5b 6a 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  g[j]==0 ){.     
13eb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13ec0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
13ed0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
13ee0 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
13ef0 26 61 63 63 2c 20 30 2c 20 30 2c 20 30 2c 20 70  &acc, 0, 0, 0, p
13f00 54 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Tab->db->aLimit[
13f10 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
13f20 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 73 71 6c  _LENGTH]);.  sql
13f30 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61  ite3_str_appenda
13f40 6c 6c 28 26 61 63 63 2c 20 22 50 52 41 47 4d 41  ll(&acc, "PRAGMA
13f50 20 22 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d   ");.  if( pCsr-
13f60 3e 61 7a 41 72 67 5b 31 5d 20 29 7b 0a 20 20 20  >azArg[1] ){.   
13f70 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
13f80 65 6e 64 66 28 26 61 63 63 2c 20 22 25 51 2e 22  endf(&acc, "%Q."
13f90 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d  , pCsr->azArg[1]
13fa0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
13fb0 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26  _str_appendall(&
13fc0 61 63 63 2c 20 70 54 61 62 2d 3e 70 4e 61 6d 65  acc, pTab->pName
13fd0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
13fe0 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 20 29  pCsr->azArg[0] )
13ff0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
14000 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63 2c 20  r_appendf(&acc, 
14010 22 3d 25 51 22 2c 20 70 43 73 72 2d 3e 61 7a 41  "=%Q", pCsr->azA
14020 72 67 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53  rg[0]);.  }.  zS
14030 71 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41  ql = sqlite3StrA
14040 63 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29  ccumFinish(&acc)
14050 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
14060 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
14070 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71  NOMEM;.  rc = sq
14080 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
14090 28 70 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  (pTab->db, zSql,
140a0 20 2d 31 2c 20 26 70 43 73 72 2d 3e 70 50 72 61   -1, &pCsr->pPra
140b0 67 6d 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  gma, 0);.  sqlit
140c0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
140d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
140e0 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  OK ){.    pTab->
140f0 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73  base.zErrMsg = s
14100 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
14110 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
14120 6d 73 67 28 70 54 61 62 2d 3e 64 62 29 29 3b 0a  msg(pTab->db));.
14130 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14140 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 61 67   }.  return prag
14150 6d 61 56 74 61 62 4e 65 78 74 28 70 56 74 61 62  maVtabNext(pVtab
14160 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Cursor);.}../*.*
14170 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c  * Pragma virtual
14180 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 45   table module xE
14190 6f 66 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  of method..*/.st
141a0 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
141b0 74 61 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76  tabEof(sqlite3_v
141c0 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
141d0 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67  bCursor){.  Prag
141e0 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
141f0 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
14200 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
14210 73 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  sor;.  return (p
14220 43 73 72 2d 3e 70 50 72 61 67 6d 61 3d 3d 30 29  Csr->pPragma==0)
14230 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 78 43 6f 6c  ;.}../* The xCol
14240 75 6d 6e 20 6d 65 74 68 6f 64 20 73 69 6d 70 6c  umn method simpl
14250 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  y returns the co
14260 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75  rresponding colu
14270 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 50  mn from.** the P
14280 52 41 47 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61 74  RAGMA.  .*/.stat
14290 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
142a0 62 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74  bColumn(.  sqlit
142b0 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
142c0 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20  pVtabCursor, .  
142d0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
142e0 2a 63 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29  *ctx, .  int i.)
142f0 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
14300 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
14310 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
14320 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50  pVtabCursor;.  P
14330 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
14340 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28  = (PragmaVtab*)(
14350 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
14360 61 62 29 3b 0a 20 20 69 66 28 20 69 3c 70 54 61  ab);.  if( i<pTa
14370 62 2d 3e 69 48 69 64 64 65 6e 20 29 7b 0a 20 20  b->iHidden ){.  
14380 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
14390 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69  _value(ctx, sqli
143a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
143b0 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20  (pCsr->pPragma, 
143c0 69 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  i));.  }else{.  
143d0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
143e0 5f 74 65 78 74 28 63 74 78 2c 20 70 43 73 72 2d  _text(ctx, pCsr-
143f0 3e 61 7a 41 72 67 5b 69 2d 70 54 61 62 2d 3e 69  >azArg[i-pTab->i
14400 48 69 64 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54  Hidden],-1,SQLIT
14410 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
14420 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14430 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  E_OK;.}../* .** 
14440 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  Pragma virtual t
14450 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77  able module xRow
14460 69 64 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  id method..*/.st
14470 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
14480 74 61 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33  tabRowid(sqlite3
14490 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
144a0 74 61 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74  tabCursor, sqlit
144b0 65 5f 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 50  e_int64 *p){.  P
144c0 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20  ragmaVtabCursor 
144d0 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56  *pCsr = (PragmaV
144e0 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62  tabCursor*)pVtab
144f0 43 75 72 73 6f 72 3b 0a 20 20 2a 70 20 3d 20 70  Cursor;.  *p = p
14500 43 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72  Csr->iRowid;.  r
14510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14520 0a 7d 0a 0a 2f 2a 20 54 68 65 20 70 72 61 67 6d  .}../* The pragm
14530 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
14540 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63  object */.static
14550 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
14560 6f 64 75 6c 65 20 70 72 61 67 6d 61 56 74 61 62  odule pragmaVtab
14570 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20  Module = {.  0, 
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
145a0 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  rsion */.  0,   
145b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145c0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61          /* xCrea
145d0 74 65 20 2d 20 63 72 65 61 74 65 20 61 20 74 61  te - create a ta
145e0 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  ble */.  pragmaV
145f0 74 61 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20  tabConnect,     
14600 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63        /* xConnec
14610 74 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61  t - connect to a
14620 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
14630 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
14640 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20  BestIndex,      
14650 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78     /* xBestIndex
14660 20 2d 20 44 65 74 65 72 6d 69 6e 65 20 73 65 61   - Determine sea
14670 72 63 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a  rch strategy */.
14680 20 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63    pragmaVtabDisc
14690 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f  onnect,        /
146a0 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20  * xDisconnect - 
146b0 44 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20  Disconnect from 
146c0 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20  a table */.  0, 
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
146f0 73 74 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74  stroy - Drop a t
14700 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61  able */.  pragma
14710 56 74 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20  VtabOpen,       
14720 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
14730 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  - open a cursor 
14740 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43  */.  pragmaVtabC
14750 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
14760 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c    /* xClose - cl
14770 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  ose a cursor */.
14780 20 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74    pragmaVtabFilt
14790 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
147a0 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66  * xFilter - conf
147b0 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74  igure scan const
147c0 72 61 69 6e 74 73 20 2a 2f 0a 20 20 70 72 61 67  raints */.  prag
147d0 6d 61 56 74 61 62 4e 65 78 74 2c 20 20 20 20 20  maVtabNext,     
147e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78           /* xNex
147f0 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75  t - advance a cu
14800 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61  rsor */.  pragma
14810 56 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20  VtabEof,        
14820 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a         /* xEof *
14830 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f  /.  pragmaVtabCo
14840 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
14850 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65   /* xColumn - re
14860 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 70 72 61  ad data */.  pra
14870 67 6d 61 56 74 61 62 52 6f 77 69 64 2c 20 20 20  gmaVtabRowid,   
14880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
14890 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20  wid - read data 
148a0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77    /* xUpdate - w
148d0 72 69 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 30  rite data */.  0
148e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
148f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14900 42 65 67 69 6e 20 2d 20 62 65 67 69 6e 20 74 72  Begin - begin tr
14910 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30  ansaction */.  0
14920 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14940 53 79 6e 63 20 2d 20 73 79 6e 63 20 74 72 61 6e  Sync - sync tran
14950 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
14980 6d 6d 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72  mmit - commit tr
14990 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30  ansaction */.  0
149a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
149b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
149c0 52 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62  Rollback - rollb
149d0 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ack transaction 
149e0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69    /* xFindFuncti
14a10 6f 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76  on - function ov
14a20 65 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 30  erloading */.  0
14a30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14a50 52 65 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20  Rename - rename 
14a60 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30  the table */.  0
14a70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14a90 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30  Savepoint */.  0
14aa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14ac0 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 2c 20  Release */.  0, 
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
14af0 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 20 20 30 20  llbackTo */.  0 
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
14b20 68 61 64 6f 77 4e 61 6d 65 20 2a 2f 0a 7d 3b 0a  hadowName */.};.
14b30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
14b40 73 65 65 20 69 66 20 7a 54 61 62 4e 61 6d 65 20  see if zTabName 
14b50 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6e 61  is really the na
14b60 6d 65 20 6f 66 20 61 20 70 72 61 67 6d 61 2e 20  me of a pragma. 
14b70 20 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68   If it is,.** th
14b80 65 6e 20 72 65 67 69 73 74 65 72 20 61 6e 20 65  en register an e
14b90 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c  ponymous virtual
14ba0 20 74 61 62 6c 65 20 66 6f 72 20 74 68 61 74 20   table for that 
14bb0 70 72 61 67 6d 61 20 61 6e 64 20 72 65 74 75 72  pragma and retur
14bc0 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
14bd0 6f 20 74 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a  o the Module obj
14be0 65 63 74 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ect for the new 
14bf0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
14c00 2f 0a 4d 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65  /.Module *sqlite
14c10 33 50 72 61 67 6d 61 56 74 61 62 52 65 67 69 73  3PragmaVtabRegis
14c20 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ter(sqlite3 *db,
14c30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
14c40 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61  me){.  const Pra
14c50 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a  gmaName *pName;.
14c60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14c70 33 5f 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65  3_strnicmp(zName
14c80 2c 20 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d  , "pragma_", 7)=
14c90 3d 30 20 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20  =0 );.  pName = 
14ca0 70 72 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61  pragmaLocate(zNa
14cb0 6d 65 2b 37 29 3b 0a 20 20 69 66 28 20 70 4e 61  me+7);.  if( pNa
14cc0 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
14cd0 3b 0a 20 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e  ;.  if( (pName->
14ce0 6d 50 72 61 67 46 6c 67 20 26 20 28 50 72 61 67  mPragFlg & (Prag
14cf0 46 6c 67 5f 52 65 73 75 6c 74 30 7c 50 72 61 67  Flg_Result0|Prag
14d00 46 6c 67 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30  Flg_Result1))==0
14d10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
14d20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 48 61  ssert( sqlite3Ha
14d30 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64  shFind(&db->aMod
14d40 75 6c 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ule, zName)==0 )
14d50 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
14d60 65 33 56 74 61 62 43 72 65 61 74 65 4d 6f 64 75  e3VtabCreateModu
14d70 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70  le(db, zName, &p
14d80 72 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c  ragmaVtabModule,
14d90 20 28 76 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30   (void*)pName, 0
14da0 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
14db0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
14dc0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e  UALTABLE */..#en
14dd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14de0 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a           IT_PRAGMA */.