/ Hex Artifact Content
Login

Artifact 2e9fbfcb23cb72eabb38ab6fa84c36a65f9c4839ce1e9bb3dd982ab26b67a5a8:


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 73  Data(j);.      s
9e30: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
9e40: 6f 61 64 28 76 2c 20 31 2c 20 22 73 22 2c 20 70  oad(v, 1, "s", p
9e50: 4d 6f 64 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Mod->zName);.   
9e60: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9e70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9e80: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
9e90: 4c 45 20 2a 2f 0a 0a 20 20 63 61 73 65 20 50 72  LE */..  case Pr
9ea0: 61 67 54 79 70 5f 50 52 41 47 4d 41 5f 4c 49 53  agTyp_PRAGMA_LIS
9eb0: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  T: {.    int i;.
9ec0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
9ed0: 72 72 61 79 53 69 7a 65 28 61 50 72 61 67 6d 61  rraySize(aPragma
9ee0: 4e 61 6d 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Name); i++){.   
9ef0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9f00: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
9f10: 22 2c 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 69  ", aPragmaName[i
9f20: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
9f30: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
9f40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e  dif /* SQLITE_IN
9f50: 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41 47  TROSPECTION_PRAG
9f60: 4d 41 53 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  MAS */..#endif /
9f70: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  * SQLITE_OMIT_SC
9f80: 48 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  HEMA_PRAGMAS */.
9f90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9fa0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
9fb0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9fc0: 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49 53 54  FOREIGN_KEY_LIST
9fd0: 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a  : if( zRight ){.
9fe0: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20      FKey *pFK;. 
9ff0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
a000: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
a010: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
a020: 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20  zRight, zDb);.  
a030: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
a040: 20 20 20 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e      pFK = pTab->
a050: 70 46 4b 65 79 3b 0a 20 20 20 20 20 20 69 66 28  pFKey;.      if(
a060: 20 70 46 4b 20 29 7b 0a 20 20 20 20 20 20 20 20   pFK ){.        
a070: 69 6e 74 20 69 54 61 62 44 62 20 3d 20 73 71 6c  int iTabDb = sql
a080: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
a090: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
a0a0: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  ema);.        in
a0b0: 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  t i = 0; .      
a0c0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
a0d0: 20 38 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   8;.        sqli
a0e0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
a0f0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61 62  ema(pParse, iTab
a100: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  Db);.        whi
a110: 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20 20 20 20  le(pFK){.       
a120: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
a130: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
a140: 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  FK->nCol; j++){.
a150: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a160: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
a170: 28 76 2c 20 31 2c 20 22 69 69 73 73 73 73 73 73  (v, 1, "iissssss
a180: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
a190: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 0a 20              j,. 
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20    pFK->zTo,.    
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
a1e0: 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61  Tab->aCol[pFK->a
a1f0: 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e  Col[j].iFrom].zN
a200: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
a210: 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 61 43 6f          pFK->aCo
a220: 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20  l[j].zCol,.     
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
a240: 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41  tionName(pFK->aA
a250: 63 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f  ction[1]),  /* O
a260: 4e 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20 20  N UPDATE */.    
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
a280: 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61  ctionName(pFK->a
a290: 41 63 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20  Action[0]),  /* 
a2a0: 4f 4e 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20  ON DELETE */.   
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 22 4e 4f 4e 45 22 29 3b 0a 20 20 20 20 20 20 20  "NONE");.       
a2d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2b     }.          +
a2e0: 2b 69 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46  +i;.          pF
a2f0: 4b 20 3d 20 70 46 4b 2d 3e 70 4e 65 78 74 46 72  K = pFK->pNextFr
a300: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  om;.        }.  
a310: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a320: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
a330: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
a340: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
a350: 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  KEY) */..#ifndef
a360: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
a370: 45 49 47 4e 5f 4b 45 59 0a 23 69 66 6e 64 65 66  EIGN_KEY.#ifndef
a380: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
a390: 47 47 45 52 0a 20 20 63 61 73 65 20 50 72 61 67  GGER.  case Prag
a3a0: 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f  Typ_FOREIGN_KEY_
a3b0: 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20 46 4b 65  CHECK: {.    FKe
a3c0: 79 20 2a 70 46 4b 3b 20 20 20 20 20 20 20 20 20  y *pFK;         
a3d0: 20 20 20 20 2f 2a 20 41 20 66 6f 72 65 69 67 6e      /* A foreign
a3e0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
a3f0: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
a400: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab;           /*
a410: 20 43 68 69 6c 64 20 74 61 62 6c 65 20 63 6f 6e   Child table con
a420: 74 61 69 6e 20 22 52 45 46 45 52 45 4e 43 45 53  tain "REFERENCES
a430: 22 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 20  " keyword */.   
a440: 20 54 61 62 6c 65 20 2a 70 50 61 72 65 6e 74 3b   Table *pParent;
a450: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e          /* Paren
a460: 74 20 74 61 62 6c 65 20 74 68 61 74 20 63 68 69  t table that chi
a470: 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a  ld points to */.
a480: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
a490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a4a0: 64 65 78 20 69 6e 20 74 68 65 20 70 61 72 65 6e  dex in the paren
a4b0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  t table */.    i
a4c0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
a4d0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a4e0: 75 6e 74 65 72 3a 20 20 46 6f 72 65 69 67 6e 20  unter:  Foreign 
a4f0: 6b 65 79 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  key number for p
a500: 54 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  Tab */.    int j
a510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a520: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a530: 72 3a 20 20 46 69 65 6c 64 20 6f 66 20 74 68 65  r:  Field of the
a540: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 2a 2f 0a   foreign key */.
a550: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b      HashElem *k;
a560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a570: 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 4e 65 78  op counter:  Nex
a580: 74 20 74 61 62 6c 65 20 69 6e 20 73 63 68 65 6d  t table in schem
a590: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 78 3b 20  a */.    int x; 
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 2f 2a 20 72 65 73 75 6c 74 20 76 61 72 69 61 62  /* result variab
a5c0: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  le */.    int re
a5d0: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
a5e0: 20 2f 2a 20 33 20 72 65 67 69 73 74 65 72 73 20   /* 3 registers 
a5f0: 74 6f 20 68 6f 6c 64 20 61 20 72 65 73 75 6c 74  to hold a result
a600: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
a610: 72 65 67 4b 65 79 3b 20 20 20 20 20 20 20 20 20  regKey;         
a620: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
a630: 6f 20 68 6f 6c 64 20 6b 65 79 20 66 6f 72 20 63  o hold key for c
a640: 68 65 63 6b 69 6e 67 20 74 68 65 20 46 4b 20 2a  hecking the FK *
a650: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
a660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a670: 52 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  Registers to hol
a680: 64 20 61 20 72 6f 77 20 66 72 6f 6d 20 70 54 61  d a row from pTa
a690: 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  b */.    int add
a6a0: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
a6b0: 2f 2a 20 54 6f 70 20 6f 66 20 61 20 6c 6f 6f 70  /* Top of a loop
a6c0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 65 69 67   checking foreig
a6d0: 6e 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20 69 6e  n keys */.    in
a6e0: 74 20 61 64 64 72 4f 6b 3b 20 20 20 20 20 20 20  t addrOk;       
a6f0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
a700: 65 20 69 66 20 74 68 65 20 6b 65 79 20 69 73 20  e if the key is 
a710: 4f 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61  OK */.    int *a
a720: 69 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  iCols;          
a730: 20 2f 2a 20 63 68 69 6c 64 20 74 6f 20 70 61 72   /* child to par
a740: 65 6e 74 20 63 6f 6c 75 6d 6e 20 6d 61 70 70 69  ent column mappi
a750: 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52 65  ng */..    regRe
a760: 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
a770: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
a780: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20  e->nMem += 4;.  
a790: 20 20 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50 61    regKey = ++pPa
a7a0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
a7b0: 65 67 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  egRow = ++pParse
a7c0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 6b 20 3d 20  ->nMem;.    k = 
a7d0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
a7e0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
a7f0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
a800: 0a 20 20 20 20 77 68 69 6c 65 28 20 6b 20 29 7b  .    while( k ){
a810: 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 44  .      int iTabD
a820: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  b;.      if( zRi
a830: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ght ){.        p
a840: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
a850: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
a860: 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29   0, zRight, zDb)
a870: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b  ;.        k = 0;
a880: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a890: 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
a8a0: 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
a8b0: 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 20 20  ata(k);.        
a8c0: 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65  k = sqliteHashNe
a8d0: 78 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xt(k);.      }. 
a8e0: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
a8f0: 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79 3d   || pTab->pFKey=
a900: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
a910: 20 20 20 20 20 69 54 61 62 44 62 20 3d 20 73 71       iTabDb = sq
a920: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
a930: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
a940: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
a950: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
a960: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61  hema(pParse, iTa
a970: 62 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bDb);.      sqli
a980: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
a990: 72 73 65 2c 20 69 54 61 62 44 62 2c 20 70 54 61  rse, iTabDb, pTa
a9a0: 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
a9b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
a9c0: 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 72  if( pTab->nCol+r
a9d0: 65 67 52 6f 77 3e 70 50 61 72 73 65 2d 3e 6e 4d  egRow>pParse->nM
a9e0: 65 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em ) pParse->nMe
a9f0: 6d 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b  m = pTab->nCol +
aa00: 20 72 65 67 52 6f 77 3b 0a 20 20 20 20 20 20 73   regRow;.      s
aa10: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
aa20: 70 50 61 72 73 65 2c 20 30 2c 20 69 54 61 62 44  pParse, 0, iTabD
aa30: 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
aa40: 52 65 61 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  Read);.      sql
aa50: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
aa60: 6e 67 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2c  ng(v, regResult,
aa70: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
aa80: 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46       for(i=1, pF
aa90: 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70  K=pTab->pFKey; p
aaa0: 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b  FK; i++, pFK=pFK
aab0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
aac0: 20 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20        pParent = 
aad0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
aae0: 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a  (db, pFK->zTo, z
aaf0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Db);.        if(
ab00: 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 63 6f   pParent==0 ) co
ab10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
ab20: 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  pIdx = 0;.      
ab30: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
ab40: 63 6b 28 70 50 61 72 73 65 2c 20 69 54 61 62 44  ck(pParse, iTabD
ab50: 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e 75 6d  b, pParent->tnum
ab60: 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e 7a 4e  , 0, pParent->zN
ab70: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 78 20  ame);.        x 
ab80: 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74  = sqlite3FkLocat
ab90: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
aba0: 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49  Parent, pFK, &pI
abb0: 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  dx, 0);.        
abc0: 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20  if( x==0 ){.    
abd0: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d        if( pIdx==
abe0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
abf0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
ac00: 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 54 61  e(pParse, i, iTa
ac10: 62 44 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50  bDb, pParent, OP
ac20: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
ac30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ac40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ac50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
ac60: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20 70 49  _OpenRead, i, pI
ac70: 64 78 2d 3e 74 6e 75 6d 2c 20 69 54 61 62 44 62  dx->tnum, iTabDb
ac80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
ac90: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
aca0: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
acb0: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
acc0: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
acd0: 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30  .          k = 0
ace0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
acf0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
ad00: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
ad10: 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  t( pParse->nErr>
ad20: 30 20 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b 0a 20  0 || pFK==0 );. 
ad30: 20 20 20 20 20 69 66 28 20 70 46 4b 20 29 20 62       if( pFK ) b
ad40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
ad50: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3c 69 20 29  pParse->nTab<i )
ad60: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
ad70: 69 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  i;.      addrTop
ad80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ad90: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
ada0: 64 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  d, 0); VdbeCover
adb0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  age(v);.      fo
adc0: 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d  r(i=1, pFK=pTab-
add0: 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b  >pFKey; pFK; i++
ade0: 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74  , pFK=pFK->pNext
adf0: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70  From){.        p
ae00: 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  Parent = sqlite3
ae10: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46  FindTable(db, pF
ae20: 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20  K->zTo, zDb);.  
ae30: 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a        pIdx = 0;.
ae40: 20 20 20 20 20 20 20 20 61 69 43 6f 6c 73 20 3d          aiCols =
ae50: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
ae60: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20  pParent ){.     
ae70: 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
ae80: 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50  FkLocateIndex(pP
ae90: 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  arse, pParent, p
aea0: 46 4b 2c 20 26 70 49 64 78 2c 20 26 61 69 43 6f  FK, &pIdx, &aiCo
aeb0: 6c 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ls);.          a
aec0: 73 73 65 72 74 28 20 78 3d 3d 30 20 29 3b 0a 20  ssert( x==0 );. 
aed0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
aee0: 20 61 64 64 72 4f 6b 20 3d 20 73 71 6c 69 74 65   addrOk = sqlite
aef0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
af00: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 20  Parse);..       
af10: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
af20: 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 63 68  e to read the ch
af30: 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 73 20 69  ild key values i
af40: 6e 74 6f 20 72 65 67 69 73 74 65 72 73 0a 20 20  nto registers.  
af50: 20 20 20 20 20 20 2a 2a 20 72 65 67 52 6f 77 2e        ** regRow.
af60: 2e 72 65 67 52 6f 77 2b 6e 2e 20 49 66 20 61 6e  .regRow+n. If an
af70: 79 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b  y of the child k
af80: 65 79 20 76 61 6c 75 65 73 20 61 72 65 20 4e 55  ey values are NU
af90: 4c 4c 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20  LL, this .      
afa0: 20 20 2a 2a 20 72 6f 77 20 63 61 6e 6e 6f 74 20    ** row cannot 
afb0: 63 61 75 73 65 20 61 6e 20 46 4b 20 76 69 6f 6c  cause an FK viol
afc0: 61 74 69 6f 6e 2e 20 4a 75 6d 70 20 64 69 72 65  ation. Jump dire
afd0: 63 74 6c 79 20 74 6f 20 61 64 64 72 4f 6b 20 69  ctly to addrOk i
afe0: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  n .        ** th
aff0: 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  is case. */.    
b000: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
b010: 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  FK->nCol; j++){.
b020: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
b030: 6f 6c 20 3d 20 61 69 43 6f 6c 73 20 3f 20 61 69  ol = aiCols ? ai
b040: 43 6f 6c 73 5b 6a 5d 20 3a 20 70 46 4b 2d 3e 61  Cols[j] : pFK->a
b050: 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 3b 0a 20 20  Col[j].iFrom;.  
b060: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b070: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
b080: 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
b090: 20 30 2c 20 69 43 6f 6c 2c 20 72 65 67 52 6f 77   0, iCol, regRow
b0a0: 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  +j);.          s
b0b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b0c0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
b0d0: 65 67 52 6f 77 2b 6a 2c 20 61 64 64 72 4f 6b 29  egRow+j, addrOk)
b0e0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b0f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
b100: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
b110: 65 20 63 6f 64 65 20 74 6f 20 71 75 65 72 79 20  e code to query 
b120: 74 68 65 20 70 61 72 65 6e 74 20 69 6e 64 65 78  the parent index
b130: 20 66 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20   for a matching 
b140: 70 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  parent.        *
b150: 2a 20 6b 65 79 2e 20 49 66 20 61 20 6d 61 74 63  * key. If a matc
b160: 68 20 69 73 20 66 6f 75 6e 64 2c 20 6a 75 6d 70  h is found, jump
b170: 20 74 6f 20 61 64 64 72 4f 6b 2e 20 2a 2f 0a 20   to addrOk. */. 
b180: 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20         if( pIdx 
b190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
b1a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
b1b0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b1c0: 20 72 65 67 52 6f 77 2c 20 70 46 4b 2d 3e 6e 43   regRow, pFK->nC
b1d0: 6f 6c 2c 20 72 65 67 4b 65 79 2c 0a 20 20 20 20  ol, regKey,.    
b1e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b1f0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
b200: 72 28 64 62 2c 70 49 64 78 29 2c 20 70 46 4b 2d  r(db,pIdx), pFK-
b210: 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  >nCol);.        
b220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b230: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
b240: 6e 64 2c 20 69 2c 20 61 64 64 72 4f 6b 2c 20 72  nd, i, addrOk, r
b250: 65 67 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  egKey, 0);.     
b260: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
b270: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  e(v);.        }e
b280: 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 20  lse if( pParent 
b290: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
b2a0: 20 6a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64   jmp = sqlite3Vd
b2b0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
b2c0: 2b 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +2;.          sq
b2d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b2e0: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
b2f0: 20 69 2c 20 6a 6d 70 2c 20 72 65 67 52 6f 77 29   i, jmp, regRow)
b300: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
b320: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
b330: 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20  addrOk);.       
b340: 20 20 20 61 73 73 65 72 74 28 20 70 46 4b 2d 3e     assert( pFK->
b350: 6e 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nCol==1 );.     
b360: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
b370: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b380: 6f 20 72 65 70 6f 72 74 20 61 6e 20 46 4b 20 76  o report an FK v
b390: 69 6f 6c 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  iolation to the 
b3a0: 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20  caller. */.     
b3b0: 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
b3c0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
b3d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b3e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
b3f0: 2c 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31  , 0, regResult+1
b400: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b410: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
b420: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b430: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
b440: 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20  Result+1);.     
b450: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
b460: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
b470: 64 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2b 32  d(v, regResult+2
b480: 2c 20 22 73 69 58 22 2c 20 70 46 4b 2d 3e 7a 54  , "siX", pFK->zT
b490: 6f 2c 20 69 2d 31 29 3b 0a 20 20 20 20 20 20 20  o, i-1);.       
b4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b4b0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
b4c0: 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 34  ow, regResult, 4
b4d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b4e0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
b4f0: 65 6c 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20  el(v, addrOk);. 
b500: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
b510: 46 72 65 65 28 64 62 2c 20 61 69 43 6f 6c 73 29  Free(db, aiCols)
b520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b530: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b540: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c  2(v, OP_Next, 0,
b550: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
b560: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b580: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
b590: 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  op);.    }.  }. 
b5a0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
b5b0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
b5c0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
b5d0: 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  */.#endif /* !de
b5e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b5f0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
b600: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
b610: 45 5f 4f 4d 49 54 5f 43 41 53 45 5f 53 45 4e 53  E_OMIT_CASE_SENS
b620: 49 54 49 56 45 5f 4c 49 4b 45 5f 50 52 41 47 4d  ITIVE_LIKE_PRAGM
b630: 41 0a 20 20 2f 2a 20 52 65 69 6e 73 74 61 6c 6c  A.  /* Reinstall
b640: 20 74 68 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c   the LIKE and GL
b650: 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  OB functions.  T
b660: 68 65 20 76 61 72 69 61 6e 74 20 6f 66 20 4c 49  he variant of LI
b670: 4b 45 0a 20 20 2a 2a 20 75 73 65 64 20 77 69 6c  KE.  ** used wil
b680: 6c 20 62 65 20 63 61 73 65 20 73 65 6e 73 69 74  l be case sensit
b690: 69 76 65 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e  ive or not depen
b6a0: 64 69 6e 67 20 6f 6e 20 74 68 65 20 52 48 53 2e  ding on the RHS.
b6b0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
b6c0: 67 54 79 70 5f 43 41 53 45 5f 53 45 4e 53 49 54  gTyp_CASE_SENSIT
b6d0: 49 56 45 5f 4c 49 4b 45 3a 20 7b 0a 20 20 20 20  IVE_LIKE: {.    
b6e0: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
b6f0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
b700: 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73  terLikeFunctions
b710: 28 64 62 2c 20 73 71 6c 69 74 65 33 47 65 74 42  (db, sqlite3GetB
b720: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
b730: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
b740: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
b750: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
b760: 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45  E_SENSITIVE_LIKE
b770: 5f 50 52 41 47 4d 41 20 2a 2f 0a 0a 23 69 66 6e  _PRAGMA */..#ifn
b780: 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  def SQLITE_INTEG
b790: 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52  RITY_CHECK_ERROR
b7a0: 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65 20 53 51  _MAX.# define SQ
b7b0: 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43  LITE_INTEGRITY_C
b7c0: 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 20 31  HECK_ERROR_MAX 1
b7d0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
b7e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
b7f0: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 20  NTEGRITY_CHECK. 
b800: 20 2f 2a 20 20 20 20 50 52 41 47 4d 41 20 69 6e   /*    PRAGMA in
b810: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 20 20  tegrity_check.  
b820: 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  **    PRAGMA int
b830: 65 67 72 69 74 79 5f 63 68 65 63 6b 28 4e 29 0a  egrity_check(N).
b840: 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71    **    PRAGMA q
b850: 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20 2a 2a 20  uick_check.  ** 
b860: 20 20 20 50 52 41 47 4d 41 20 71 75 69 63 6b 5f     PRAGMA quick_
b870: 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a 0a 20 20  check(N).  **.  
b880: 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20 69 6e  ** Verify the in
b890: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 64  tegrity of the d
b8a0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
b8b0: 2a 2a 20 54 68 65 20 22 71 75 69 63 6b 5f 63 68  ** The "quick_ch
b8c0: 65 63 6b 22 20 69 73 20 72 65 64 75 63 65 64 20  eck" is reduced 
b8d0: 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a  version of .  **
b8e0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
b8f0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 64 65 74   designed to det
b900: 65 63 74 20 6d 6f 73 74 20 64 61 74 61 62 61 73  ect most databas
b910: 65 20 63 6f 72 72 75 70 74 69 6f 6e 0a 20 20 2a  e corruption.  *
b920: 2a 20 77 69 74 68 6f 75 74 20 74 68 65 20 6f 76  * without the ov
b930: 65 72 68 65 61 64 20 6f 66 20 63 72 6f 73 73 2d  erhead of cross-
b940: 63 68 65 63 6b 69 6e 67 20 69 6e 64 65 78 65 73  checking indexes
b950: 2e 20 20 51 75 69 63 6b 5f 63 68 65 63 6b 0a 20  .  Quick_check. 
b960: 20 2a 2a 20 69 73 20 6c 69 6e 65 61 72 20 74 69   ** is linear ti
b970: 6d 65 20 77 68 65 72 65 61 73 65 20 69 6e 74 65  me wherease inte
b980: 67 72 69 74 79 5f 63 68 65 63 6b 20 69 73 20 4f  grity_check is O
b990: 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a 2f 0a 20 20  (NlogN)..  */.  
b9a0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 54  case PragTyp_INT
b9b0: 45 47 52 49 54 59 5f 43 48 45 43 4b 3a 20 7b 0a  EGRITY_CHECK: {.
b9c0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 61 64      int i, j, ad
b9d0: 64 72 2c 20 6d 78 45 72 72 3b 0a 0a 20 20 20 20  dr, mxErr;..    
b9e0: 69 6e 74 20 69 73 51 75 69 63 6b 20 3d 20 28 73  int isQuick = (s
b9f0: 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a 4c  qlite3Tolower(zL
ba00: 65 66 74 5b 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a  eft[0])=='q');..
ba10: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52      /* If the PR
ba20: 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 77 61 73  AGMA command was
ba30: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 50 52   of the form "PR
ba40: 41 47 4d 41 20 3c 64 62 3e 2e 69 6e 74 65 67 72  AGMA <db>.integr
ba50: 69 74 79 5f 63 68 65 63 6b 22 2c 0a 20 20 20 20  ity_check",.    
ba60: 2a 2a 20 74 68 65 6e 20 69 44 62 20 69 73 20 73  ** then iDb is s
ba70: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
ba80: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
ba90: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 3c 64  identified by <d
baa0: 62 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  b>..    ** In th
bab0: 69 73 20 63 61 73 65 2c 20 74 68 65 20 69 6e 74  is case, the int
bac0: 65 67 72 69 74 79 20 6f 66 20 64 61 74 61 62 61  egrity of databa
bad0: 73 65 20 69 44 62 20 6f 6e 6c 79 20 69 73 20 76  se iDb only is v
bae0: 65 72 69 66 69 65 64 20 62 79 0a 20 20 20 20 2a  erified by.    *
baf0: 2a 20 74 68 65 20 56 44 42 45 20 63 72 65 61 74  * the VDBE creat
bb00: 65 64 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  ed below..    **
bb10: 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
bb20: 65 2c 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e  e, if the comman
bb30: 64 20 77 61 73 20 73 69 6d 70 6c 79 20 22 50 52  d was simply "PR
bb40: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
bb50: 68 65 63 6b 22 20 28 6f 72 0a 20 20 20 20 2a 2a  heck" (or.    **
bb60: 20 22 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63   "PRAGMA quick_c
bb70: 68 65 63 6b 22 29 2c 20 74 68 65 6e 20 69 44 62  heck"), then iDb
bb80: 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 49 6e   is set to 0. In
bb90: 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20   this case, set 
bba0: 69 44 62 0a 20 20 20 20 2a 2a 20 74 6f 20 2d 31  iDb.    ** to -1
bbb0: 20 68 65 72 65 2c 20 74 6f 20 69 6e 64 69 63 61   here, to indica
bbc0: 74 65 20 74 68 61 74 20 74 68 65 20 56 44 42 45  te that the VDBE
bbd0: 20 73 68 6f 75 6c 64 20 76 65 72 69 66 79 20 74   should verify t
bbe0: 68 65 20 69 6e 74 65 67 72 69 74 79 0a 20 20 20  he integrity.   
bbf0: 20 2a 2a 20 6f 66 20 61 6c 6c 20 61 74 74 61 63   ** of all attac
bc00: 68 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  hed databases.  
bc10: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
bc20: 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  Db>=0 );.    ass
bc30: 65 72 74 28 20 69 44 62 3d 3d 30 20 7c 7c 20 70  ert( iDb==0 || p
bc40: 49 64 32 2d 3e 7a 20 29 3b 0a 20 20 20 20 69 66  Id2->z );.    if
bc50: 28 20 70 49 64 32 2d 3e 7a 3d 3d 30 20 29 20 69  ( pId2->z==0 ) i
bc60: 44 62 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a  Db = -1;..    /*
bc70: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
bc80: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 2a 2f 0a  VDBE program */.
bc90: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
bca0: 20 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   = 6;..    /* Se
bcb0: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 65 72  t the maximum er
bcc0: 72 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  ror count */.   
bcd0: 20 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f   mxErr = SQLITE_
bce0: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f  INTEGRITY_CHECK_
bcf0: 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 69  ERROR_MAX;.    i
bd00: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
bd10: 20 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74     sqlite3GetInt
bd20: 33 32 28 7a 52 69 67 68 74 2c 20 26 6d 78 45 72  32(zRight, &mxEr
bd30: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  r);.      if( mx
bd40: 45 72 72 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  Err<=0 ){.      
bd50: 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45    mxErr = SQLITE
bd60: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
bd70: 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20  _ERROR_MAX;.    
bd80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
bd90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bda0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d  v, OP_Integer, m
bdb0: 78 45 72 72 2d 31 2c 20 31 29 3b 20 2f 2a 20 72  xErr-1, 1); /* r
bdc0: 65 67 5b 31 5d 20 68 6f 6c 64 73 20 65 72 72 6f  eg[1] holds erro
bdd0: 72 73 20 6c 65 66 74 20 2a 2f 0a 0a 20 20 20 20  rs left */..    
bde0: 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69  /* Do an integri
bdf0: 74 79 20 63 68 65 63 6b 20 6f 6e 20 65 61 63 68  ty check on each
be00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
be10: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
be20: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
be30: 20 20 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a        HashElem *
be40: 78 3b 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f  x;     /* For lo
be50: 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over 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 48 61 73 68 20 2a 70  */.      Hash *p
be80: 54 62 6c 73 3b 20 20 20 20 20 2f 2a 20 53 65 74  Tbls;     /* Set
be90: 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   of all tables i
bea0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  n the schema */.
beb0: 20 20 20 20 20 20 69 6e 74 20 2a 61 52 6f 6f 74        int *aRoot
bec0: 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  ;      /* Array 
bed0: 6f 66 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  of root page num
bee0: 62 65 72 73 20 6f 66 20 61 6c 6c 20 62 74 72 65  bers of all btre
bef0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
bf00: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  cnt = 0;     /* 
bf10: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
bf20: 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a  s in aRoot[] */.
bf30: 20 20 20 20 20 20 69 6e 74 20 6d 78 49 64 78 20        int mxIdx 
bf40: 3d 20 30 3b 20 20 20 2f 2a 20 4d 61 78 69 6d 75  = 0;   /* Maximu
bf50: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  m number of inde
bf60: 78 65 73 20 66 6f 72 20 61 6e 79 20 74 61 62 6c  xes for any tabl
bf70: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  e */..      if( 
bf80: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
bf90: 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==1 ) continue;.
bfa0: 20 20 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30        if( iDb>=0
bfb0: 20 26 26 20 69 21 3d 69 44 62 20 29 20 63 6f 6e   && i!=iDb ) con
bfc0: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73 71  tinue;..      sq
bfd0: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
bfe0: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29  chema(pParse, i)
bff0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61  ;..      /* Do a
c000: 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  n integrity chec
c010: 6b 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a  k of the B-Tree.
c020: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
c030: 2a 20 42 65 67 69 6e 20 62 79 20 66 69 6e 64 69  * Begin by findi
c040: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
c050: 73 20 6e 75 6d 62 65 72 73 0a 20 20 20 20 20 20  s numbers.      
c060: 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ** for all table
c070: 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 69 6e  s and indices in
c080: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
c090: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
c0a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
c0b0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
c0c0: 20 69 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20   i, 0) );.      
c0d0: 70 54 62 6c 73 20 3d 20 26 64 62 2d 3e 61 44 62  pTbls = &db->aDb
c0e0: 5b 69 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [i].pSchema->tbl
c0f0: 48 61 73 68 3b 0a 20 20 20 20 20 20 66 6f 72 28  Hash;.      for(
c100: 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48  cnt=0, x=sqliteH
c110: 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b  ashFirst(pTbls);
c120: 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68   x; x=sqliteHash
c130: 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20  Next(x)){.      
c140: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c150: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78  sqliteHashData(x
c160: 29 3b 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74  );  /* Current t
c170: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
c180: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
c1b0: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 20   pTab */.       
c1c0: 20 69 6e 74 20 6e 49 64 78 3b 20 20 20 20 20 20   int nIdx;      
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c1f0: 69 6e 64 65 78 65 73 20 6f 6e 20 70 54 61 62 20  indexes on pTab 
c200: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 48  */.        if( H
c210: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
c220: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66  cnt++;.        f
c230: 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49 64 78 3d  or(nIdx=0, pIdx=
c240: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
c250: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
c260: 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29 7b 20 63  Next, nIdx++){ c
c270: 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20  nt++; }.        
c280: 69 66 28 20 6e 49 64 78 3e 6d 78 49 64 78 20 29  if( nIdx>mxIdx )
c290: 20 6d 78 49 64 78 20 3d 20 6e 49 64 78 3b 0a 20   mxIdx = nIdx;. 
c2a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 52 6f       }.      aRo
c2b0: 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ot = sqlite3DbMa
c2c0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c2d0: 7a 65 6f 66 28 69 6e 74 29 2a 28 63 6e 74 2b 31  zeof(int)*(cnt+1
c2e0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 52  ));.      if( aR
c2f0: 6f 6f 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  oot==0 ) break;.
c300: 20 20 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c        for(cnt=0,
c310: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72   x=sqliteHashFir
c320: 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d  st(pTbls); x; x=
c330: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78  sqliteHashNext(x
c340: 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  )){.        Tabl
c350: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
c360: 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20  HashData(x);.   
c370: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
c380: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61  ;.        if( Ha
c390: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 61  sRowid(pTab) ) a
c3a0: 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20 3d 20 70 54  Root[++cnt] = pT
c3b0: 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  ab->tnum;.      
c3c0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
c3d0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
c3e0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
c3f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 52 6f 6f  {.          aRoo
c400: 74 5b 2b 2b 63 6e 74 5d 20 3d 20 70 49 64 78 2d  t[++cnt] = pIdx-
c410: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 7d  >tnum;.        }
c420: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
c430: 52 6f 6f 74 5b 30 5d 20 3d 20 63 6e 74 3b 0a 0a  Root[0] = cnt;..
c440: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
c450: 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 6e 75  re sufficient nu
c460: 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
c470: 73 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  s have been allo
c480: 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 70  cated */.      p
c490: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41  Parse->nMem = MA
c4a0: 58 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c  X( pParse->nMem,
c4b0: 20 38 2b 6d 78 49 64 78 20 29 3b 0a 20 20 20 20   8+mxIdx );.    
c4c0: 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
c4d0: 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
c4e0: 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f  e);..      /* Do
c4f0: 20 74 68 65 20 62 2d 74 72 65 65 20 69 6e 74 65   the b-tree inte
c500: 67 72 69 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a  grity checks */.
c510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c520: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e  eAddOp4(v, OP_In
c530: 74 65 67 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e  tegrityCk, 2, cn
c540: 74 2c 20 31 2c 20 28 63 68 61 72 2a 29 61 52 6f  t, 1, (char*)aRo
c550: 6f 74 2c 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  ot,P4_INTARRAY);
c560: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c570: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
c580: 38 29 69 29 3b 0a 20 20 20 20 20 20 61 64 64 72  8)i);.      addr
c590: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c5a0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
c5b0: 6c 2c 20 32 29 3b 20 56 64 62 65 43 6f 76 65 72  l, 2); VdbeCover
c5c0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
c5d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
c5e0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
c5f0: 2c 20 33 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 3, 0,.        
c600: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
c610: 64 62 2c 20 22 2a 2a 2a 20 69 6e 20 64 61 74 61  db, "*** in data
c620: 62 61 73 65 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20  base %s ***\n", 
c630: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
c640: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 50  ame),.         P
c650: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
c660: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c670: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
c680: 2c 20 32 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20  , 2, 3, 3);.    
c690: 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b    integrityCheck
c6a0: 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20  ResultRow(v);.  
c6b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c6c0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
c6d0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  ;..      /* Make
c6e0: 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 69 6e   sure all the in
c6f0: 64 69 63 65 73 20 61 72 65 20 63 6f 6e 73 74 72  dices are constr
c700: 75 63 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  ucted correctly.
c710: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c720: 66 6f 72 28 78 3d 73 71 6c 69 74 65 48 61 73 68  for(x=sqliteHash
c730: 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b  First(pTbls); x;
c740: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   x=sqliteHashNex
c750: 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(x)){.        T
c760: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
c770: 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a  iteHashData(x);.
c780: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
c790: 49 64 78 2c 20 2a 70 50 6b 3b 0a 20 20 20 20 20  Idx, *pPk;.     
c7a0: 20 20 20 49 6e 64 65 78 20 2a 70 50 72 69 6f 72     Index *pPrior
c7b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
c7c0: 74 20 6c 6f 6f 70 54 6f 70 3b 0a 20 20 20 20 20  t loopTop;.     
c7d0: 20 20 20 69 6e 74 20 69 44 61 74 61 43 75 72 2c     int iDataCur,
c7e0: 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
c7f0: 20 20 69 6e 74 20 72 31 20 3d 20 2d 31 3b 0a 0a    int r1 = -1;..
c800: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
c810: 2d 3e 74 6e 75 6d 3c 31 20 29 20 63 6f 6e 74 69  ->tnum<1 ) conti
c820: 6e 75 65 3b 20 20 2f 2a 20 53 6b 69 70 20 56 49  nue;  /* Skip VI
c830: 45 57 73 20 6f 72 20 56 49 52 54 55 41 4c 20 54  EWs or VIRTUAL T
c840: 41 42 4c 45 73 20 2a 2f 0a 20 20 20 20 20 20 20  ABLEs */.       
c850: 20 70 50 6b 20 3d 20 48 61 73 52 6f 77 69 64 28   pPk = HasRowid(
c860: 70 54 61 62 29 20 3f 20 30 20 3a 20 73 71 6c 69  pTab) ? 0 : sqli
c870: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
c880: 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
c890: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
c8a0: 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 70 50 61  leAndIndices(pPa
c8b0: 72 73 65 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  rse, pTab, OP_Op
c8c0: 65 6e 52 65 61 64 2c 20 30 2c 0a 20 20 20 20 20  enRead, 0,.     
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
c8f0: 20 30 2c 20 26 69 44 61 74 61 43 75 72 2c 20 26   0, &iDataCur, &
c900: 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
c910: 20 20 2f 2a 20 72 65 67 5b 37 5d 20 63 6f 75 6e    /* reg[7] coun
c920: 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ts the number of
c930: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
c940: 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a  table..        *
c950: 2a 20 72 65 67 5b 38 2b 69 5d 20 63 6f 75 6e 74  * reg[8+i] count
c960: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c970: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 69  entries in the i
c980: 2d 74 68 20 69 6e 64 65 78 20 0a 20 20 20 20 20  -th index .     
c990: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
c9a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c9b0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
c9c0: 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  , 7);.        fo
c9d0: 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  r(j=0, pIdx=pTab
c9e0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
c9f0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
ca00: 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , j++){.        
ca10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ca20: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
ca30: 72 2c 20 30 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69  r, 0, 8+j); /* i
ca40: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 63 6f 75  ndex entries cou
ca50: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  nter */.        
ca60: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
ca70: 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d  ( pParse->nMem>=
ca80: 38 2b 6a 20 29 3b 0a 20 20 20 20 20 20 20 20 61  8+j );.        a
ca90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4e 6f  ssert( sqlite3No
caa0: 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 70 50 61  TempsInRange(pPa
cab0: 72 73 65 2c 31 2c 37 2b 6a 29 20 29 3b 0a 20 20  rse,1,7+j) );.  
cac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cad0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
cae0: 77 69 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20  wind, iDataCur, 
caf0: 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
cb00: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6f  (v);.        loo
cb10: 70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  pTop = sqlite3Vd
cb20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
cb30: 64 64 49 6d 6d 2c 20 37 2c 20 31 29 3b 0a 20 20  ddImm, 7, 1);.  
cb40: 20 20 20 20 20 20 69 66 28 20 21 69 73 51 75 69        if( !isQui
cb50: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
cb60: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 20  /* Sanity check 
cb70: 6f 6e 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  on record header
cb80: 20 64 65 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 20   decoding */.   
cb90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cba0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
cbb0: 6f 6c 75 6d 6e 2c 20 69 44 61 74 61 43 75 72 2c  olumn, iDataCur,
cbc0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 2c 20 33   pTab->nCol-1, 3
cbd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
cbe0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
cbf0: 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
cc00: 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 7d  FARG);.        }
cc10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69  .        /* Veri
cc20: 66 79 20 74 68 61 74 20 61 6c 6c 20 4e 4f 54 20  fy that all NOT 
cc30: 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 72 65 61  NULL columns rea
cc40: 6c 6c 79 20 61 72 65 20 4e 4f 54 20 4e 55 4c 4c  lly are NOT NULL
cc50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
cc60: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
cc70: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
cc80: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20     char *zErr;. 
cc90: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70           int jmp
cca0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  2;.          if(
ccb0: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
ccc0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
ccd0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
cce0: 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
ccf0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
cd00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cd10: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
cd20: 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
cd30: 2c 20 69 44 61 74 61 43 75 72 2c 20 6a 2c 20 33  , iDataCur, j, 3
cd40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
cd50: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
cd60: 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
cd70: 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20  FARG);.         
cd80: 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56   jmp2 = sqlite3V
cd90: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
cda0: 4e 6f 74 4e 75 6c 6c 2c 20 33 29 3b 20 56 64 62  NotNull, 3); Vdb
cdb0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
cdc0: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73          zErr = s
cdd0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
cde0: 2c 20 22 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e  , "NULL value in
cdf0: 20 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a   %s.%s", pTab->z
ce00: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce20: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a      pTab->aCol[j
ce30: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
ce40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ce50: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
ce60: 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45  ng8, 0, 3, 0, zE
ce70: 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  rr, P4_DYNAMIC);
ce80: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 67  .          integ
ce90: 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52  rityCheckResultR
cea0: 6f 77 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ow(v);.         
ceb0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
cec0: 48 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20  Here(v, jmp2);. 
ced0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cee0: 20 2f 2a 20 56 65 72 69 66 79 20 43 48 45 43 4b   /* Verify CHECK
cef0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
cf00: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
cf10: 2d 3e 70 43 68 65 63 6b 20 26 26 20 28 64 62 2d  ->pCheck && (db-
cf20: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
cf30: 49 67 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30  IgnoreChecks)==0
cf40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
cf50: 70 72 4c 69 73 74 20 2a 70 43 68 65 63 6b 20 3d  prList *pCheck =
cf60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cf70: 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 43  Dup(db, pTab->pC
cf80: 68 65 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  heck, 0);.      
cf90: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
cfa0: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
cfb0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61             int a
cfc0: 64 64 72 43 6b 46 61 75 6c 74 20 3d 20 73 71 6c  ddrCkFault = sql
cfd0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
cfe0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
cff0: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 43         int addrC
d000: 6b 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kOk = sqlite3Vdb
d010: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
d020: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
d030: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
d040: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
d050: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
d060: 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 44  e->iSelfTab = iD
d070: 61 74 61 43 75 72 20 2b 20 31 3b 0a 20 20 20 20  ataCur + 1;.    
d080: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 43          for(k=pC
d090: 68 65 63 6b 2d 3e 6e 45 78 70 72 2d 31 3b 20 6b  heck->nExpr-1; k
d0a0: 3e 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; k--){.      
d0b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
d0c0: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
d0d0: 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b 6b 5d 2e  e, pCheck->a[k].
d0e0: 70 45 78 70 72 2c 20 61 64 64 72 43 6b 46 61 75  pExpr, addrCkFau
d0f0: 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  lt, 0);.        
d100: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d110: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
d120: 72 75 65 28 70 50 61 72 73 65 2c 20 70 43 68 65  rue(pParse, pChe
d130: 63 6b 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  ck->a[0].pExpr, 
d140: 61 64 64 72 43 6b 4f 6b 2c 20 0a 20 20 20 20 20  addrCkOk, .     
d150: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
d160: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
d170: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d180: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d190: 65 6c 28 76 2c 20 61 64 64 72 43 6b 46 61 75 6c  el(v, addrCkFaul
d1a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
d1b0: 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
d1c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
d1d0: 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
d1e0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 48 45  MPrintf(db, "CHE
d1f0: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  CK constraint fa
d200: 69 6c 65 64 20 69 6e 20 25 73 22 2c 0a 20 20 20  iled in %s",.   
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
d220: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
d230: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d240: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
d250: 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c  tring8, 0, 3, 0,
d260: 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49   zErr, P4_DYNAMI
d270: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
d280: 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65  integrityCheckRe
d290: 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20  sultRow(v);.    
d2a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d2b0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d2c0: 76 2c 20 61 64 64 72 43 6b 4f 6b 29 3b 0a 20 20  v, addrCkOk);.  
d2d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d2e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
d2f0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
d300: 68 65 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  heck);.        }
d310: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
d320: 51 75 69 63 6b 20 29 7b 20 2f 2a 20 4f 6d 69 74  Quick ){ /* Omit
d330: 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 74   the remaining t
d340: 65 73 74 73 20 66 6f 72 20 71 75 69 63 6b 5f 63  ests for quick_c
d350: 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  heck */.        
d360: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 69 6e    /* Validate in
d370: 64 65 78 20 65 6e 74 72 69 65 73 20 66 6f 72 20  dex entries for 
d380: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
d390: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
d3a0: 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  (j=0, pIdx=pTab-
d3b0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
d3c0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
d3d0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
d3e0: 20 20 20 69 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70     int jmp2, jmp
d3f0: 33 2c 20 6a 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20  3, jmp4, jmp5;. 
d400: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63             int c
d410: 6b 55 6e 69 71 20 3d 20 73 71 6c 69 74 65 33 56  kUniq = sqlite3V
d420: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
d430: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
d440: 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20    if( pPk==pIdx 
d450: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d460: 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
d470: 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
d480: 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64  xKey(pParse, pId
d490: 78 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c 20  x, iDataCur, 0, 
d4a0: 30 2c 20 26 6a 6d 70 33 2c 0a 20 20 20 20 20 20  0, &jmp3,.      
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 20 20 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a     pPrior, r1);.
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
d4f0: 6f 72 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  or = pIdx;.     
d500: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d510: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
d520: 64 64 49 6d 6d 2c 20 38 2b 6a 2c 20 31 29 3b 2f  ddImm, 8+j, 1);/
d530: 2a 20 69 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72  * increment entr
d540: 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  y count */.     
d550: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
d560: 20 74 68 61 74 20 61 6e 20 69 6e 64 65 78 20 65   that an index e
d570: 6e 74 72 79 20 65 78 69 73 74 73 20 66 6f 72 20  ntry exists for 
d580: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
d590: 65 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  e row */.       
d5a0: 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69       jmp2 = sqli
d5b0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d5c0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 49  (v, OP_Found, iI
d5d0: 64 78 43 75 72 2b 6a 2c 20 63 6b 55 6e 69 71 2c  dxCur+j, ckUniq,
d5e0: 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r1,.           
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
d610: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 20 56 64 62  x->nColumn); Vdb
d620: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d630: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d640: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
d650: 76 2c 20 33 2c 20 22 72 6f 77 20 22 29 3b 0a 20  v, 3, "row ");. 
d660: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d670: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d680: 4f 50 5f 43 6f 6e 63 61 74 2c 20 37 2c 20 33 2c  OP_Concat, 7, 3,
d690: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   3);.           
d6a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
d6b0: 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 22 20 6d  String(v, 4, " m
d6c0: 69 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65  issing from inde
d6d0: 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  x ");.          
d6e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d6f0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
d700: 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20  , 4, 3, 3);.    
d710: 20 20 20 20 20 20 20 20 6a 6d 70 35 20 3d 20 73          jmp5 = s
d720: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
d730: 72 69 6e 67 28 76 2c 20 34 2c 20 70 49 64 78 2d  ring(v, 4, pIdx-
d740: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
d750: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d760: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
d770: 63 61 74 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20  cat, 4, 3, 3);. 
d780: 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 34 20             jmp4 
d790: 3d 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b  = integrityCheck
d7a0: 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20  ResultRow(v);.  
d7b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d7c0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
d7d0: 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20   jmp2);.        
d7e0: 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 51 55      /* For UNIQU
d7f0: 45 20 69 6e 64 65 78 65 73 2c 20 76 65 72 69 66  E indexes, verif
d800: 79 20 74 68 61 74 20 6f 6e 6c 79 20 6f 6e 65 20  y that only one 
d810: 65 6e 74 72 79 20 65 78 69 73 74 73 20 77 69 74  entry exists wit
d820: 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  h the.          
d830: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 6b 65 79    ** current key
d840: 2e 20 20 54 68 65 20 65 6e 74 72 79 20 69 73 20  .  The entry is 
d850: 75 6e 69 71 75 65 20 69 66 20 28 31 29 20 61 6e  unique if (1) an
d860: 79 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  y column is NULL
d870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
d880: 6f 72 20 28 32 29 20 74 68 65 20 6e 65 78 74 20  or (2) the next 
d890: 65 6e 74 72 79 20 68 61 73 20 61 20 64 69 66 66  entry has a diff
d8a0: 65 72 65 6e 74 20 6b 65 79 20 2a 2f 0a 20 20 20  erent key */.   
d8b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 55           if( IsU
d8c0: 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
d8d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d8e0: 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20 3d 20 73    int uniqOk = s
d8f0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d900: 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
d910: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
d920: 6d 70 36 3b 0a 20 20 20 20 20 20 20 20 20 20 20  mp6;.           
d930: 20 20 20 69 6e 74 20 6b 6b 3b 0a 20 20 20 20 20     int kk;.     
d940: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 6b 3d           for(kk=
d950: 30 3b 20 6b 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79  0; kk<pIdx->nKey
d960: 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20  Col; kk++){.    
d970: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
d980: 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  iCol = pIdx->aiC
d990: 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20 20 20 20  olumn[kk];.     
d9a0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
d9b0: 74 28 20 69 43 6f 6c 21 3d 58 4e 5f 52 4f 57 49  t( iCol!=XN_ROWI
d9c0: 44 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  D && iCol<pTab->
d9d0: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  nCol );.        
d9e0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
d9f0: 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e 61 43 6f  >=0 && pTab->aCo
da00: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
da10: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
da20: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
da30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
da40: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b   OP_IsNull, r1+k
da50: 6b 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20  k, uniqOk);.    
da60: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
da70: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
da80: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
da90: 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 36 20             jmp6 
daa0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
dab0: 4f 70 31 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op1(v, OP_Next, 
dac0: 69 49 64 78 43 75 72 2b 6a 29 3b 20 56 64 62 65  iIdxCur+j); Vdbe
dad0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
dae0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
daf0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 75 6e  e3VdbeGoto(v, un
db00: 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  iqOk);.         
db10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
db20: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 36  JumpHere(v, jmp6
db30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
db40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
db50: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 47  p4Int(v, OP_IdxG
db60: 54 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 75 6e  T, iIdxCur+j, un
db70: 69 71 4f 6b 2c 20 72 31 2c 0a 20 20 20 20 20 20  iqOk, r1,.      
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
dba0: 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
dbb0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
dbd0: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
dbe0: 67 28 76 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69  g(v, 3, "non-uni
dbf0: 71 75 65 20 65 6e 74 72 79 20 69 6e 20 69 6e 64  que entry in ind
dc00: 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ex ");.         
dc10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc20: 47 6f 74 6f 28 76 2c 20 6a 6d 70 35 29 3b 0a 20  Goto(v, jmp5);. 
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
dc40: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
dc50: 61 62 65 6c 28 76 2c 20 75 6e 69 71 4f 6b 29 3b  abel(v, uniqOk);
dc60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
dc70: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
dc80: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
dc90: 2c 20 6a 6d 70 34 29 3b 0a 20 20 20 20 20 20 20  , jmp4);.       
dca0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f       sqlite3Reso
dcb0: 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28  lvePartIdxLabel(
dcc0: 70 50 61 72 73 65 2c 20 6a 6d 70 33 29 3b 0a 20  pParse, jmp3);. 
dcd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dce0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
dcf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dd00: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 44 61 74 61  , OP_Next, iData
dd10: 43 75 72 2c 20 6c 6f 6f 70 54 6f 70 29 3b 20 56  Cur, loopTop); V
dd20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
dd30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dd40: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6c  dbeJumpHere(v, l
dd50: 6f 6f 70 54 6f 70 2d 31 29 3b 0a 23 69 66 6e 64  oopTop-1);.#ifnd
dd60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
dd70: 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20  TREECOUNT.      
dd80: 20 20 69 66 28 20 21 69 73 51 75 69 63 6b 20 29    if( !isQuick )
dd90: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
dda0: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
ddb0: 67 28 76 2c 20 32 2c 20 22 77 72 6f 6e 67 20 23  g(v, 2, "wrong #
ddc0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 69   of entries in i
ddd0: 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20  ndex ");.       
dde0: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78     for(j=0, pIdx
ddf0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
de00: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
de10: 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20  pNext, j++){.   
de20: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6b           if( pPk
de30: 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75  ==pIdx ) continu
de40: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
de50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
de60: 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 49  (v, OP_Count, iI
de70: 64 78 43 75 72 2b 6a 2c 20 33 29 3b 0a 20 20 20  dxCur+j, 3);.   
de80: 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20           addr = 
de90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dea0: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 38 2b 6a 2c  3(v, OP_Eq, 8+j,
deb0: 20 30 2c 20 33 29 3b 20 56 64 62 65 43 6f 76 65   0, 3); VdbeCove
dec0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
ded0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dee0: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
def0: 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TE_NOTNULL);.   
df00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
df10: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
df20: 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  , 4, pIdx->zName
df30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
df40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
df50: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34  (v, OP_Concat, 4
df60: 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 2, 3);.       
df70: 20 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68       integrityCh
df80: 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b  eckResultRow(v);
df90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
dfa0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
dfb0: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
dfc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
dfd0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
dfe0: 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
dff0: 54 20 2a 2f 0a 20 20 20 20 20 20 7d 20 0a 20 20  T */.      } .  
e000: 20 20 7d 0a 20 20 20 20 7b 0a 20 20 20 20 20 20    }.    {.      
e010: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
e020: 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53   iLn = VDBE_OFFS
e030: 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20  ET_LINENO(2);.  
e040: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
e050: 20 56 64 62 65 4f 70 4c 69 73 74 20 65 6e 64 43   VdbeOpList endC
e060: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
e070: 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20    { OP_AddImm,  
e080: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
e090: 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a   0},    /* 0 */.
e0a0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 4e          { OP_IfN
e0b0: 6f 74 5a 65 72 6f 2c 20 20 20 31 2c 20 34 2c 20  otZero,   1, 4, 
e0c0: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
e0d0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   1 */.        { 
e0e0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20  OP_String8,     
e0f0: 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 3,        0},
e100: 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20      /* 2 */.    
e110: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
e120: 6f 77 2c 20 20 20 33 2c 20 31 2c 20 20 20 20 20  ow,   3, 1,     
e130: 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a     0},    /* 3 *
e140: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 48  /.        { OP_H
e150: 61 6c 74 2c 20 20 20 20 20 20 20 20 30 2c 20 30  alt,        0, 0
e160: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
e170: 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 4 */.        
e180: 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20  { OP_String8,   
e190: 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30    0, 3,        0
e1a0: 7d 2c 20 20 20 20 2f 2a 20 35 20 2a 2f 0a 20 20  },    /* 5 */.  
e1b0: 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c        { OP_Goto,
e1c0: 20 20 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20          0, 3,   
e1d0: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 36       0},    /* 6
e1e0: 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20   */.      };.   
e1f0: 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a     VdbeOp *aOp;.
e200: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c  .      aOp = sql
e210: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
e220: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 65  t(v, ArraySize(e
e230: 6e 64 43 6f 64 65 29 2c 20 65 6e 64 43 6f 64 65  ndCode), endCode
e240: 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66  , iLn);.      if
e250: 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  ( aOp ){.       
e260: 20 61 4f 70 5b 30 5d 2e 70 32 20 3d 20 31 2d 6d   aOp[0].p2 = 1-m
e270: 78 45 72 72 3b 0a 20 20 20 20 20 20 20 20 61 4f  xErr;.        aO
e280: 70 5b 32 5d 2e 70 34 74 79 70 65 20 3d 20 50 34  p[2].p4type = P4
e290: 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 20 20 20  _STATIC;.       
e2a0: 20 61 4f 70 5b 32 5d 2e 70 34 2e 7a 20 3d 20 22   aOp[2].p4.z = "
e2b0: 6f 6b 22 3b 0a 20 20 20 20 20 20 20 20 61 4f 70  ok";.        aOp
e2c0: 5b 35 5d 2e 70 34 74 79 70 65 20 3d 20 50 34 5f  [5].p4type = P4_
e2d0: 53 54 41 54 49 43 3b 0a 20 20 20 20 20 20 20 20  STATIC;.        
e2e0: 61 4f 70 5b 35 5d 2e 70 34 2e 7a 20 3d 20 28 63  aOp[5].p4.z = (c
e2f0: 68 61 72 2a 29 73 71 6c 69 74 65 33 45 72 72 53  har*)sqlite3ErrS
e300: 74 72 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  tr(SQLITE_CORRUP
e310: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
e320: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e330: 6e 67 65 50 33 28 76 2c 20 30 2c 20 73 71 6c 69  ngeP3(v, 0, sqli
e340: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e350: 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 7d 0a  dr(v)-2);.    }.
e360: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
e370: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e380: 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
e390: 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
e3a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
e3b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
e3c0: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 0a 20 20 2a  GMA encoding.  *
e3d0: 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  *   PRAGMA encod
e3e0: 69 6e 67 20 3d 20 22 75 74 66 2d 38 22 7c 22 75  ing = "utf-8"|"u
e3f0: 74 66 2d 31 36 22 7c 22 75 74 66 2d 31 36 6c 65  tf-16"|"utf-16le
e400: 22 7c 22 75 74 66 2d 31 36 62 65 22 0a 20 20 2a  "|"utf-16be".  *
e410: 2a 0a 20 20 2a 2a 20 49 6e 20 69 74 73 20 66 69  *.  ** In its fi
e420: 72 73 74 20 66 6f 72 6d 2c 20 74 68 69 73 20 70  rst form, this p
e430: 72 61 67 6d 61 20 72 65 74 75 72 6e 73 20 74 68  ragma returns th
e440: 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68  e encoding of th
e450: 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 64 61 74 61  e main.  ** data
e460: 62 61 73 65 2e 20 49 66 20 74 68 65 20 64 61 74  base. If the dat
e470: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 69 6e 69  abase is not ini
e480: 74 69 61 6c 69 7a 65 64 2c 20 69 74 20 69 73 20  tialized, it is 
e490: 69 6e 69 74 69 61 6c 69 7a 65 64 20 6e 6f 77 2e  initialized now.
e4a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
e4b0: 65 63 6f 6e 64 20 66 6f 72 6d 20 6f 66 20 74 68  econd form of th
e4c0: 69 73 20 70 72 61 67 6d 61 20 69 73 20 61 20 6e  is pragma is a n
e4d0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 6d 61 69 6e  o-op if the main
e4e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
e4f0: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   ** has not alre
e500: 61 64 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ady been initial
e510: 69 7a 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ized. In this ca
e520: 73 65 20 69 74 20 73 65 74 73 20 74 68 65 20 64  se it sets the d
e530: 65 66 61 75 6c 74 0a 20 20 2a 2a 20 65 6e 63 6f  efault.  ** enco
e540: 64 69 6e 67 20 74 68 61 74 20 77 69 6c 6c 20 62  ding that will b
e550: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6d  e used for the m
e560: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
e570: 65 20 69 66 20 61 20 6e 65 77 20 66 69 6c 65 0a  e if a new file.
e580: 20 20 2a 2a 20 69 73 20 63 72 65 61 74 65 64 2e    ** is created.
e590: 20 49 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   If an existing 
e5a0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
e5b0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 74 68  le is opened, th
e5c0: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61  en the.  ** defa
e5d0: 75 6c 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ult text encodin
e5e0: 67 20 66 6f 72 20 74 68 65 20 65 78 69 73 74 69  g for the existi
e5f0: 6e 67 20 64 61 74 61 62 61 73 65 20 69 73 20 75  ng database is u
e600: 73 65 64 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  sed..  ** .  ** 
e610: 49 6e 20 61 6c 6c 20 63 61 73 65 73 20 6e 65 77  In all cases new
e620: 20 64 61 74 61 62 61 73 65 73 20 63 72 65 61 74   databases creat
e630: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
e640: 41 43 48 20 63 6f 6d 6d 61 6e 64 20 61 72 65 0a  ACH command are.
e650: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 74 6f 20    ** created to 
e660: 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 65 66  use the same def
e670: 61 75 6c 74 20 74 65 78 74 20 65 6e 63 6f 64 69  ault text encodi
e680: 6e 67 20 61 73 20 74 68 65 20 6d 61 69 6e 20 64  ng as the main d
e690: 61 74 61 62 61 73 65 2e 20 49 66 0a 20 20 2a 2a  atabase. If.  **
e6a0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e6b0: 73 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  se has not been 
e6c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 2f  initialized and/
e6d0: 6f 72 20 63 72 65 61 74 65 64 20 77 68 65 6e 20  or created when 
e6e0: 41 54 54 41 43 48 0a 20 20 2a 2a 20 69 73 20 65  ATTACH.  ** is e
e6f0: 78 65 63 75 74 65 64 2c 20 74 68 69 73 20 69 73  xecuted, this is
e700: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
e710: 20 41 54 54 41 43 48 20 6f 70 65 72 61 74 69 6f   ATTACH operatio
e720: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  n..  **.  ** In 
e730: 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  the second form 
e740: 74 68 69 73 20 70 72 61 67 6d 61 20 73 65 74 73  this pragma sets
e750: 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   the text encodi
e760: 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e  ng to be used in
e770: 0a 20 20 2a 2a 20 6e 65 77 20 64 61 74 61 62 61  .  ** new databa
e780: 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64  se files created
e790: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
e7a0: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 49 74 20  base handle. It 
e7b0: 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 75 73 65  is only.  ** use
e7c0: 66 75 6c 20 69 66 20 69 6e 76 6f 6b 65 64 20 69  ful if invoked i
e7d0: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
e7e0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e7f0: 73 65 20 69 0a 20 20 2a 2f 0a 20 20 63 61 73 65  se i.  */.  case
e800: 20 50 72 61 67 54 79 70 5f 45 4e 43 4f 44 49 4e   PragTyp_ENCODIN
e810: 47 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  G: {.    static 
e820: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45 6e 63  const struct Enc
e830: 4e 61 6d 65 20 7b 0a 20 20 20 20 20 20 63 68 61  Name {.      cha
e840: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  r *zName;.      
e850: 75 38 20 65 6e 63 3b 0a 20 20 20 20 7d 20 65 6e  u8 enc;.    } en
e860: 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20  cnames[] = {.   
e870: 20 20 20 7b 20 22 55 54 46 38 22 2c 20 20 20 20     { "UTF8",    
e880: 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20   SQLITE_UTF8    
e890: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
e8a0: 55 54 46 2d 38 22 2c 20 20 20 20 53 51 4c 49 54  UTF-8",    SQLIT
e8b0: 45 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c  E_UTF8        },
e8c0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65    /* Must be ele
e8d0: 6d 65 6e 74 20 5b 31 5d 20 2a 2f 0a 20 20 20 20  ment [1] */.    
e8e0: 20 20 7b 20 22 55 54 46 2d 31 36 6c 65 22 2c 20    { "UTF-16le", 
e8f0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20  SQLITE_UTF16LE  
e900: 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62     },  /* Must b
e910: 65 20 65 6c 65 6d 65 6e 74 20 5b 32 5d 20 2a 2f  e element [2] */
e920: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36  .      { "UTF-16
e930: 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  be", SQLITE_UTF1
e940: 36 42 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d  6BE     },  /* M
e950: 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b  ust be element [
e960: 33 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55  3] */.      { "U
e970: 54 46 31 36 6c 65 22 2c 20 20 53 51 4c 49 54 45  TF16le",  SQLITE
e980: 5f 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 0a  _UTF16LE     },.
e990: 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 62 65        { "UTF16be
e9a0: 22 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ",  SQLITE_UTF16
e9b0: 42 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  BE     },.      
e9c0: 7b 20 22 55 54 46 2d 31 36 22 2c 20 20 20 30 20  { "UTF-16",   0 
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54   }, /* SQLITE_UT
e9f0: 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20  F16NATIVE */.   
ea00: 20 20 20 7b 20 22 55 54 46 31 36 22 2c 20 20 20     { "UTF16",   
ea10: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
ea20: 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45      }, /* SQLITE
ea30: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a  _UTF16NATIVE */.
ea40: 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
ea50: 20 20 20 7d 3b 0a 20 20 20 20 63 6f 6e 73 74 20     };.    const 
ea60: 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 2a  struct EncName *
ea70: 70 45 6e 63 3b 0a 20 20 20 20 69 66 28 20 21 7a  pEnc;.    if( !z
ea80: 52 69 67 68 74 20 29 7b 20 20 20 20 2f 2a 20 22  Right ){    /* "
ea90: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 22  PRAGMA encoding"
eaa0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
eab0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
eac0: 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70  pParse) ) goto p
ead0: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20  ragma_out;.     
eae0: 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65   assert( encname
eaf0: 73 5b 53 51 4c 49 54 45 5f 55 54 46 38 5d 2e 65  s[SQLITE_UTF8].e
eb00: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
eb10: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
eb20: 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45   encnames[SQLITE
eb30: 5f 55 54 46 31 36 4c 45 5d 2e 65 6e 63 3d 3d 53  _UTF16LE].enc==S
eb40: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 29 3b  QLITE_UTF16LE );
eb50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
eb60: 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55  ncnames[SQLITE_U
eb70: 54 46 31 36 42 45 5d 2e 65 6e 63 3d 3d 53 51 4c  TF16BE].enc==SQL
eb80: 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20  ITE_UTF16BE );. 
eb90: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
eba0: 65 54 65 78 74 28 76 2c 20 65 6e 63 6e 61 6d 65  eText(v, encname
ebb0: 73 5b 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  s[ENC(pParse->db
ebc0: 29 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  )].zName);.    }
ebd0: 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ebf0: 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67  "PRAGMA encoding
ec00: 20 3d 20 58 58 58 22 20 2a 2f 0a 20 20 20 20 20   = XXX" */.     
ec10: 20 2f 2a 20 4f 6e 6c 79 20 63 68 61 6e 67 65 20   /* Only change 
ec20: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  the value of sql
ec30: 69 74 65 2e 65 6e 63 20 69 66 20 74 68 65 20 64  ite.enc if the d
ec40: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 69  atabase handle i
ec50: 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 69  s not.      ** i
ec60: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 66 20 74  nitialized. If t
ec70: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
ec80: 20 65 78 69 73 74 73 2c 20 74 68 65 20 6e 65 77   exists, the new
ec90: 20 73 71 6c 69 74 65 2e 65 6e 63 20 76 61 6c 75   sqlite.enc valu
eca0: 65 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  e.      ** will 
ecb0: 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
ecc0: 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 69  hen the schema i
ecd0: 73 20 6e 65 78 74 20 6c 6f 61 64 65 64 2e 20 49  s next loaded. I
ece0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  f it does not.  
ecf0: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 65      ** already e
ed00: 78 69 73 74 73 2c 20 69 74 20 77 69 6c 6c 20 62  xists, it will b
ed10: 65 20 63 72 65 61 74 65 64 20 74 6f 20 75 73 65  e created to use
ed20: 20 74 68 65 20 6e 65 77 20 65 6e 63 6f 64 69 6e   the new encodin
ed30: 67 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a  g value..      *
ed40: 2f 0a 20 20 20 20 20 20 69 66 28 20 0a 20 20 20  /.      if( .   
ed50: 20 20 20 20 20 21 28 44 62 48 61 73 50 72 6f 70       !(DbHasProp
ed60: 65 72 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 53  erty(db, 0, DB_S
ed70: 63 68 65 6d 61 4c 6f 61 64 65 64 29 29 20 7c 7c  chemaLoaded)) ||
ed80: 20 0a 20 20 20 20 20 20 20 20 44 62 48 61 73 50   .        DbHasP
ed90: 72 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20 44  roperty(db, 0, D
eda0: 42 5f 45 6d 70 74 79 29 20 0a 20 20 20 20 20 20  B_Empty) .      
edb0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  ){.        for(p
edc0: 45 6e 63 3d 26 65 6e 63 6e 61 6d 65 73 5b 30 5d  Enc=&encnames[0]
edd0: 3b 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 3b 20 70  ; pEnc->zName; p
ede0: 45 6e 63 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Enc++){.        
edf0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
ee00: 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  StrICmp(zRight, 
ee10: 70 45 6e 63 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a  pEnc->zName) ){.
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 53 43 48 45              SCHE
ee30: 4d 41 5f 45 4e 43 28 64 62 29 20 3d 20 45 4e 43  MA_ENC(db) = ENC
ee40: 28 64 62 29 20 3d 0a 20 20 20 20 20 20 20 20 20  (db) =.         
ee50: 20 20 20 20 20 20 20 70 45 6e 63 2d 3e 65 6e 63         pEnc->enc
ee60: 20 3f 20 70 45 6e 63 2d 3e 65 6e 63 20 3a 20 53   ? pEnc->enc : S
ee70: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
ee80: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  E;.            b
ee90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
eea0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
eeb0: 20 20 20 20 69 66 28 20 21 70 45 6e 63 2d 3e 7a      if( !pEnc->z
eec0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
eed0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
eee0: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 73 75 70  g(pParse, "unsup
eef0: 70 6f 72 74 65 64 20 65 6e 63 6f 64 69 6e 67 3a  ported encoding:
ef00: 20 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20   %s", zRight);. 
ef10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ef20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
ef30: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ak;.#endif /* SQ
ef40: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
ef50: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
ef60: 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56  TE_OMIT_SCHEMA_V
ef70: 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20  ERSION_PRAGMAS. 
ef80: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
ef90: 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d  A [schema.]schem
efa0: 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20  a_version.  **  
efb0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
efc0: 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20  ]schema_version 
efd0: 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a  = <integer>.  **
efe0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
eff0: 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72  schema.]user_ver
f000: 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47  sion.  **   PRAG
f010: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72  MA [schema.]user
f020: 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65  _version = <inte
f030: 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ger>.  **.  **  
f040: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
f050: 5d 66 72 65 65 6c 69 73 74 5f 63 6f 75 6e 74 0a  ]freelist_count.
f060: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    **.  **   PRAG
f070: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 61 74 61  MA [schema.]data
f080: 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20  _version.  **.  
f090: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
f0a0: 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e  ema.]application
f0b0: 5f 69 64 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  _id.  **   PRAGM
f0c0: 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69  A [schema.]appli
f0d0: 63 61 74 69 6f 6e 5f 69 64 20 3d 20 3c 69 6e 74  cation_id = <int
f0e0: 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  eger>.  **.  ** 
f0f0: 54 68 65 20 70 72 61 67 6d 61 27 73 20 73 63 68  The pragma's sch
f100: 65 6d 61 5f 76 65 72 73 69 6f 6e 20 61 6e 64 20  ema_version and 
f110: 75 73 65 72 5f 76 65 72 73 69 6f 6e 20 61 72 65  user_version are
f120: 20 75 73 65 64 20 74 6f 20 73 65 74 20 6f 72 20   used to set or 
f130: 67 65 74 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c  get.  ** the val
f140: 75 65 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  ue of the schema
f150: 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20 75 73 65  -version and use
f160: 72 2d 76 65 72 73 69 6f 6e 2c 20 72 65 73 70 65  r-version, respe
f170: 63 74 69 76 65 6c 79 2e 20 42 6f 74 68 0a 20 20  ctively. Both.  
f180: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65  ** the schema-ve
f190: 72 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 75 73  rsion and the us
f1a0: 65 72 2d 76 65 72 73 69 6f 6e 20 61 72 65 20 33  er-version are 3
f1b0: 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  2-bit signed int
f1c0: 65 67 65 72 73 0a 20 20 2a 2a 20 73 74 6f 72 65  egers.  ** store
f1d0: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
f1e0: 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 0a 20  e header..  **. 
f1f0: 20 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 2d 63   ** The schema-c
f200: 6f 6f 6b 69 65 20 69 73 20 75 73 75 61 6c 6c 79  ookie is usually
f210: 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65   only manipulate
f220: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
f230: 53 51 4c 69 74 65 2e 20 49 74 0a 20 20 2a 2a 20  SQLite. It.  ** 
f240: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  is incremented b
f250: 79 20 53 51 4c 69 74 65 20 77 68 65 6e 65 76 65  y SQLite wheneve
f260: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  r the database s
f270: 63 68 65 6d 61 20 69 73 20 6d 6f 64 69 66 69 65  chema is modifie
f280: 64 20 28 62 79 0a 20 20 2a 2a 20 63 72 65 61 74  d (by.  ** creat
f290: 69 6e 67 20 6f 72 20 64 72 6f 70 70 69 6e 67 20  ing or dropping 
f2a0: 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
f2b0: 29 2e 20 54 68 65 20 73 63 68 65 6d 61 20 76 65  ). The schema ve
f2c0: 72 73 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  rsion is used by
f2d0: 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 65 61 63  .  ** SQLite eac
f2e0: 68 20 74 69 6d 65 20 61 20 71 75 65 72 79 20 69  h time a query i
f2f0: 73 20 65 78 65 63 75 74 65 64 20 74 6f 20 65 6e  s executed to en
f300: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
f310: 74 65 72 6e 61 6c 20 63 61 63 68 65 0a 20 20 2a  ternal cache.  *
f320: 2a 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20  * of the schema 
f330: 75 73 65 64 20 77 68 65 6e 20 63 6f 6d 70 69 6c  used when compil
f340: 69 6e 67 20 74 68 65 20 53 51 4c 20 71 75 65 72  ing the SQL quer
f350: 79 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 63  y matches the sc
f360: 68 65 6d 61 20 6f 66 0a 20 20 2a 2a 20 74 68 65  hema of.  ** the
f370: 20 64 61 74 61 62 61 73 65 20 61 67 61 69 6e 73   database agains
f380: 74 20 77 68 69 63 68 20 74 68 65 20 63 6f 6d 70  t which the comp
f390: 69 6c 65 64 20 71 75 65 72 79 20 69 73 20 61 63  iled query is ac
f3a0: 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 2e  tually executed.
f3b0: 0a 20 20 2a 2a 20 53 75 62 76 65 72 74 69 6e 67  .  ** Subverting
f3c0: 20 74 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20   this mechanism 
f3d0: 62 79 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41  by using "PRAGMA
f3e0: 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22   schema_version"
f3f0: 20 74 6f 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20   to modify.  ** 
f400: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
f410: 6f 6e 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  on is potentiall
f420: 79 20 64 61 6e 67 65 72 6f 75 73 20 61 6e 64 20  y dangerous and 
f430: 6d 61 79 20 6c 65 61 64 20 74 6f 20 70 72 6f 67  may lead to prog
f440: 72 61 6d 0a 20 20 2a 2a 20 63 72 61 73 68 65 73  ram.  ** crashes
f450: 20 6f 72 20 64 61 74 61 62 61 73 65 20 63 6f 72   or database cor
f460: 72 75 70 74 69 6f 6e 2e 20 55 73 65 20 77 69 74  ruption. Use wit
f470: 68 20 63 61 75 74 69 6f 6e 21 0a 20 20 2a 2a 0a  h caution!.  **.
f480: 20 20 2a 2a 20 54 68 65 20 75 73 65 72 2d 76 65    ** The user-ve
f490: 72 73 69 6f 6e 20 69 73 20 6e 6f 74 20 75 73 65  rsion is not use
f4a0: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
f4b0: 53 51 4c 69 74 65 2e 20 49 74 20 6d 61 79 20 62  SQLite. It may b
f4c0: 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 61  e used by.  ** a
f4d0: 70 70 6c 69 63 61 74 69 6f 6e 73 20 66 6f 72 20  pplications for 
f4e0: 61 6e 79 20 70 75 72 70 6f 73 65 2e 0a 20 20 2a  any purpose..  *
f4f0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
f500: 5f 48 45 41 44 45 52 5f 56 41 4c 55 45 3a 20 7b  _HEADER_VALUE: {
f510: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65  .    int iCookie
f520: 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67   = pPragma->iArg
f530: 3b 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6f 6b  ;  /* Which cook
f540: 69 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ie to read or wr
f550: 69 74 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ite */.    sqlit
f560: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
f570: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28  v, iDb);.    if(
f580: 20 7a 52 69 67 68 74 20 26 26 20 28 70 50 72 61   zRight && (pPra
f590: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
f5a0: 50 72 61 67 46 6c 67 5f 52 65 61 64 4f 6e 6c 79  PragFlg_ReadOnly
f5b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
f5c0: 20 57 72 69 74 65 20 74 68 65 20 73 70 65 63 69   Write the speci
f5d0: 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75  fied cookie valu
f5e0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  e */.      stati
f5f0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
f600: 73 74 20 73 65 74 43 6f 6f 6b 69 65 5b 5d 20 3d  st setCookie[] =
f610: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
f620: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
f630: 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f  0,  1,  0},    /
f640: 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 0 */.        {
f650: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
f660: 20 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20      0,  0,  0}, 
f670: 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20     /* 1 */.     
f680: 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70   };.      VdbeOp
f690: 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c   *aOp;.      sql
f6a0: 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f  ite3VdbeVerifyNo
f6b0: 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76  MallocRequired(v
f6c0: 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65 74 43  , ArraySize(setC
f6d0: 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61  ookie));.      a
f6e0: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
f6f0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
f700: 61 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65  aySize(setCookie
f710: 29 2c 20 73 65 74 43 6f 6f 6b 69 65 2c 20 30 29  ), setCookie, 0)
f720: 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59  ;.      if( ONLY
f730: 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  _IF_REALLOC_STRE
f740: 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65  SS(aOp==0) ) bre
f750: 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d  ak;.      aOp[0]
f760: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
f770: 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62   aOp[1].p1 = iDb
f780: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70  ;.      aOp[1].p
f790: 32 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20  2 = iCookie;.   
f7a0: 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 73     aOp[1].p3 = s
f7b0: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
f7c0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
f7d0: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65       /* Read the
f7e0: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f 6b 69   specified cooki
f7f0: 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20  e value */.     
f800: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
f810: 62 65 4f 70 4c 69 73 74 20 72 65 61 64 43 6f 6f  beOpList readCoo
f820: 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  kie[] = {.      
f830: 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69    { OP_Transacti
f840: 6f 6e 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20  on,     0,  0,  
f850: 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20  0},    /* 0 */. 
f860: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64         { OP_Read
f870: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20  Cookie,      0, 
f880: 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31   1,  0},    /* 1
f890: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
f8a0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 20 20  _ResultRow,     
f8b0: 20 20 31 2c 20 20 31 2c 20 20 30 7d 0a 20 20 20    1,  1,  0}.   
f8c0: 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65     };.      Vdbe
f8d0: 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73  Op *aOp;.      s
f8e0: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
f8f0: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64  NoMallocRequired
f900: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 72 65  (v, ArraySize(re
f910: 61 64 43 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20  adCookie));.    
f920: 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    aOp = sqlite3V
f930: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
f940: 41 72 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f  ArraySize(readCo
f950: 6f 6b 69 65 29 2c 72 65 61 64 43 6f 6f 6b 69 65  okie),readCookie
f960: 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f  ,0);.      if( O
f970: 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53  NLY_IF_REALLOC_S
f980: 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20  TRESS(aOp==0) ) 
f990: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70  break;.      aOp
f9a0: 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20  [0].p1 = iDb;.  
f9b0: 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20      aOp[1].p1 = 
f9c0: 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  iDb;.      aOp[1
f9d0: 5d 2e 70 33 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a  ].p3 = iCookie;.
f9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f9f0: 65 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20 20  eReusable(v);.  
fa00: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
fa10: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
fa20: 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45  E_OMIT_SCHEMA_VE
fa30: 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f  RSION_PRAGMAS */
fa40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fa50: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
fa60: 49 4f 4e 5f 44 49 41 47 53 0a 20 20 2f 2a 0a 20  ION_DIAGS.  /*. 
fa70: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 63 6f 6d   **   PRAGMA com
fa80: 70 69 6c 65 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a  pile_options.  *
fa90: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
faa0: 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63  e names of all c
fab0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
fac0: 6f 6e 73 20 75 73 65 64 20 69 6e 20 74 68 69 73  ons used in this
fad0: 20 62 75 69 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65   build,.  ** one
fae0: 20 6f 70 74 69 6f 6e 20 70 65 72 20 72 6f 77 2e   option per row.
faf0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
fb00: 67 54 79 70 5f 43 4f 4d 50 49 4c 45 5f 4f 50 54  gTyp_COMPILE_OPT
fb10: 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20  IONS: {.    int 
fb20: 69 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  i = 0;.    const
fb30: 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20   char *zOpt;.   
fb40: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
fb50: 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  1;.    while( (z
fb60: 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Opt = sqlite3_co
fb70: 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28  mpileoption_get(
fb80: 69 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  i++))!=0 ){.    
fb90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
fba0: 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 7a 4f  dString(v, 1, zO
fbb0: 70 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pt);.      sqlit
fbc0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fbd0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
fbe0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   1);.    }.    s
fbf0: 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62  qlite3VdbeReusab
fc00: 6c 65 28 76 29 3b 0a 20 20 7d 0a 20 20 62 72 65  le(v);.  }.  bre
fc10: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ak;.#endif /* SQ
fc20: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
fc30: 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f  EOPTION_DIAGS */
fc40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fc50: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 0a 20  _OMIT_WAL.  /*. 
fc60: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
fc70: 68 65 6d 61 2e 5d 77 61 6c 5f 63 68 65 63 6b 70  hema.]wal_checkp
fc80: 6f 69 6e 74 20 3d 20 70 61 73 73 69 76 65 7c 66  oint = passive|f
fc90: 75 6c 6c 7c 72 65 73 74 61 72 74 7c 74 72 75 6e  ull|restart|trun
fca0: 63 61 74 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  cate.  **.  ** C
fcb0: 68 65 63 6b 70 6f 69 6e 74 20 74 68 65 20 64 61  heckpoint the da
fcc0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
fcd0: 61 73 65 20 50 72 61 67 54 79 70 5f 57 41 4c 5f  ase PragTyp_WAL_
fce0: 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20  CHECKPOINT: {.  
fcf0: 20 20 69 6e 74 20 69 42 74 20 3d 20 28 70 49 64    int iBt = (pId
fd00: 32 2d 3e 7a 3f 69 44 62 3a 53 51 4c 49 54 45 5f  2->z?iDb:SQLITE_
fd10: 4d 41 58 5f 41 54 54 41 43 48 45 44 29 3b 0a 20  MAX_ATTACHED);. 
fd20: 20 20 20 69 6e 74 20 65 4d 6f 64 65 20 3d 20 53     int eMode = S
fd30: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
fd40: 5f 50 41 53 53 49 56 45 3b 0a 20 20 20 20 69 66  _PASSIVE;.    if
fd50: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
fd60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
fd70: 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 66 75  ICmp(zRight, "fu
fd80: 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ll")==0 ){.     
fd90: 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54     eMode = SQLIT
fda0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
fdb0: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
fdc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
fdd0: 70 28 7a 52 69 67 68 74 2c 20 22 72 65 73 74 61  p(zRight, "resta
fde0: 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rt")==0 ){.     
fdf0: 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54     eMode = SQLIT
fe00: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
fe10: 54 41 52 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  TART;.      }els
fe20: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
fe30: 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 74 72  ICmp(zRight, "tr
fe40: 75 6e 63 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20  uncate")==0 ){. 
fe50: 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53         eMode = S
fe60: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
fe70: 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 20  _TRUNCATE;.     
fe80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
fe90: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20  rse->nMem = 3;. 
fea0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
feb0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 68 65 63 6b  dOp3(v, OP_Check
fec0: 70 6f 69 6e 74 2c 20 69 42 74 2c 20 65 4d 6f 64  point, iBt, eMod
fed0: 65 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 1);.    sqlit
fee0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fef0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
ff00: 20 33 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b   3);.  }.  break
ff10: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  ;..  /*.  **   P
ff20: 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68  RAGMA wal_autoch
ff30: 65 63 6b 70 6f 69 6e 74 0a 20 20 2a 2a 20 20 20  eckpoint.  **   
ff40: 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63  PRAGMA wal_autoc
ff50: 68 65 63 6b 70 6f 69 6e 74 20 3d 20 4e 0a 20 20  heckpoint = N.  
ff60: 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72  **.  ** Configur
ff70: 65 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  e a database con
ff80: 6e 65 63 74 69 6f 6e 20 74 6f 20 61 75 74 6f 6d  nection to autom
ff90: 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f  atically checkpo
ffa0: 69 6e 74 20 61 20 64 61 74 61 62 61 73 65 0a 20  int a database. 
ffb0: 20 2a 2a 20 61 66 74 65 72 20 61 63 63 75 6d 75   ** after accumu
ffc0: 6c 61 74 69 6e 67 20 4e 20 66 72 61 6d 65 73 20  lating N frames 
ffd0: 69 6e 20 74 68 65 20 6c 6f 67 2e 20 4f 72 20 71  in the log. Or q
ffe0: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 75 72  uery for the cur
fff0: 72 65 6e 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20  rent value.  ** 
10000 6f 66 20 4e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  of N..  */.  cas
10010 65 20 50 72 61 67 54 79 70 5f 57 41 4c 5f 41 55  e PragTyp_WAL_AU
10020 54 4f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a  TOCHECKPOINT: {.
10030 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
10040 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
10050 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
10060 6e 74 28 64 62 2c 20 73 71 6c 69 74 65 33 41 74  nt(db, sqlite3At
10070 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20  oi(zRight));.   
10080 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
10090 67 6c 65 49 6e 74 28 76 2c 20 0a 20 20 20 20 20  gleInt(v, .     
100a0 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61    db->xWalCallba
100b0 63 6b 3d 3d 73 71 6c 69 74 65 33 57 61 6c 44 65  ck==sqlite3WalDe
100c0 66 61 75 6c 74 48 6f 6f 6b 20 3f 20 0a 20 20 20  faultHook ? .   
100d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50          SQLITE_P
100e0 54 52 5f 54 4f 5f 49 4e 54 28 64 62 2d 3e 70 57  TR_TO_INT(db->pW
100f0 61 6c 41 72 67 29 20 3a 20 30 29 3b 0a 20 20 7d  alArg) : 0);.  }
10100 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
10110 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
10120 47 4d 41 20 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72  GMA shrink_memor
10130 79 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  y.  **.  ** IMPL
10140 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
10150 2d 32 33 34 34 35 2d 34 36 31 30 39 20 54 68 69  -23445-46109 Thi
10160 73 20 70 72 61 67 6d 61 20 63 61 75 73 65 73 20  s pragma causes 
10170 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
10180 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20  * connection on 
10190 77 68 69 63 68 20 69 74 20 69 73 20 69 6e 76 6f  which it is invo
101a0 6b 65 64 20 74 6f 20 66 72 65 65 20 75 70 20 61  ked to free up a
101b0 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
101c0 20 69 74 0a 20 20 2a 2a 20 63 61 6e 2c 20 62 79   it.  ** can, by
101d0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
101e0 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
101f0 72 79 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ry()..  */.  cas
10200 65 20 50 72 61 67 54 79 70 5f 53 48 52 49 4e 4b  e PragTyp_SHRINK
10210 5f 4d 45 4d 4f 52 59 3a 20 7b 0a 20 20 20 20 73  _MEMORY: {.    s
10220 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73  qlite3_db_releas
10230 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20  e_memory(db);.  
10240 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
10250 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
10260 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20 20 50  optimize.  **  P
10270 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a 65 28 4d  RAGMA optimize(M
10280 41 53 4b 29 0a 20 20 2a 2a 20 20 50 52 41 47 4d  ASK).  **  PRAGM
10290 41 20 73 63 68 65 6d 61 2e 6f 70 74 69 6d 69 7a  A schema.optimiz
102a0 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73  e.  **  PRAGMA s
102b0 63 68 65 6d 61 2e 6f 70 74 69 6d 69 7a 65 28 4d  chema.optimize(M
102c0 41 53 4b 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ASK).  **.  ** A
102d0 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69  ttempt to optimi
102e0 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ze the database.
102f0 20 20 41 6c 6c 20 73 63 68 65 6d 61 73 20 61 72    All schemas ar
10300 65 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e 20 74  e optimized in t
10310 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77  he first.  ** tw
10320 6f 20 66 6f 72 6d 73 2c 20 61 6e 64 20 6f 6e 6c  o forms, and onl
10330 79 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  y the specified 
10340 73 63 68 65 6d 61 20 69 73 20 6f 70 74 69 6d 69  schema is optimi
10350 7a 65 64 20 69 6e 20 74 68 65 20 6c 61 74 74 65  zed in the latte
10360 72 20 74 77 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  r two..  **.  **
10370 20 54 68 65 20 64 65 74 61 69 6c 73 20 6f 66 20   The details of 
10380 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 70 65  optimizations pe
10390 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
103a0 70 72 61 67 6d 61 20 61 72 65 20 65 78 70 65 63  pragma are expec
103b0 74 65 64 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e  ted.  ** to chan
103c0 67 65 20 61 6e 64 20 69 6d 70 72 6f 76 65 20 6f  ge and improve o
103d0 76 65 72 20 74 69 6d 65 2e 20 20 41 70 70 6c 69  ver time.  Appli
103e0 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 61  cations should a
103f0 6e 74 69 63 69 70 61 74 65 20 74 68 61 74 0a 20  nticipate that. 
10400 20 2a 2a 20 74 68 69 73 20 70 72 61 67 6d 61 20   ** this pragma 
10410 77 69 6c 6c 20 70 65 72 66 6f 72 6d 20 6e 65 77  will perform new
10420 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
10430 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61 73 65  n future release
10440 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
10450 20 6f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65   optional argume
10460 6e 74 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  nt is a bitmask 
10470 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  of optimizations
10480 20 74 6f 20 70 65 72 66 6f 72 6d 3a 0a 20 20 2a   to perform:.  *
10490 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 31  *.  **    0x0001
104a0 20 20 20 20 44 65 62 75 67 67 69 6e 67 20 6d 6f      Debugging mo
104b0 64 65 2e 20 20 44 6f 20 6e 6f 74 20 61 63 74 75  de.  Do not actu
104c0 61 6c 6c 79 20 70 65 72 66 6f 72 6d 20 61 6e 79  ally perform any
104d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 0a 20   optimizations. 
104e0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
104f0 20 62 75 74 20 69 6e 73 74 65 61 64 20 72 65 74   but instead ret
10500 75 72 6e 20 6f 6e 65 20 6c 69 6e 65 20 6f 66 20  urn one line of 
10510 74 65 78 74 20 66 6f 72 20 65 61 63 68 20 6f 70  text for each op
10520 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  timization.  ** 
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
10540 74 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  t would have bee
10550 6e 20 64 6f 6e 65 2e 20 20 4f 66 66 20 62 79 20  n done.  Off by 
10560 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2a 0a 20 20  default..  **.  
10570 2a 2a 20 20 20 20 30 78 30 30 30 32 20 20 20 20  **    0x0002    
10580 52 75 6e 20 41 4e 41 4c 59 5a 45 20 6f 6e 20 74  Run ANALYZE on t
10590 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
105a0 20 62 65 6e 65 66 69 74 2e 20 20 4f 6e 20 62 79   benefit.  On by
105b0 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2a 20 20   default..  **  
105c0 20 20 20 20 20 20 20 20 20 20 20 20 53 65 65 20              See 
105d0 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69  below for additi
105e0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
105f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30  ..  **.  **    0
10600 78 30 30 30 34 20 20 20 20 28 4e 6f 74 20 79 65  x0004    (Not ye
10610 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 20 52  t implemented) R
10620 65 63 6f 72 64 20 75 73 61 67 65 20 61 6e 64 20  ecord usage and 
10630 70 65 72 66 6f 72 6d 61 6e 63 65 20 0a 20 20 2a  performance .  *
10640 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
10650 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
10660 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 73 73  the current sess
10670 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ion in the.  ** 
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
10690 61 62 61 73 65 20 66 69 6c 65 20 73 6f 20 74 68  abase file so th
106a0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 61 76  at it will be av
106b0 61 69 6c 61 62 6c 65 20 74 6f 20 22 6f 70 74 69  ailable to "opti
106c0 6d 69 7a 65 22 0a 20 20 2a 2a 20 20 20 20 20 20  mize".  **      
106d0 20 20 20 20 20 20 20 20 70 72 61 67 6d 61 73 20          pragmas 
106e0 72 75 6e 20 62 79 20 66 75 74 75 72 65 20 64 61  run by future da
106f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10700 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ns..  **.  **   
10710 20 30 78 30 30 30 38 20 20 20 20 28 4e 6f 74 20   0x0008    (Not 
10720 79 65 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29  yet implemented)
10730 20 43 72 65 61 74 65 20 69 6e 64 65 78 65 73 20   Create indexes 
10740 74 68 61 74 20 6d 69 67 68 74 20 68 61 76 65 0a  that might have.
10750 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
10760 20 20 62 65 65 6e 20 68 65 6c 70 66 75 6c 20 74    been helpful t
10770 6f 20 72 65 63 65 6e 74 20 71 75 65 72 69 65 73  o recent queries
10780 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
10790 65 66 61 75 6c 74 20 4d 41 53 4b 20 69 73 20 61  efault MASK is a
107a0 6e 64 20 61 6c 77 61 79 73 20 73 68 61 6c 6c 20  nd always shall 
107b0 62 65 20 30 78 66 66 66 65 2e 20 20 30 78 66 66  be 0xfffe.  0xff
107c0 66 65 20 6d 65 61 6e 73 20 70 65 72 66 6f 72 6d  fe means perform
107d0 20 61 6c 6c 0a 20 20 2a 2a 20 6f 66 20 74 68 65   all.  ** of the
107e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c   optimizations l
107f0 69 73 74 65 64 20 61 62 6f 76 65 20 65 78 63 65  isted above exce
10800 70 74 20 44 65 62 75 67 20 4d 6f 64 65 2c 20 69  pt Debug Mode, i
10810 6e 63 6c 75 64 69 6e 67 20 6e 65 77 0a 20 20 2a  ncluding new.  *
10820 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  * optimizations 
10830 74 68 61 74 20 68 61 76 65 20 6e 6f 74 20 79 65  that have not ye
10840 74 20 62 65 65 6e 20 69 6e 76 65 6e 74 65 64 2e  t been invented.
10850 20 20 49 66 20 6e 65 77 20 6f 70 74 69 6d 69 7a    If new optimiz
10860 61 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20  ations are.  ** 
10870 65 76 65 72 20 61 64 64 65 64 20 74 68 61 74 20  ever added that 
10880 73 68 6f 75 6c 64 20 62 65 20 6f 66 66 20 62 79  should be off by
10890 20 64 65 66 61 75 6c 74 2c 20 74 68 6f 73 65 20   default, those 
108a0 6f 66 66 2d 62 79 2d 64 65 66 61 75 6c 74 20 0a  off-by-default .
108b0 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f    ** optimizatio
108c0 6e 73 20 77 69 6c 6c 20 68 61 76 65 20 62 69 74  ns will have bit
108d0 6d 61 73 6b 73 20 6f 66 20 30 78 31 30 30 30 30  masks of 0x10000
108e0 20 6f 72 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a   or larger..  **
108f0 0a 20 20 2a 2a 20 44 45 54 45 52 4d 49 4e 41 54  .  ** DETERMINAT
10900 49 4f 4e 20 4f 46 20 57 48 45 4e 20 54 4f 20 52  ION OF WHEN TO R
10910 55 4e 20 41 4e 41 4c 59 5a 45 0a 20 20 2a 2a 0a  UN ANALYZE.  **.
10920 20 20 2a 2a 20 49 6e 20 74 68 65 20 63 75 72 72    ** In the curr
10930 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
10940 6f 6e 2c 20 61 20 74 61 62 6c 65 20 69 73 20 61  on, a table is a
10950 6e 61 6c 79 7a 65 64 20 69 66 20 6f 6e 6c 79 20  nalyzed if only 
10960 69 66 20 61 6c 6c 20 6f 66 0a 20 20 2a 2a 20 74  if all of.  ** t
10970 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
10980 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
10990 20 28 31 29 20 4d 41 53 4b 20 62 69 74 20 30 78   (1) MASK bit 0x
109a0 30 32 20 69 73 20 73 65 74 2e 0a 20 20 2a 2a 0a  02 is set..  **.
109b0 20 20 2a 2a 20 28 32 29 20 54 68 65 20 71 75 65    ** (2) The que
109c0 72 79 20 70 6c 61 6e 6e 65 72 20 75 73 65 64 20  ry planner used 
109d0 73 71 6c 69 74 65 5f 73 74 61 74 31 2d 73 74 79  sqlite_stat1-sty
109e0 6c 65 20 73 74 61 74 69 73 74 69 63 73 20 66 6f  le statistics fo
109f0 72 20 6f 6e 65 20 6f 72 0a 20 20 2a 2a 20 20 20  r one or.  **   
10a00 20 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 6f    more indexes o
10a10 66 20 74 68 65 20 74 61 62 6c 65 20 61 74 20 73  f the table at s
10a20 6f 6d 65 20 70 6f 69 6e 74 20 64 75 72 69 6e 67  ome point during
10a30 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
10a40 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20 63 75  .  **     the cu
10a50 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  rrent connection
10a60 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 33 29 20  ..  **.  ** (3) 
10a70 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65  One or more inde
10a80 78 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  xes of the table
10a90 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 75   are currently u
10aa0 6e 61 6e 61 6c 79 7a 65 64 20 4f 52 0a 20 20 2a  nanalyzed OR.  *
10ab0 2a 20 20 20 20 20 74 68 65 20 6e 75 6d 62 65 72  *     the number
10ac0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
10ad0 74 61 62 6c 65 20 68 61 73 20 69 6e 63 72 65 61  table has increa
10ae0 73 65 64 20 62 79 20 32 35 20 74 69 6d 65 73 20  sed by 25 times 
10af0 6f 72 20 6d 6f 72 65 0a 20 20 2a 2a 20 20 20 20  or more.  **    
10b00 20 73 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20   since the last 
10b10 74 69 6d 65 20 41 4e 41 4c 59 5a 45 20 77 61 73  time ANALYZE was
10b20 20 72 75 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   run..  **.  ** 
10b30 54 68 65 20 72 75 6c 65 73 20 66 6f 72 20 77 68  The rules for wh
10b40 65 6e 20 74 61 62 6c 65 73 20 61 72 65 20 61 6e  en tables are an
10b50 61 6c 79 7a 65 64 20 61 72 65 20 6c 69 6b 65 6c  alyzed are likel
10b60 79 20 74 6f 20 63 68 61 6e 67 65 20 69 6e 0a 20  y to change in. 
10b70 20 2a 2a 20 66 75 74 75 72 65 20 72 65 6c 65 61   ** future relea
10b80 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ses..  */.  case
10b90 20 50 72 61 67 54 79 70 5f 4f 50 54 49 4d 49 5a   PragTyp_OPTIMIZ
10ba0 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 44 62  E: {.    int iDb
10bb0 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
10bc0 2f 2a 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  /* Loop terminat
10bd0 69 6f 6e 20 70 6f 69 6e 74 20 66 6f 72 20 74 68  ion point for th
10be0 65 20 73 63 68 65 6d 61 20 6c 6f 6f 70 20 2a 2f  e schema loop */
10bf0 0a 20 20 20 20 69 6e 74 20 69 54 61 62 43 75 72  .    int iTabCur
10c00 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
10c10 75 72 73 6f 72 20 66 6f 72 20 61 20 74 61 62 6c  ursor for a tabl
10c20 65 20 77 68 6f 73 65 20 73 69 7a 65 20 6e 65 65  e whose size nee
10c30 64 73 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ds checking */. 
10c40 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20     HashElem *k; 
10c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
10c60 70 20 6f 76 65 72 20 74 61 62 6c 65 73 20 6f 66  p over tables of
10c70 20 61 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20   a schema */.   
10c80 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
10c90 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ;       /* The c
10ca0 75 72 72 65 6e 74 20 73 63 68 65 6d 61 20 2a 2f  urrent schema */
10cb0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
10cc0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
10cd0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63   table in the sc
10ce0 68 65 6d 61 20 2a 2f 0a 20 20 20 20 49 6e 64 65  hema */.    Inde
10cf0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
10d00 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f     /* An index o
10d10 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
10d20 20 20 20 4c 6f 67 45 73 74 20 73 7a 54 68 72 65     LogEst szThre
10d30 73 68 6f 6c 64 3b 20 20 20 20 2f 2a 20 53 69 7a  shold;    /* Siz
10d40 65 20 74 68 72 65 73 68 6f 6c 64 20 61 62 6f 76  e threshold abov
10d50 65 20 77 68 69 63 68 20 72 65 61 6e 61 6c 79 73  e which reanalys
10d60 69 73 20 69 73 20 6e 65 65 64 64 20 2a 2f 0a 20  is is needd */. 
10d70 20 20 20 63 68 61 72 20 2a 7a 53 75 62 53 71 6c     char *zSubSql
10d80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ;         /* SQL
10d90 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 74   statement for t
10da0 68 65 20 4f 50 5f 53 71 6c 45 78 65 63 20 6f 70  he OP_SqlExec op
10db0 63 6f 64 65 20 2a 2f 0a 20 20 20 20 75 33 32 20  code */.    u32 
10dc0 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  opMask;         
10dd0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6f 70     /* Mask of op
10de0 65 72 61 74 69 6f 6e 73 20 74 6f 20 70 65 72 66  erations to perf
10df0 6f 72 6d 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  orm */..    if( 
10e00 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
10e10 6f 70 4d 61 73 6b 20 3d 20 28 75 33 32 29 73 71  opMask = (u32)sq
10e20 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74  lite3Atoi(zRight
10e30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70  );.      if( (op
10e40 4d 61 73 6b 20 26 20 30 78 30 32 29 3d 3d 30 20  Mask & 0x02)==0 
10e50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c  ) break;.    }el
10e60 73 65 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b  se{.      opMask
10e70 20 3d 20 30 78 66 66 66 65 3b 0a 20 20 20 20 7d   = 0xfffe;.    }
10e80 0a 20 20 20 20 69 54 61 62 43 75 72 20 3d 20 70  .    iTabCur = p
10e90 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
10ea0 20 20 20 66 6f 72 28 69 44 62 4c 61 73 74 20 3d     for(iDbLast =
10eb0 20 7a 44 62 3f 69 44 62 3a 64 62 2d 3e 6e 44 62   zDb?iDb:db->nDb
10ec0 2d 31 3b 20 69 44 62 3c 3d 69 44 62 4c 61 73 74  -1; iDb<=iDbLast
10ed0 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  ; iDb++){.      
10ee0 69 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f 6e  if( iDb==1 ) con
10ef0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c  tinue;.      sql
10f00 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
10f10 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
10f20 29 3b 0a 20 20 20 20 20 20 70 53 63 68 65 6d 61  );.      pSchema
10f30 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
10f40 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 66  pSchema;.      f
10f50 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
10f60 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74  irst(&pSchema->t
10f70 62 6c 48 61 73 68 29 3b 20 6b 3b 20 6b 3d 73 71  blHash); k; k=sq
10f80 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
10f90 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  {.        pTab =
10fa0 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
10fb0 61 73 68 44 61 74 61 28 6b 29 3b 0a 0a 20 20 20  ashData(k);..   
10fc0 20 20 20 20 20 2f 2a 20 49 66 20 74 61 62 6c 65       /* If table
10fd0 20 70 54 61 62 20 68 61 73 20 6e 6f 74 20 62 65   pTab has not be
10fe0 65 6e 20 75 73 65 64 20 69 6e 20 61 20 77 61 79  en used in a way
10ff0 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 6e 65   that would bene
11000 66 69 74 20 66 72 6f 6d 0a 20 20 20 20 20 20 20  fit from.       
11010 20 2a 2a 20 68 61 76 69 6e 67 20 61 6e 61 6c 79   ** having analy
11020 73 69 73 20 73 74 61 74 69 73 74 69 63 73 20 64  sis statistics d
11030 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
11040 74 20 73 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  t session, then 
11050 73 6b 69 70 20 69 74 2e 0a 20 20 20 20 20 20 20  skip it..       
11060 20 2a 2a 20 54 68 69 73 20 61 6c 73 6f 20 68 61   ** This also ha
11070 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
11080 73 6b 69 70 70 69 6e 67 20 76 69 72 74 75 61 6c  skipping virtual
11090 20 74 61 62 6c 65 73 20 61 6e 64 20 76 69 65 77   tables and view
110a0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
110b0 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
110c0 20 26 20 54 46 5f 53 74 61 74 73 55 73 65 64 29   & TF_StatsUsed)
110d0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
110e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 6e  .        /* Rean
110f0 61 6c 79 7a 65 20 69 66 20 74 68 65 20 74 61 62  alyze if the tab
11100 6c 65 20 69 73 20 32 35 20 74 69 6d 65 73 20 6c  le is 25 times l
11110 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c  arger than the l
11120 61 73 74 20 61 6e 61 6c 79 73 69 73 20 2a 2f 0a  ast analysis */.
11130 20 20 20 20 20 20 20 20 73 7a 54 68 72 65 73 68          szThresh
11140 6f 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77  old = pTab->nRow
11150 4c 6f 67 45 73 74 20 2b 20 34 36 3b 20 61 73 73  LogEst + 46; ass
11160 65 72 74 28 20 73 71 6c 69 74 65 33 4c 6f 67 45  ert( sqlite3LogE
11170 73 74 28 32 35 29 3d 3d 34 36 20 29 3b 0a 20 20  st(25)==46 );.  
11180 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
11190 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
111a0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
111b0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
111c0 69 66 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74  if( !pIdx->hasSt
111d0 61 74 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  at1 ){.         
111e0 20 20 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d     szThreshold =
111f0 20 30 3b 20 2f 2a 20 41 6c 77 61 79 73 20 61 6e   0; /* Always an
11200 61 6c 79 7a 65 20 69 66 20 61 6e 79 20 69 6e 64  alyze if any ind
11210 65 78 20 6c 61 63 6b 73 20 73 74 61 74 69 73 74  ex lacks statist
11220 69 63 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ics */.         
11230 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
11250 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 54 68          if( szTh
11260 72 65 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20  reshold ){.     
11270 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
11280 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
11290 61 62 43 75 72 2c 20 69 44 62 2c 20 70 54 61 62  abCur, iDb, pTab
112a0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
112b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
112c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
112d0 50 5f 49 66 53 6d 61 6c 6c 65 72 2c 20 69 54 61  P_IfSmaller, iTa
112e0 62 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20  bCur, .         
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
11310 6e 74 41 64 64 72 28 76 29 2b 32 2b 28 6f 70 4d  ntAddr(v)+2+(opM
11320 61 73 6b 26 31 29 2c 20 73 7a 54 68 72 65 73 68  ask&1), szThresh
11330 6f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  old);.          
11340 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11350 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11360 20 20 20 7a 53 75 62 53 71 6c 20 3d 20 73 71 6c     zSubSql = sql
11370 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
11380 22 41 4e 41 4c 59 5a 45 20 5c 22 25 77 5c 22 2e  "ANALYZE \"%w\".
11390 5c 22 25 77 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%w\"",.       
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113b0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44            db->aD
113c0 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
113d0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
113e0 20 20 20 20 20 20 20 69 66 28 20 6f 70 4d 61 73         if( opMas
113f0 6b 20 26 20 30 78 30 31 20 29 7b 0a 20 20 20 20  k & 0x01 ){.    
11400 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
11410 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
11420 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
11430 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11440 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
11450 6e 67 38 2c 20 30 2c 20 72 31 2c 20 30 2c 20 7a  ng8, 0, r1, 0, z
11460 53 75 62 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d  SubSql, P4_DYNAM
11470 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  IC);.          s
11480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11490 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
114a0 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
114b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
114c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
114d0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 71 6c 45 78  dOp4(v, OP_SqlEx
114e0 65 63 2c 20 30 2c 20 30 2c 20 30 2c 20 7a 53 75  ec, 0, 0, 0, zSu
114f0 62 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43  bSql, P4_DYNAMIC
11500 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11510 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
11520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
11530 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a  (v, OP_Expire);.
11540 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
11550 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
11560 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 0a  MA busy_timeout.
11570 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75    **   PRAGMA bu
11580 73 79 5f 74 69 6d 65 6f 75 74 20 3d 20 4e 0a 20  sy_timeout = N. 
11590 20 2a 2a 0a 20 20 2a 2a 20 43 61 6c 6c 20 73 71   **.  ** Call sq
115a0 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
115b0 75 74 28 64 62 2c 20 4e 29 2e 20 20 52 65 74 75  ut(db, N).  Retu
115c0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  rn the current t
115d0 69 6d 65 6f 75 74 20 76 61 6c 75 65 0a 20 20 2a  imeout value.  *
115e0 2a 20 69 66 20 6f 6e 65 20 69 73 20 73 65 74 2e  * if one is set.
115f0 20 20 49 66 20 6e 6f 20 62 75 73 79 20 68 61 6e    If no busy han
11600 64 6c 65 72 20 6f 72 20 61 20 64 69 66 66 65 72  dler or a differ
11610 65 6e 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ent busy handler
11620 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 74 68 65   is set.  ** the
11630 6e 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  n 0 is returned.
11640 20 20 53 65 74 74 69 6e 67 20 74 68 65 20 62 75    Setting the bu
11650 73 79 5f 74 69 6d 65 6f 75 74 20 74 6f 20 30 20  sy_timeout to 0 
11660 6f 72 20 6e 65 67 61 74 69 76 65 0a 20 20 2a 2a  or negative.  **
11670 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 74 69   disables the ti
11680 6d 65 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  meout..  */.  /*
11690 63 61 73 65 20 50 72 61 67 54 79 70 5f 42 55 53  case PragTyp_BUS
116a0 59 5f 54 49 4d 45 4f 55 54 2a 2f 20 64 65 66 61  Y_TIMEOUT*/ defa
116b0 75 6c 74 3a 20 7b 0a 20 20 20 20 61 73 73 65 72  ult: {.    asser
116c0 74 28 20 70 50 72 61 67 6d 61 2d 3e 65 50 72 61  t( pPragma->ePra
116d0 67 54 79 70 3d 3d 50 72 61 67 54 79 70 5f 42 55  gTyp==PragTyp_BU
116e0 53 59 5f 54 49 4d 45 4f 55 54 20 29 3b 0a 20 20  SY_TIMEOUT );.  
116f0 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
11700 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
11710 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 73  sy_timeout(db, s
11720 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
11730 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  t));.    }.    r
11740 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
11750 2c 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75  , db->busyTimeou
11760 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
11770 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
11780 50 52 41 47 4d 41 20 73 6f 66 74 5f 68 65 61 70  PRAGMA soft_heap
11790 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 20 50 52  _limit.  **   PR
117a0 41 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c  AGMA soft_heap_l
117b0 69 6d 69 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20  imit = N.  **.  
117c0 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
117d0 4e 2d 4f 46 3a 20 52 2d 32 36 33 34 33 2d 34 35  N-OF: R-26343-45
117e0 39 33 30 20 54 68 69 73 20 70 72 61 67 6d 61 20  930 This pragma 
117f0 69 6e 76 6f 6b 65 73 20 74 68 65 0a 20 20 2a 2a  invokes the.  **
11800 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
11810 61 70 5f 6c 69 6d 69 74 36 34 28 29 20 69 6e 74  ap_limit64() int
11820 65 72 66 61 63 65 20 77 69 74 68 20 74 68 65 20  erface with the 
11830 61 72 67 75 6d 65 6e 74 20 4e 2c 20 69 66 20 4e  argument N, if N
11840 20 69 73 0a 20 20 2a 2a 20 73 70 65 63 69 66 69   is.  ** specifi
11850 65 64 20 61 6e 64 20 69 73 20 61 20 6e 6f 6e 2d  ed and is a non-
11860 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
11870 2e 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  ..  ** IMPLEMENT
11880 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36 34 34 35  ATION-OF: R-6445
11890 31 2d 30 37 31 36 33 20 54 68 65 20 73 6f 66 74  1-07163 The soft
118a0 5f 68 65 61 70 5f 6c 69 6d 69 74 20 70 72 61 67  _heap_limit prag
118b0 6d 61 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 72  ma always.  ** r
118c0 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20  eturns the same 
118d0 69 6e 74 65 67 65 72 20 74 68 61 74 20 77 6f 75  integer that wou
118e0 6c 64 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ld be returned b
118f0 79 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  y the.  ** sqlit
11900 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
11910 69 74 36 34 28 2d 31 29 20 43 2d 6c 61 6e 67 75  it64(-1) C-langu
11920 61 67 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  age function..  
11930 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
11940 70 5f 53 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49  p_SOFT_HEAP_LIMI
11950 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T: {.    sqlite3
11960 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66  _int64 N;.    if
11970 28 20 7a 52 69 67 68 74 20 26 26 20 73 71 6c 69  ( zRight && sqli
11980 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34  te3DecOrHexToI64
11990 28 7a 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51  (zRight, &N)==SQ
119a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
119b0 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
119c0 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20  ap_limit64(N);. 
119d0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
119e0 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69  ingleInt(v, sqli
119f0 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  te3_soft_heap_li
11a00 6d 69 74 36 34 28 2d 31 29 29 3b 0a 20 20 20 20  mit64(-1));.    
11a10 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
11a20 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
11a30 68 72 65 61 64 73 0a 20 20 2a 2a 20 20 20 50 52  hreads.  **   PR
11a40 41 47 4d 41 20 74 68 72 65 61 64 73 20 3d 20 4e  AGMA threads = N
11a50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69  .  **.  ** Confi
11a60 67 75 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  gure the maximum
11a70 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 65   number of worke
11a80 72 20 74 68 72 65 61 64 73 2e 20 20 52 65 74 75  r threads.  Retu
11a90 72 6e 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  rn the new.  ** 
11aa0 6d 61 78 69 6d 75 6d 2c 20 77 68 69 63 68 20 6d  maximum, which m
11ab0 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
11ac0 6e 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  n requested..  *
11ad0 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
11ae0 5f 54 48 52 45 41 44 53 3a 20 7b 0a 20 20 20 20  _THREADS: {.    
11af0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b  sqlite3_int64 N;
11b00 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 0a  .    if( zRight.
11b10 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 44       && sqlite3D
11b20 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69  ecOrHexToI64(zRi
11b30 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45  ght, &N)==SQLITE
11b40 5f 4f 4b 0a 20 20 20 20 20 26 26 20 4e 3e 3d 30  _OK.     && N>=0
11b50 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
11b60 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20  lite3_limit(db, 
11b70 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
11b80 4b 45 52 5f 54 48 52 45 41 44 53 2c 20 28 69 6e  KER_THREADS, (in
11b90 74 29 28 4e 26 30 78 37 66 66 66 66 66 66 66 29  t)(N&0x7fffffff)
11ba0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
11bb0 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
11bc0 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62  sqlite3_limit(db
11bd0 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  , SQLITE_LIMIT_W
11be0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 20 2d  ORKER_THREADS, -
11bf0 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  1));.    break;.
11c00 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
11c10 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
11c20 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
11c30 5f 54 45 53 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a  _TEST).  /*.  **
11c40 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
11c50 65 6e 74 20 73 74 61 74 65 20 6f 66 20 66 69 6c  ent state of fil
11c60 65 20 6c 6f 67 73 20 66 6f 72 20 61 6c 6c 20 64  e logs for all d
11c70 61 74 61 62 61 73 65 73 0a 20 20 2a 2f 0a 20 20  atabases.  */.  
11c80 63 61 73 65 20 50 72 61 67 54 79 70 5f 4c 4f 43  case PragTyp_LOC
11c90 4b 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  K_STATUS: {.    
11ca0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
11cb0 72 20 2a 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e  r *const azLockN
11cc0 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ame[] = {.      
11cd0 22 75 6e 6c 6f 63 6b 65 64 22 2c 20 22 73 68 61  "unlocked", "sha
11ce0 72 65 64 22 2c 20 22 72 65 73 65 72 76 65 64 22  red", "reserved"
11cf0 2c 20 22 70 65 6e 64 69 6e 67 22 2c 20 22 65 78  , "pending", "ex
11d00 63 6c 75 73 69 76 65 22 0a 20 20 20 20 7d 3b 0a  clusive".    };.
11d10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70      int i;.    p
11d20 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b  Parse->nMem = 2;
11d30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11d40 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
11d50 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b       Btree *pBt;
11d60 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
11d70 72 20 2a 7a 53 74 61 74 65 20 3d 20 22 75 6e 6b  r *zState = "unk
11d80 6e 6f 77 6e 22 3b 0a 20 20 20 20 20 20 69 6e 74  nown";.      int
11d90 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62   j;.      if( db
11da0 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
11db0 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e==0 ) continue;
11dc0 0a 20 20 20 20 20 20 70 42 74 20 3d 20 64 62 2d  .      pBt = db-
11dd0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
11de0 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 7c 7c     if( pBt==0 ||
11df0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
11e00 65 72 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  er(pBt)==0 ){.  
11e10 20 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20 22        zState = "
11e20 63 6c 6f 73 65 64 22 3b 0a 20 20 20 20 20 20 7d  closed";.      }
11e30 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
11e40 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
11e50 2c 20 69 20 3f 20 64 62 2d 3e 61 44 62 5b 69 5d  , i ? db->aDb[i]
11e60 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 30 2c 20 0a  .zDbSName : 0, .
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e90 20 20 20 20 20 53 51 4c 49 54 45 5f 46 43 4e 54       SQLITE_FCNT
11ea0 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26 6a 29  L_LOCKSTATE, &j)
11eb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11ec0 20 20 20 20 20 20 20 20 7a 53 74 61 74 65 20 3d          zState =
11ed0 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a   azLockName[j];.
11ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
11ef0 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
11f00 61 64 28 76 2c 20 31 2c 20 22 73 73 22 2c 20 64  ad(v, 1, "ss", d
11f10 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
11f20 6d 65 2c 20 7a 53 74 61 74 65 29 3b 0a 20 20 20  me, zState);.   
11f30 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
11f40 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
11f50 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
11f60 43 0a 20 20 2f 2a 20 50 72 61 67 6d 61 20 20 20  C.  /* Pragma   
11f70 20 20 20 20 20 69 41 72 67 0a 20 20 2a 2a 20 2d       iArg.  ** -
11f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 2d 2d 2d 2d  ---------   ----
11f90 2d 2d 0a 20 20 2a 2a 20 20 6b 65 79 20 20 20 20  --.  **  key    
11fa0 20 20 20 20 20 20 20 30 0a 20 20 2a 2a 20 20 72         0.  **  r
11fb0 65 6b 65 79 20 20 20 20 20 20 20 20 20 31 0a 20  ekey         1. 
11fc0 20 2a 2a 20 20 68 65 78 6b 65 79 20 20 20 20 20   **  hexkey     
11fd0 20 20 20 32 0a 20 20 2a 2a 20 20 68 65 78 72 65     2.  **  hexre
11fe0 6b 65 79 20 20 20 20 20 20 33 0a 20 20 2a 2a 20  key      3.  ** 
11ff0 20 74 65 78 74 6b 65 79 20 20 20 20 20 20 20 34   textkey       4
12000 0a 20 20 2a 2a 20 20 74 65 78 74 72 65 6b 65 79  .  **  textrekey
12010 20 20 20 20 20 35 0a 20 20 2a 2f 0a 20 20 63 61       5.  */.  ca
12020 73 65 20 50 72 61 67 54 79 70 5f 4b 45 59 3a 20  se PragTyp_KEY: 
12030 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
12040 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
12050 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3c  = pPragma->iArg<
12060 34 20 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65  4 ? sqlite3Strle
12070 6e 33 30 28 7a 52 69 67 68 74 29 20 3a 20 2d 31  n30(zRight) : -1
12080 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 72  ;.      if( (pPr
12090 61 67 6d 61 2d 3e 69 41 72 67 20 26 20 31 29 3d  agma->iArg & 1)=
120a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
120b0 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c  lite3_key_v2(db,
120c0 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c 20 6e 29   zDb, zRight, n)
120d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
120e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
120f0 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  ekey_v2(db, zDb,
12100 20 7a 52 69 67 68 74 2c 20 6e 29 3b 0a 20 20 20   zRight, n);.   
12110 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
12120 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65  reak;.  }.  case
12130 20 50 72 61 67 54 79 70 5f 48 45 58 4b 45 59 3a   PragTyp_HEXKEY:
12140 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
12150 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20 69 42  t ){.      u8 iB
12160 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  yte;.      int i
12170 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4b 65  ;.      char zKe
12180 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72  y[40];.      for
12190 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20 69  (i=0, iByte=0; i
121a0 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29 2a 32 20  <sizeof(zKey)*2 
121b0 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
121c0 69 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 20 69  it(zRight[i]); i
121d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 42 79  ++){.        iBy
121e0 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29 20  te = (iByte<<4) 
121f0 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e  + sqlite3HexToIn
12200 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 0a 20 20  t(zRight[i]);.  
12210 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29 21        if( (i&1)!
12220 3d 30 20 29 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d  =0 ) zKey[i/2] =
12230 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a   iByte;.      }.
12240 20 20 20 20 20 20 69 66 28 20 28 70 50 72 61 67        if( (pPrag
12250 6d 61 2d 3e 69 41 72 67 20 26 20 31 29 3d 3d 30  ma->iArg & 1)==0
12260 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12270 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a  te3_key_v2(db, z
12280 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a  Db, zKey, i/2);.
12290 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
122a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6b       sqlite3_rek
122b0 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
122c0 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20  Key, i/2);.     
122d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
122e0 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ak;.  }.#endif.#
122f0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
12300 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20  E_HAS_CODEC) || 
12310 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
12320 4e 41 42 4c 45 5f 43 45 52 4f 44 29 0a 20 20 63  NABLE_CEROD).  c
12330 61 73 65 20 50 72 61 67 54 79 70 5f 41 43 54 49  ase PragTyp_ACTI
12340 56 41 54 45 5f 45 58 54 45 4e 53 49 4f 4e 53 3a  VATE_EXTENSIONS:
12350 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 23   if( zRight ){.#
12360 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
12370 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 73  _CODEC.    if( s
12380 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
12390 52 69 67 68 74 2c 20 22 73 65 65 2d 22 2c 20 34  Right, "see-", 4
123a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
123b0 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f 73  lite3_activate_s
123c0 65 65 28 26 7a 52 69 67 68 74 5b 34 5d 29 3b 0a  ee(&zRight[4]);.
123d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
123e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
123f0 45 5f 43 45 52 4f 44 0a 20 20 20 20 69 66 28 20  E_CEROD.    if( 
12400 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
12410 7a 52 69 67 68 74 2c 20 22 63 65 72 6f 64 2d 22  zRight, "cerod-"
12420 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 6)==0 ){.     
12430 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74   sqlite3_activat
12440 65 5f 63 65 72 6f 64 28 26 7a 52 69 67 68 74 5b  e_cerod(&zRight[
12450 36 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  6]);.    }.#endi
12460 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  f.  }.  break;.#
12470 65 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a 20 45 6e  endif..  } /* En
12480 64 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  d of the PRAGMA 
12490 73 77 69 74 63 68 20 2a 2f 0a 0a 20 20 2f 2a 20  switch */..  /* 
124a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
124b0 6f 63 6b 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ock is a no-op u
124c0 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42  nless SQLITE_DEB
124d0 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 20 49  UG is defined. I
124e0 74 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 75 72  ts only.  ** pur
124f0 70 6f 73 65 20 69 73 20 74 6f 20 65 78 65 63 75  pose is to execu
12500 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  te assert() stat
12510 65 6d 65 6e 74 73 20 74 6f 20 76 65 72 69 66 79  ements to verify
12520 20 74 68 61 74 20 69 66 20 74 68 65 0a 20 20 2a   that if the.  *
12530 2a 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75  * PragFlg_NoColu
12540 6d 6e 73 31 20 66 6c 61 67 20 69 73 20 73 65 74  mns1 flag is set
12550 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
12560 73 70 65 63 69 66 69 65 64 20 61 6e 20 61 72 67  specified an arg
12570 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 74 68  ument.  ** to th
12580 65 20 50 52 41 47 4d 41 2c 20 74 68 65 20 69 6d  e PRAGMA, the im
12590 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 68 61 73  plementation has
125a0 20 6e 6f 74 20 61 64 64 65 64 20 61 6e 79 20 4f   not added any O
125b0 50 5f 52 65 73 75 6c 74 52 6f 77 20 0a 20 20 2a  P_ResultRow .  *
125c0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74  * instructions t
125d0 6f 20 74 68 65 20 56 4d 2e 20 20 2a 2f 0a 20 20  o the VM.  */.  
125e0 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50  if( (pPragma->mP
125f0 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67  ragFlg & PragFlg
12600 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 20 26 26 20  _NoColumns1) && 
12610 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  zRight ){.    sq
12620 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
12630 6f 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20  oResultRow(v);. 
12640 20 7d 0a 0a 70 72 61 67 6d 61 5f 6f 75 74 3a 0a   }..pragma_out:.
12650 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12660 64 62 2c 20 7a 4c 65 66 74 29 3b 0a 20 20 73 71  db, zLeft);.  sq
12670 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12680 7a 52 69 67 68 74 29 3b 0a 7d 0a 23 69 66 6e 64  zRight);.}.#ifnd
12690 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
126a0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a  IRTUALTABLE./***
126b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d  **********.** Im
12700 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
12710 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  an eponymous vir
12720 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
12730 72 75 6e 73 20 61 20 70 72 61 67 6d 61 2e 0a 2a  runs a pragma..*
12740 2a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  *.*/.typedef str
12750 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 50  uct PragmaVtab P
12760 72 61 67 6d 61 56 74 61 62 3b 0a 74 79 70 65 64  ragmaVtab;.typed
12770 65 66 20 73 74 72 75 63 74 20 50 72 61 67 6d 61  ef struct Pragma
12780 56 74 61 62 43 75 72 73 6f 72 20 50 72 61 67 6d  VtabCursor Pragm
12790 61 56 74 61 62 43 75 72 73 6f 72 3b 0a 73 74 72  aVtabCursor;.str
127a0 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 7b  uct PragmaVtab {
127b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
127c0 62 61 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  base;        /* 
127d0 42 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73  Base class.  Mus
127e0 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  t be first */.  
127f0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
12800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12810 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
12820 74 69 6f 6e 20 74 6f 20 77 68 69 63 68 20 69 74  tion to which it
12830 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63 6f   belongs */.  co
12840 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a  nst PragmaName *
12850 70 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  pName;  /* Name 
12860 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 2a 2f  of the pragma */
12870 0a 20 20 75 38 20 6e 48 69 64 64 65 6e 3b 20 20  .  u8 nHidden;  
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12890 4e 75 6d 62 65 72 20 6f 66 20 68 69 64 64 65 6e  Number of hidden
128a0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
128b0 20 69 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20   iHidden;       
128c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
128d0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 68 69   of the first hi
128e0 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d  dden column */.}
128f0 3b 0a 73 74 72 75 63 74 20 50 72 61 67 6d 61 56  ;.struct PragmaV
12900 74 61 62 43 75 72 73 6f 72 20 7b 0a 20 20 73 71  tabCursor {.  sq
12910 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
12920 72 20 62 61 73 65 3b 20 2f 2a 20 42 61 73 65 20  r base; /* Base 
12930 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20  class.  Must be 
12940 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74  first */.  sqlit
12950 65 33 5f 73 74 6d 74 20 2a 70 50 72 61 67 6d 61  e3_stmt *pPragma
12960 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 72 61 67  ;    /* The prag
12970 6d 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ma statement to 
12980 72 75 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f  run */.  sqlite_
12990 69 6e 74 36 34 20 69 52 6f 77 69 64 3b 20 20 20  int64 iRowid;   
129a0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f     /* Current ro
129b0 77 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  wid */.  char *a
129c0 7a 41 72 67 5b 32 5d 3b 20 20 20 20 20 20 20 20  zArg[2];        
129d0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74     /* Value of t
129e0 68 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  he argument and 
129f0 73 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  schema */.};../*
12a00 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74   .** Pragma virt
12a10 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
12a20 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64   xConnect method
12a30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12a40 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63  pragmaVtabConnec
12a50 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
12a60 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a  ,.  void *pAux,.
12a70 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73    int argc, cons
12a80 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72  t char *const*ar
12a90 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  gv,.  sqlite3_vt
12aa0 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63  ab **ppVtab,.  c
12ab0 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
12ac0 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d   const PragmaNam
12ad0 65 20 2a 70 50 72 61 67 6d 61 20 3d 20 28 63 6f  e *pPragma = (co
12ae0 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 2a 29  nst PragmaName*)
12af0 70 41 75 78 3b 0a 20 20 50 72 61 67 6d 61 56 74  pAux;.  PragmaVt
12b00 61 62 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  ab *pTab = 0;.  
12b10 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c  int rc;.  int i,
12b20 20 6a 3b 0a 20 20 63 68 61 72 20 63 53 65 70 20   j;.  char cSep 
12b30 3d 20 27 28 27 3b 0a 20 20 53 74 72 41 63 63 75  = '(';.  StrAccu
12b40 6d 20 61 63 63 3b 0a 20 20 63 68 61 72 20 7a 42  m acc;.  char zB
12b50 75 66 5b 32 30 30 5d 3b 0a 0a 20 20 55 4e 55 53  uf[200];..  UNUS
12b60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
12b70 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
12b80 41 4d 45 54 45 52 28 61 72 67 76 29 3b 0a 20 20  AMETER(argv);.  
12b90 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
12ba0 6e 69 74 28 26 61 63 63 2c 20 30 2c 20 7a 42 75  nit(&acc, 0, zBu
12bb0 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  f, sizeof(zBuf),
12bc0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   0);.  sqlite3_s
12bd0 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63  tr_appendall(&ac
12be0 63 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  c, "CREATE TABLE
12bf0 20 78 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   x");.  for(i=0,
12c00 20 6a 3d 70 50 72 61 67 6d 61 2d 3e 69 50 72 61   j=pPragma->iPra
12c10 67 43 4e 61 6d 65 3b 20 69 3c 70 50 72 61 67 6d  gCName; i<pPragm
12c20 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 3b 20 69  a->nPragCName; i
12c30 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 71  ++, j++){.    sq
12c40 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
12c50 66 28 26 61 63 63 2c 20 22 25 63 5c 22 25 73 5c  f(&acc, "%c\"%s\
12c60 22 22 2c 20 63 53 65 70 2c 20 70 72 61 67 43 4e  "", cSep, pragCN
12c70 61 6d 65 5b 6a 5d 29 3b 0a 20 20 20 20 63 53 65  ame[j]);.    cSe
12c80 70 20 3d 20 27 2c 27 3b 0a 20 20 7d 0a 20 20 69  p = ',';.  }.  i
12c90 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( i==0 ){.    s
12ca0 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
12cb0 64 66 28 26 61 63 63 2c 20 22 28 5c 22 25 73 5c  df(&acc, "(\"%s\
12cc0 22 22 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61  "", pPragma->zNa
12cd0 6d 65 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  me);.    i++;.  
12ce0 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 69 66 28  }.  j = 0;.  if(
12cf0 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46   pPragma->mPragF
12d00 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65 73  lg & PragFlg_Res
12d10 75 6c 74 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  ult1 ){.    sqli
12d20 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c  te3_str_appendal
12d30 6c 28 26 61 63 63 2c 20 22 2c 61 72 67 20 48 49  l(&acc, ",arg HI
12d40 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b  DDEN");.    j++;
12d50 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 61 67  .  }.  if( pPrag
12d60 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 28  ma->mPragFlg & (
12d70 50 72 61 67 46 6c 67 5f 53 63 68 65 6d 61 4f 70  PragFlg_SchemaOp
12d80 74 7c 50 72 61 67 46 6c 67 5f 53 63 68 65 6d 61  t|PragFlg_Schema
12d90 52 65 71 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Req) ){.    sqli
12da0 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c  te3_str_appendal
12db0 6c 28 26 61 63 63 2c 20 22 2c 73 63 68 65 6d 61  l(&acc, ",schema
12dc0 20 48 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a   HIDDEN");.    j
12dd0 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ++;.  }.  sqlite
12de0 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 61 63  3_str_append(&ac
12df0 63 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 73 71  c, ")", 1);.  sq
12e00 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
12e10 69 73 68 28 26 61 63 63 29 3b 0a 20 20 61 73 73  ish(&acc);.  ass
12e20 65 72 74 28 20 73 74 72 6c 65 6e 28 7a 42 75 66  ert( strlen(zBuf
12e30 29 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29  ) < sizeof(zBuf)
12e40 2d 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  -1 );.  rc = sql
12e50 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
12e60 62 28 64 62 2c 20 7a 42 75 66 29 3b 0a 20 20 69  b(db, zBuf);.  i
12e70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12e80 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 28   ){.    pTab = (
12e90 50 72 61 67 6d 61 56 74 61 62 2a 29 73 71 6c 69  PragmaVtab*)sqli
12ea0 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
12eb0 66 28 50 72 61 67 6d 61 56 74 61 62 29 29 3b 0a  f(PragmaVtab));.
12ec0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
12ed0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
12ee0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
12ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
12f00 73 65 74 28 70 54 61 62 2c 20 30 2c 20 73 69 7a  set(pTab, 0, siz
12f10 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29 29  eof(PragmaVtab))
12f20 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 4e  ;.      pTab->pN
12f30 61 6d 65 20 3d 20 70 50 72 61 67 6d 61 3b 0a 20  ame = pPragma;. 
12f40 20 20 20 20 20 70 54 61 62 2d 3e 64 62 20 3d 20       pTab->db = 
12f50 64 62 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  db;.      pTab->
12f60 69 48 69 64 64 65 6e 20 3d 20 69 3b 0a 20 20 20  iHidden = i;.   
12f70 20 20 20 70 54 61 62 2d 3e 6e 48 69 64 64 65 6e     pTab->nHidden
12f80 20 3d 20 6a 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = j;.    }.  }e
12f90 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20  lse{.    *pzErr 
12fa0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
12fb0 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
12fc0 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
12fd0 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73  ..  *ppVtab = (s
12fe0 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 54 61  qlite3_vtab*)pTa
12ff0 62 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  b;.  return rc;.
13000 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61  }../* .** Pragma
13010 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
13020 6f 64 75 6c 65 20 78 44 69 73 63 6f 6e 6e 65 63  odule xDisconnec
13030 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  t method..*/.sta
13040 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
13050 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c  abDisconnect(sql
13060 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
13070 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  ){.  PragmaVtab 
13080 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56  *pTab = (PragmaV
13090 74 61 62 2a 29 70 56 74 61 62 3b 0a 20 20 73 71  tab*)pVtab;.  sq
130a0 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 29  lite3_free(pTab)
130b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
130c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 46 69 67 75  E_OK;.}../* Figu
130d0 72 65 20 6f 75 74 20 74 68 65 20 62 65 73 74 20  re out the best 
130e0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 74 6f 20  index to use to 
130f0 73 65 61 72 63 68 20 61 20 70 72 61 67 6d 61 20  search a pragma 
13100 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
13110 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
13120 6f 74 20 72 65 61 6c 6c 79 20 61 6e 79 20 69 6e  ot really any in
13130 64 65 78 20 63 68 6f 69 63 65 73 2e 20 20 42 75  dex choices.  Bu
13140 74 20 77 65 20 77 61 6e 74 20 74 6f 20 65 6e 63  t we want to enc
13150 6f 75 72 61 67 65 20 74 68 65 0a 2a 2a 20 71 75  ourage the.** qu
13160 65 72 79 20 70 6c 61 6e 6e 65 72 20 74 6f 20 67  ery planner to g
13170 69 76 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ive == constrain
13180 74 73 20 6f 6e 20 61 73 20 6d 61 6e 79 20 68 69  ts on as many hi
13190 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20  dden parameters 
131a0 61 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20  as.** possible, 
131b0 61 6e 64 20 65 73 70 65 63 69 61 6c 6c 79 20 6f  and especially o
131c0 6e 20 74 68 65 20 66 69 72 73 74 20 68 69 64 64  n the first hidd
131d0 65 6e 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  en parameter.  S
131e0 6f 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 68 69  o return a.** hi
131f0 67 68 20 63 6f 73 74 20 69 66 20 68 69 64 64 65  gh cost if hidde
13200 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  n parameters are
13210 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2e 0a   unconstrained..
13220 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
13230 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65  agmaVtabBestInde
13240 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  x(sqlite3_vtab *
13250 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  tab, sqlite3_ind
13260 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
13270 6f 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  o){.  PragmaVtab
13280 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61   *pTab = (Pragma
13290 56 74 61 62 2a 29 74 61 62 3b 0a 20 20 63 6f 6e  Vtab*)tab;.  con
132a0 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  st struct sqlite
132b0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
132c0 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b  nt *pConstraint;
132d0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
132e0 6e 74 20 73 65 65 6e 5b 32 5d 3b 0a 0a 20 20 70  nt seen[2];..  p
132f0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
13300 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65  edCost = (double
13310 29 31 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  )1;.  if( pTab->
13320 6e 48 69 64 64 65 6e 3d 3d 30 20 29 7b 20 72 65  nHidden==0 ){ re
13330 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
13340 7d 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e 74 20  }.  pConstraint 
13350 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
13360 73 74 72 61 69 6e 74 3b 0a 20 20 73 65 65 6e 5b  straint;.  seen[
13370 30 5d 20 3d 20 30 3b 0a 20 20 73 65 65 6e 5b 31  0] = 0;.  seen[1
13380 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  ] = 0;.  for(i=0
13390 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ; i<pIdxInfo->nC
133a0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
133b0 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a  pConstraint++){.
133c0 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61      if( pConstra
133d0 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29  int->usable==0 )
133e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
133f0 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  f( pConstraint->
13400 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op!=SQLITE_INDEX
13410 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
13420 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
13430 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  f( pConstraint->
13440 69 43 6f 6c 75 6d 6e 20 3c 20 70 54 61 62 2d 3e  iColumn < pTab->
13450 69 48 69 64 64 65 6e 20 29 20 63 6f 6e 74 69 6e  iHidden ) contin
13460 75 65 3b 0a 20 20 20 20 6a 20 3d 20 70 43 6f 6e  ue;.    j = pCon
13470 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e  straint->iColumn
13480 20 2d 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e   - pTab->iHidden
13490 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 20  ;.    assert( j 
134a0 3c 20 32 20 29 3b 0a 20 20 20 20 73 65 65 6e 5b  < 2 );.    seen[
134b0 6a 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a 20 20  j] = i+1;.  }.  
134c0 69 66 28 20 73 65 65 6e 5b 30 5d 3d 3d 30 20 29  if( seen[0]==0 )
134d0 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
134e0 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
134f0 28 64 6f 75 62 6c 65 29 32 31 34 37 34 38 33 36  (double)21474836
13500 34 37 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  47;.    pIdxInfo
13510 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
13520 3d 20 32 31 34 37 34 38 33 36 34 37 3b 0a 20 20  = 2147483647;.  
13530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13540 4f 4b 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20 73 65  OK;.  }.  j = se
13550 65 6e 5b 30 5d 2d 31 3b 0a 20 20 70 49 64 78 49  en[0]-1;.  pIdxI
13560 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
13570 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64  Usage[j].argvInd
13580 65 78 20 3d 20 31 3b 0a 20 20 70 49 64 78 49 6e  ex = 1;.  pIdxIn
13590 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
135a0 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31  sage[j].omit = 1
135b0 3b 0a 20 20 69 66 28 20 73 65 65 6e 5b 31 5d 3d  ;.  if( seen[1]=
135c0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
135d0 54 45 5f 4f 4b 3b 0a 20 20 70 49 64 78 49 6e 66  TE_OK;.  pIdxInf
135e0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
135f0 20 3d 20 28 64 6f 75 62 6c 65 29 32 30 3b 0a 20   = (double)20;. 
13600 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
13610 61 74 65 64 52 6f 77 73 20 3d 20 32 30 3b 0a 20  atedRows = 20;. 
13620 20 6a 20 3d 20 73 65 65 6e 5b 31 5d 2d 31 3b 0a   j = seen[1]-1;.
13630 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
13640 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e  straintUsage[j].
13650 61 72 67 76 49 6e 64 65 78 20 3d 20 32 3b 0a 20  argvIndex = 2;. 
13660 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
13670 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f  traintUsage[j].o
13680 6d 69 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  mit = 1;.  retur
13690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
136a0 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
136b0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 70  cursor for the p
136c0 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
136d0 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ble */.static in
136e0 74 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e  t pragmaVtabOpen
136f0 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
13700 56 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74  Vtab, sqlite3_vt
13710 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75  ab_cursor **ppCu
13720 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56  rsor){.  PragmaV
13730 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 3b  tabCursor *pCsr;
13740 0a 20 20 70 43 73 72 20 3d 20 28 50 72 61 67 6d  .  pCsr = (Pragm
13750 61 56 74 61 62 43 75 72 73 6f 72 2a 29 73 71 6c  aVtabCursor*)sql
13760 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
13770 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20 20 69 66  of(*pCsr));.  if
13780 28 20 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75  ( pCsr==0 ) retu
13790 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
137a0 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20  .  memset(pCsr, 
137b0 30 2c 20 73 69 7a 65 6f 66 28 50 72 61 67 6d 61  0, sizeof(Pragma
137c0 56 74 61 62 43 75 72 73 6f 72 29 29 3b 0a 20 20  VtabCursor));.  
137d0 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
137e0 20 3d 20 70 56 74 61 62 3b 0a 20 20 2a 70 70 43   = pVtab;.  *ppC
137f0 75 72 73 6f 72 20 3d 20 26 70 43 73 72 2d 3e 62  ursor = &pCsr->b
13800 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ase;.  return SQ
13810 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43  LITE_OK;.}../* C
13820 6c 65 61 72 20 61 6c 6c 20 63 6f 6e 74 65 6e 74  lear all content
13830 20 66 72 6f 6d 20 70 72 61 67 6d 61 20 76 69 72   from pragma vir
13840 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f  tual table curso
13850 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r. */.static voi
13860 64 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73  d pragmaVtabCurs
13870 6f 72 43 6c 65 61 72 28 50 72 61 67 6d 61 56 74  orClear(PragmaVt
13880 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b  abCursor *pCsr){
13890 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
138a0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73  te3_finalize(pCs
138b0 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20 20 70  r->pPragma);.  p
138c0 43 73 72 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30  Csr->pPragma = 0
138d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
138e0 72 72 61 79 53 69 7a 65 28 70 43 73 72 2d 3e 61  rraySize(pCsr->a
138f0 7a 41 72 67 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  zArg); i++){.   
13900 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
13910 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  sr->azArg[i]);. 
13920 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69     pCsr->azArg[i
13930 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ] = 0;.  }.}../*
13940 20 43 6c 6f 73 65 20 61 20 70 72 61 67 6d 61 20   Close a pragma 
13950 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
13960 72 73 6f 72 20 2a 2f 0a 73 74 61 74 69 63 20 69  rsor */.static i
13970 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43 6c 6f  nt pragmaVtabClo
13980 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  se(sqlite3_vtab_
13990 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
139a0 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
139b0 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61   *pCsr = (Pragma
139c0 56 74 61 62 43 75 72 73 6f 72 2a 29 63 75 72 3b  VtabCursor*)cur;
139d0 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72  .  pragmaVtabCur
139e0 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a  sorClear(pCsr);.
139f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13a00 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Csr);.  return S
13a10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
13a20 41 64 76 61 6e 63 65 20 74 68 65 20 70 72 61 67  Advance the prag
13a30 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
13a40 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
13a50 65 78 74 20 72 6f 77 20 2a 2f 0a 73 74 61 74 69  ext row */.stati
13a60 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
13a70 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61  Next(sqlite3_vta
13a80 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
13a90 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61  ursor){.  Pragma
13aa0 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
13ab0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
13ac0 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
13ad0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
13ae0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
13af0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 78 52 6f  ncrement the xRo
13b00 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 70  wid value */.  p
13b10 43 73 72 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20  Csr->iRowid++;. 
13b20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70   assert( pCsr->p
13b30 50 72 61 67 6d 61 20 29 3b 0a 20 20 69 66 28 20  Pragma );.  if( 
13b40 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c 69  SQLITE_ROW!=sqli
13b50 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d 3e 70  te3_step(pCsr->p
13b60 50 72 61 67 6d 61 29 20 29 7b 0a 20 20 20 20 72  Pragma) ){.    r
13b70 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
13b80 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72 61 67  lize(pCsr->pPrag
13b90 6d 61 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70  ma);.    pCsr->p
13ba0 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Pragma = 0;.    
13bb0 70 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  pragmaVtabCursor
13bc0 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20 7d  Clear(pCsr);.  }
13bd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13be0 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ./* .** Pragma v
13bf0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
13c00 75 6c 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68  ule xFilter meth
13c10 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
13c20 74 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74  t pragmaVtabFilt
13c30 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  er(.  sqlite3_vt
13c40 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
13c50 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69  Cursor, .  int i
13c60 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61  dxNum, const cha
13c70 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74  r *idxStr,.  int
13c80 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
13c90 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
13ca0 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   PragmaVtabCurso
13cb0 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d  r *pCsr = (Pragm
13cc0 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74  aVtabCursor*)pVt
13cd0 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72 61 67  abCursor;.  Prag
13ce0 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28  maVtab *pTab = (
13cf0 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70 56 74  PragmaVtab*)(pVt
13d00 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29  abCursor->pVtab)
13d10 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
13d20 74 20 69 2c 20 6a 3b 0a 20 20 53 74 72 41 63 63  t i, j;.  StrAcc
13d30 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72 20 2a  um acc;.  char *
13d40 7a 53 71 6c 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  zSql;..  UNUSED_
13d50 50 41 52 41 4d 45 54 45 52 28 69 64 78 4e 75 6d  PARAMETER(idxNum
13d60 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
13d70 4d 45 54 45 52 28 69 64 78 53 74 72 29 3b 0a 20  METER(idxStr);. 
13d80 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   pragmaVtabCurso
13d90 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20  rClear(pCsr);.  
13da0 6a 20 3d 20 28 70 54 61 62 2d 3e 70 4e 61 6d 65  j = (pTab->pName
13db0 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61  ->mPragFlg & Pra
13dc0 67 46 6c 67 5f 52 65 73 75 6c 74 31 29 21 3d 30  gFlg_Result1)!=0
13dd0 20 3f 20 30 20 3a 20 31 3b 0a 20 20 66 6f 72 28   ? 0 : 1;.  for(
13de0 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
13df0 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  , j++){.    cons
13e00 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20  t char *zText = 
13e10 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
13e20 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
13e30 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 61 73  argv[i]);.    as
13e40 73 65 72 74 28 20 6a 3c 41 72 72 61 79 53 69 7a  sert( j<ArraySiz
13e50 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 20 29  e(pCsr->azArg) )
13e60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
13e70 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20  sr->azArg[j]==0 
13e80 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 78 74  );.    if( zText
13e90 20 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e   ){.      pCsr->
13ea0 61 7a 41 72 67 5b 6a 5d 20 3d 20 73 71 6c 69 74  azArg[j] = sqlit
13eb0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
13ec0 20 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 69   zText);.      i
13ed0 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a  f( pCsr->azArg[j
13ee0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
13ef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
13f00 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
13f10 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
13f20 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63  StrAccumInit(&ac
13f30 63 2c 20 30 2c 20 30 2c 20 30 2c 20 70 54 61 62  c, 0, 0, 0, pTab
13f40 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
13f50 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
13f60 4e 47 54 48 5d 29 3b 0a 20 20 73 71 6c 69 74 65  NGTH]);.  sqlite
13f70 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
13f80 26 61 63 63 2c 20 22 50 52 41 47 4d 41 20 22 29  &acc, "PRAGMA ")
13f90 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a  ;.  if( pCsr->az
13fa0 41 72 67 5b 31 5d 20 29 7b 0a 20 20 20 20 73 71  Arg[1] ){.    sq
13fb0 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
13fc0 66 28 26 61 63 63 2c 20 22 25 51 2e 22 2c 20 70  f(&acc, "%Q.", p
13fd0 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 29 3b 0a  Csr->azArg[1]);.
13fe0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74    }.  sqlite3_st
13ff0 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63  r_appendall(&acc
14000 2c 20 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 7a  , pTab->pName->z
14010 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 43 73  Name);.  if( pCs
14020 72 2d 3e 61 7a 41 72 67 5b 30 5d 20 29 7b 0a 20  r->azArg[0] ){. 
14030 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
14040 70 70 65 6e 64 66 28 26 61 63 63 2c 20 22 3d 25  ppendf(&acc, "=%
14050 51 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b  Q", pCsr->azArg[
14060 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20  0]);.  }.  zSql 
14070 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  = sqlite3StrAccu
14080 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20  mFinish(&acc);. 
14090 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72   if( zSql==0 ) r
140a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
140b0 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  EM;.  rc = sqlit
140c0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 54  e3_prepare_v2(pT
140d0 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  ab->db, zSql, -1
140e0 2c 20 26 70 43 73 72 2d 3e 70 50 72 61 67 6d 61  , &pCsr->pPragma
140f0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
14100 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66  free(zSql);.  if
14110 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14120 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 62 61 73  ){.    pTab->bas
14130 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  e.zErrMsg = sqli
14140 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
14150 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
14160 28 70 54 61 62 2d 3e 64 62 29 29 3b 0a 20 20 20  (pTab->db));.   
14170 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
14180 20 20 72 65 74 75 72 6e 20 70 72 61 67 6d 61 56    return pragmaV
14190 74 61 62 4e 65 78 74 28 70 56 74 61 62 43 75 72  tabNext(pVtabCur
141a0 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  sor);.}../*.** P
141b0 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
141c0 62 6c 65 20 6d 6f 64 75 6c 65 20 78 45 6f 66 20  ble module xEof 
141d0 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
141e0 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
141f0 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62  Eof(sqlite3_vtab
14200 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
14210 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56  rsor){.  PragmaV
14220 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20  tabCursor *pCsr 
14230 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  = (PragmaVtabCur
14240 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72  sor*)pVtabCursor
14250 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 43 73 72  ;.  return (pCsr
14260 2d 3e 70 50 72 61 67 6d 61 3d 3d 30 29 3b 0a 7d  ->pPragma==0);.}
14270 0a 0a 2f 2a 20 54 68 65 20 78 43 6f 6c 75 6d 6e  ../* The xColumn
14280 20 6d 65 74 68 6f 64 20 73 69 6d 70 6c 79 20 72   method simply r
14290 65 74 75 72 6e 73 20 74 68 65 20 63 6f 72 72 65  eturns the corre
142a0 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
142b0 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 50 52 41 47  from.** the PRAG
142c0 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  MA.  .*/.static 
142d0 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43 6f  int pragmaVtabCo
142e0 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  lumn(.  sqlite3_
142f0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
14300 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 73 71 6c  abCursor, .  sql
14310 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
14320 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b 0a 20  x, .  int i.){. 
14330 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   PragmaVtabCurso
14340 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d  r *pCsr = (Pragm
14350 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74  aVtabCursor*)pVt
14360 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72 61 67  abCursor;.  Prag
14370 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28  maVtab *pTab = (
14380 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70 56 74  PragmaVtab*)(pVt
14390 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29  abCursor->pVtab)
143a0 3b 0a 20 20 69 66 28 20 69 3c 70 54 61 62 2d 3e  ;.  if( i<pTab->
143b0 69 48 69 64 64 65 6e 20 29 7b 0a 20 20 20 20 73  iHidden ){.    s
143c0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
143d0 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65 33  lue(ctx, sqlite3
143e0 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43  _column_value(pC
143f0 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 69 29 29  sr->pPragma, i))
14400 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14410 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
14420 78 74 28 63 74 78 2c 20 70 43 73 72 2d 3e 61 7a  xt(ctx, pCsr->az
14430 41 72 67 5b 69 2d 70 54 61 62 2d 3e 69 48 69 64  Arg[i-pTab->iHid
14440 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54 45 5f 54  den],-1,SQLITE_T
14450 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20  RANSIENT);.  }. 
14460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14470 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61  K;.}../* .** Pra
14480 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
14490 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69 64 20  e module xRowid 
144a0 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
144b0 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
144c0 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74  Rowid(sqlite3_vt
144d0 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
144e0 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f 69  Cursor, sqlite_i
144f0 6e 74 36 34 20 2a 70 29 7b 0a 20 20 50 72 61 67  nt64 *p){.  Prag
14500 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
14510 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
14520 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
14530 73 6f 72 3b 0a 20 20 2a 70 20 3d 20 70 43 73 72  sor;.  *p = pCsr
14540 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75  ->iRowid;.  retu
14550 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14560 0a 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 76  ./* The pragma v
14570 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a  irtual table obj
14580 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ect */.static co
14590 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
145a0 6c 65 20 70 72 61 67 6d 61 56 74 61 62 4d 6f 64  le pragmaVtabMod
145b0 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20  ule = {.  0,    
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
145e0 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  on */.  0,      
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20       /* xCreate 
14610 2d 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  - create a table
14620 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
14630 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  Connect,        
14640 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d     /* xConnect -
14650 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e 20 65   connect to an e
14660 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f  xisting table */
14670 0a 20 20 70 72 61 67 6d 61 56 74 61 62 42 65 73  .  pragmaVtabBes
14680 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  tIndex,         
14690 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d 20  /* xBestIndex - 
146a0 44 65 74 65 72 6d 69 6e 65 20 73 65 61 72 63 68  Determine search
146b0 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 70   strategy */.  p
146c0 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f 6e 6e  ragmaVtabDisconn
146d0 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  ect,        /* x
146e0 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44 69 73  Disconnect - Dis
146f0 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61 20 74  connect from a t
14700 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  able */.  0,    
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14720 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72         /* xDestr
14730 6f 79 20 2d 20 44 72 6f 70 20 61 20 74 61 62 6c  oy - Drop a tabl
14740 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61  e */.  pragmaVta
14750 62 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  bOpen,          
14760 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f      /* xOpen - o
14770 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  pen a cursor */.
14780 20 20 70 72 61 67 6d 61 56 74 61 62 43 6c 6f 73    pragmaVtabClos
14790 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
147a0 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65  * xClose - close
147b0 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70   a cursor */.  p
147c0 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72 2c  ragmaVtabFilter,
147d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
147e0 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75  Filter - configu
147f0 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69  re scan constrai
14800 6e 74 73 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  nts */.  pragmaV
14810 74 61 62 4e 65 78 74 2c 20 20 20 20 20 20 20 20  tabNext,        
14820 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d        /* xNext -
14830 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f   advance a curso
14840 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61  r */.  pragmaVta
14850 62 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  bEof,           
14860 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20      /* xEof */. 
14870 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d   pragmaVtabColum
14880 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
14890 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20   xColumn - read 
148a0 64 61 74 61 20 2a 2f 0a 20 20 70 72 61 67 6d 61  data */.  pragma
148b0 56 74 61 62 52 6f 77 69 64 2c 20 20 20 20 20 20  VtabRowid,      
148c0 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64         /* xRowid
148d0 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
148e0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14900 2a 20 78 55 70 64 61 74 65 20 2d 20 77 72 69 74  * xUpdate - writ
14910 65 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20  e data */.  0,  
14920 20 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 2f 2a 20 78 42 65 67           /* xBeg
14940 69 6e 20 2d 20 62 65 67 69 6e 20 74 72 61 6e 73  in - begin trans
14950 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  action */.  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 2f 2a 20 78 53 79 6e           /* xSyn
14980 63 20 2d 20 73 79 6e 63 20 74 72 61 6e 73 61 63  c - sync transac
14990 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  tion */.  0,    
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149b0 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69         /* xCommi
149c0 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73  t - commit trans
149d0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  action */.  0,  
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c           /* xRol
14a00 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b  lback - rollback
14a10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
14a20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14a40 2a 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20  * xFindFunction 
14a50 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  - function overl
14a60 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 30 2c 20 20  oading */.  0,  
14a70 20 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 2f 2a 20 78 52 65 6e           /* xRen
14a90 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74 68 65  ame - rename the
14aa0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20   table */.  0,  
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61 76           /* xSav
14ad0 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20 20  epoint */.  0,  
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14af0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c           /* xRel
14b00 65 61 73 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  ease */.  0,    
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62         /* xRollb
14b30 61 63 6b 54 6f 20 2a 2f 0a 20 20 30 20 20 20 20  ackTo */.  0    
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 61 64          /* xShad
14b60 6f 77 4e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  owName */.};../*
14b70 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
14b80 20 69 66 20 7a 54 61 62 4e 61 6d 65 20 69 73 20   if zTabName is 
14b90 72 65 61 6c 6c 79 20 74 68 65 20 6e 61 6d 65 20  really the name 
14ba0 6f 66 20 61 20 70 72 61 67 6d 61 2e 20 20 49 66  of a pragma.  If
14bb0 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 65 6e 20   it is,.** then 
14bc0 72 65 67 69 73 74 65 72 20 61 6e 20 65 70 6f 6e  register an epon
14bd0 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
14be0 62 6c 65 20 66 6f 72 20 74 68 61 74 20 70 72 61  ble for that pra
14bf0 67 6d 61 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  gma and return.*
14c00 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
14c10 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a 65 63 74  he Module object
14c20 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 72   for the new vir
14c30 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 4d  tual table..*/.M
14c40 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65 33 50 72  odule *sqlite3Pr
14c50 61 67 6d 61 56 74 61 62 52 65 67 69 73 74 65 72  agmaVtabRegister
14c60 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
14c70 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
14c80 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61  {.  const Pragma
14c90 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a 20 20 61  Name *pName;.  a
14ca0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 73  ssert( sqlite3_s
14cb0 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22  trnicmp(zName, "
14cc0 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20  pragma_", 7)==0 
14cd0 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 70 72 61  );.  pName = pra
14ce0 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61 6d 65 2b  gmaLocate(zName+
14cf0 37 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d  7);.  if( pName=
14d00 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
14d10 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e 6d 50 72   if( (pName->mPr
14d20 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c 67  agFlg & (PragFlg
14d30 5f 52 65 73 75 6c 74 30 7c 50 72 61 67 46 6c 67  _Result0|PragFlg
14d40 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30 20 29 20  _Result1))==0 ) 
14d50 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
14d60 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46  rt( sqlite3HashF
14d70 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ind(&db->aModule
14d80 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a 20  , zName)==0 );. 
14d90 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
14da0 74 61 62 43 72 65 61 74 65 4d 6f 64 75 6c 65 28  tabCreateModule(
14db0 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 72 61 67  db, zName, &prag
14dc0 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c 20 28 76  maVtabModule, (v
14dd0 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30 29 3b 0a  oid*)pName, 0);.
14de0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
14df0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
14e00 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66  TABLE */..#endif
14e10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
14e20 50 52 41 47 4d 41 20 2a 2f 0a                    PRAGMA */.